わかりました、ここにはたくさんの質問があり、グーグルにはたくさんの読み物がありますが、どういうわけかこれを理解することができません. 音声セグメントの基本周波数を取得したい。基本的な手順は次のとおりです。
- ウィンドウ処理された信号の 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 付近で反射されたように見えるオーディオ信号が得られ、再びピークが反転しているように見えます。全体もかなりうるさいです。私は何を間違っていますか?