如何执行倒谱检测音高

时间:2014-12-09 04:05:37

标签: signal-processing fft pitch-tracking pitch-detection

好的,这里有很多问题,谷歌上有很多阅读材料,但我不知道怎么回事。我想得到一段语音的基本频率。基本步骤应该是:

  • 采用窗口信号的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周围的音频信号,并且峰值似乎也是相反的。整件事情也很吵。我做错了什么?

1 个答案:

答案 0 :(得分:0)

对于倒谱我总是习惯这个步骤:

  1. 在信号中应用汉明窗(1024或2048点)
  2. 应用FFT
  3. 获得数量
  4. 仅使用前半部分值
  5. 转换为对数刻度
  6. 申请IFFT
  7. 找到峰值
  8. 倒谱的等式:

     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))))

    enter image description here

    real(FFT(log(abs(FFT(s)))))

    enter image description here

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