我设法使用GetSpectrumData函数计算麦克风输入音频的音高。但现在我需要获得前7个音频谐波的幅度(项目要求) 我对Audio dsp知之甚少。我唯一理解的是谐波是基频的倍数。但是我如何获得谐波的幅度。
由于
答案 0 :(得分:1)
首先你要弄清楚你的基频是哪个FFT bin。假设它位于bin#10中。谐波将位于该bin的整数倍中,因此二次谐波将在bin 20中,3rd在bin 30中等等。对于每个谐波箱,您需要计算振幅。根据您在FFT中使用的窗口函数,您需要在计算中包含少量的二进制位(如果您感兴趣,可以使用谷歌频谱泄漏)。
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);
}
正如我所提到的,窗户的长度取决于窗户。一些常见的是: