实时基音检测图表:如何避免绘图降至或始于Y=0
解决GraphView实时基音图表不显示Y=0线条的问题
我明白你想要实现的效果——让GraphView的蓝色线条只在基音值有效(不为0)的时候绘制,一旦基音降到0就停止添加数据点,彻底避免线条落到Y=0或者从0开始的情况。咱们来调整你的代码解决这个问题:
原代码的核心问题
你的现有代码已经做了y!=0的判断,但可能存在两个小问题:一是没有考虑浮点精度导致的极小值干扰,二是时间戳的复用可能让数据点重叠。我们针对性优化:
修改后的代码
public void generateData(float[] pitch, double rms) { // 遍历pitch数组,注意:原代码i +=1000的步长如果过大,可能会丢失关键数据,建议根据你的采样率调整 for (int i = 0; i < pitch.length; i += 1000) { double y = (double) pitch[i]; Log.d("Pitch", String.valueOf(y)); // 1. 只保留大于0的有效基音值,还可以加阈值过滤浮点误差 // 比如如果是浮点精度问题,用 y > 0.01 替代 y > 0 if (y > 0) { // 2. 每个数据点使用当前的时间戳,避免点重叠 double currentTime = System.currentTimeMillis() - startTime; // 若需要结合rms判断有效声音,可取消下面的注释 // if (rms >= 2) { series.appendData(new DataPoint(currentTime, y), true, 40); // } } // 当y=0时,不执行任何添加操作,线条自然不会延伸到Y=0 } }
关键优化点说明
- 过滤Y=0的无效值:通过
y > 0(或带阈值的y > 0.01)直接跳过所有基音为0的情况,完全不向图表添加这类数据点,从根源避免线条接触Y轴0点。 - 独立时间戳:把时间戳的计算放到循环内部,确保每个有效基音点都对应唯一的时间,避免多个点挤在同一个时间位置导致的图表异常。
- 可选的阈值过滤:如果你的基音检测存在浮点精度问题(比如偶尔出现极小的接近0的数值),设置一个小阈值(如0.01)可以让线条更干净,只保留真正有效的基音数据。
这样调整后,你的GraphView蓝色线条只会在基音有效时绘制,一旦基音降到0就停止添加新点,完全不会出现线条落到Y=0或者从0开始的情况。
内容的提问来源于stack exchange,提问作者novice_audio
相关产品推荐
相关产品推荐

