0

わかりました、ここにはたくさんの質問があり、グーグルにはたくさんの読み物がありますが、どういうわけかこれを理解することができません. 音声セグメントの基本周波数を取得したい。基本的な手順は次のとおりです。

  • ウィンドウ処理された信号の FFT を取る
  • FFT を直角座標から極座標に変換します (マグニチュードを取得できます)。
  • フェーズ情報を破棄します
  • 二乗してから、大きさの各ビンの自然対数を取る
  • 別の 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を取得して終了すると、プロットするとビンが逆の順序になっているように見えますか? また、基本波よりも 2 次高調波に大きなピークが見られます。これを行って逆 FFT を実行すると、N/2 付近で反射されたように見えるオーディオ信号が得られ、再びピークが反転しているように見えます。全体もかなりうるさいです。私は何を間違っていますか?

4

1 に答える 1

0

ケプストラムの場合、私は常にこの手順に慣れています:

  1. 信号にハミング ウィンドウを適用する (1024 または 2048 ポイント)
  2. FFT を適用
  3. マグニチュードを取得する
  4. 前半の値のみを使用する
  5. 対数スケールに変換
  6. IFFT を適用する
  7. ピークを見つける

ケプストラムの式:

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

ステップ 4(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))))):

ここに画像の説明を入力

これは、44100hz でサンプリングされた 440hz の 4096 ポイントのサインからのケプストラムの例です。

于 2014-12-09T15:06:27.473 に答える