Unity3D中音频信号谐波的幅度
Amplitude of audio signal harmonics in Unity3D
我已经成功地使用 GetSpectrumData 函数计算了从麦克风输入的音频的音调。但现在我需要得到音频的前 7 个谐波的振幅(项目要求)
我对音频 dsp 的了解很少。我唯一理解的是谐波是基频的倍数。但是我将如何获得谐波的幅度。
谢谢
首先您需要弄清楚您的基频在哪个 FFT bin 中。假设它位于 bin# 10 中。谐波将位于该 bin 的整数倍中,因此二次谐波将在 bin 20 中,第三次谐波在bin 30 等等。对于这些谐波箱中的每一个,您都需要计算振幅。根据您在 FFT 中使用的 window 函数,您需要在计算中包含少量的 bin(如果您感兴趣,则为 google 频谱泄漏)。
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);
}
正如我提到的 window 半长取决于 window。一些常见的是:
- 布莱克曼-哈里斯 3 - 3
- 布莱克曼-哈里斯 4 - 4
- 平顶 - 5
- 汉 - 3
我已经成功地使用 GetSpectrumData 函数计算了从麦克风输入的音频的音调。但现在我需要得到音频的前 7 个谐波的振幅(项目要求) 我对音频 dsp 的了解很少。我唯一理解的是谐波是基频的倍数。但是我将如何获得谐波的幅度。
谢谢
首先您需要弄清楚您的基频在哪个 FFT bin 中。假设它位于 bin# 10 中。谐波将位于该 bin 的整数倍中,因此二次谐波将在 bin 20 中,第三次谐波在bin 30 等等。对于这些谐波箱中的每一个,您都需要计算振幅。根据您在 FFT 中使用的 window 函数,您需要在计算中包含少量的 bin(如果您感兴趣,则为 google 频谱泄漏)。
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);
}
正如我提到的 window 半长取决于 window。一些常见的是:
- 布莱克曼-哈里斯 3 - 3
- 布莱克曼-哈里斯 4 - 4
- 平顶 - 5
- 汉 - 3