我正在使用 ACF 和 AMDF 的组合进行音高检测。
首先,我在时域中使用 ACF,如下所示:
Get a buffer of 2048 samples
Window it (Hamming window)
sum=Sum(Buffer[i]*Buffer[i+lag]) for all i < 2048 - lag
acf = sum / 2048
并对要考虑的所有滞后重复最后 2 个步骤。(实际上是对非整数滞后进行插值)
现在我发现你可以使用 FFT 来计算 ACF:
Get a buffer of 2048 samples
Window it (Hamming window)
fftBuf=fft(buffer)
buffer[i]=real(fftBuf[i])^2+imag(fftBuf[i])^2
fftBuf=fft(buffer) //ifft=fft for real signals
acfBuf = real(fftBuf) / 2048
然后 actBuf[lag] 是该滞后的 ACF 值。
我预计结果将相同或至少相似。但他们不是。例如,对于 65.4Hz 正弦波(注意 C2),我使用时域方法得到 ~0.2,对应的滞后为 674.25,使用 fft 得到 ~536.795。
我错过了什么?还是两者都不一样?