0

好的,这里有很多问题,谷歌上有很多阅读材料,但我不知何故无法弄清楚。我想获得一段语音的基频。基本步骤应该是:

  • 取窗口信号的 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 附近的音频信号,并且峰值似乎再次反转。整个事情也相当嘈杂。我究竟做错了什么?

4

1 回答 1

0

对于倒谱,我一直习惯于这个步骤:

  1. 在信号中应用汉明窗(1024 或 2048 点)
  2. 应用 FFT
  3. 获取幅度
  4. 只使用前半部分的值
  5. 转换为对数刻度
  6. 申请IFFT
  7. 寻找高峰

倒谱方程:

 IFFT(log(abs(FFT(s))))

也许你看到反映是因为你没有得到第四步(4)

以IFFT结尾和以FFT结尾之间的区别是什么?

不同之处在于比例表示,如果您最终使用 FFT,您只需要提取真实信息,对于以下两个方程,您将获得相同的形状:

IFFT(log(abs(FFT(s)))) == real(FFT(log(abs(FFT(s)))))

从倒谱绘制示例:

对于IFFT(log(abs(FFT(s))))

在此处输入图像描述

对于real(FFT(log(abs(FFT(s)))))

在此处输入图像描述

这是一个倒谱示例,来自 440hz 中以 44100hz 采样的 4096 点正弦波

于 2014-12-09T15:06:27.473 回答