1

我已经设法使用 GetSpectrumData 函数计算了来自麦克风的音频输入的音高。但是现在我需要获取音频前 7 个谐波的幅度(项目要求)我对音频 dsp 的了解非常少。我唯一理解的是谐波是基频的倍数。但是我将如何获得谐波的幅度。

谢谢

4

1 回答 1

1

首先,您需要确定您的基频在哪个 FFT bin 中。假设它位于 bin#10 中。谐波将驻留在该 bin 的整数倍中,因此第二次谐波将在 bin 20 中,第三次在 bin 30 中,依此类推. 对于这些谐波箱中的每一个,您都需要计算幅度。根据您在 FFT 中使用的窗口函数,您需要在计算中包含少量的 bin(如果您有兴趣,请使用谷歌光谱泄漏)。

double computeAmpl(double[] spectrum, int windowHalfLen, int peakBin, int harmonic)
{
    double sumOfSquares = 0.0;
    for (int bin = peakBin-windowHalfLen; bin <= peakBin+windowHalfLen; bin++)
    {
        sumOfSquares += spectrum[bin] * spectrum[bin];
    }
    return sqrt(sumOfSquares);
}

正如我提到的,窗口的一半长度取决于窗口。一些常见的有:

  • 布莱克曼哈里斯 3 - 3
  • 布莱克曼哈里斯 4 - 4
  • 平顶 - 5
  • 汉恩 - 3
于 2017-03-03T19:28:54.687 回答