You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实时基音检测图表:如何避免绘图降至或始于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:37