我已经设法使用 GetSpectrumData 函数计算了来自麦克风的音频输入的音高。但是现在我需要获取音频前 7 个谐波的幅度(项目要求)我对音频 dsp 的了解非常少。我唯一理解的是谐波是基频的倍数。但是我将如何获得谐波的幅度。
谢谢
我已经设法使用 GetSpectrumData 函数计算了来自麦克风的音频输入的音高。但是现在我需要获取音频前 7 个谐波的幅度(项目要求)我对音频 dsp 的了解非常少。我唯一理解的是谐波是基频的倍数。但是我将如何获得谐波的幅度。
谢谢
首先,您需要确定您的基频在哪个 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);
}
正如我提到的,窗口的一半长度取决于窗口。一些常见的有: