好的,这里有很多问题,谷歌上有很多阅读材料,但我不知何故无法弄清楚。我想获得一段语音的基频。基本步骤应该是:
- 取窗口信号的 FFT
- 将 FFT 从直角坐标转换为极坐标(这样您就可以获得幅度)
- 丢弃相位信息
- 取平方,然后是大小的每个 bin 的自然对数
- 再做一次 FFT(或者一些消息来源说取反 fft?)
以下是我在 AS3 中的实现方式:
var signal:Vector.<Number> = my1024PointSignal; // an audio signal 1024 samples long
var imx:Vector.<Number> = new Vector.<Number>(signal.length); // 1024 point vector to hold imaginary part of fft
hammingWindow(signal); // window it
zeroFill(imx); // fill imx with zeros
FFT(signal, imx); // convert signal into real and imaginary components of fft
toPolar(signal, imx); // convert fft to polar coordinates
// square each bin, and take the log of each bin, discard phase
for (var i:int = 0, l:int = signal.length; i < l; i++) {
signal[i] = Math.log(Math.pow(signal[i], 2));
imx[i] = 0;
}
FFT(signal, imx); // or maybe inverseFFT(signal, imx), i don't know
现在,当我这样做并以 FFT 结束时,当我绘制它时,这些垃圾箱似乎是相反的顺序?我还看到二次谐波的峰值比基频的峰值更大。当我这样做并进行逆 FFT 时,我得到一个看起来反射在 N/2 附近的音频信号,并且峰值似乎再次反转。整个事情也相当嘈杂。我究竟做错了什么?