9

入力データのブロックを取得し、それらを fftw に渡してスペクトル情報を取得します。すべてが機能しているように見えますが、エイリアシングの問題が発生していると思います。

データのブロックにハン ウィンドウを実装する方法を考え出そうとしています。グーグルは例として私を失敗させました。私が見るべきアイデアやリンクはありますか?

double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]

アップデート

私が実際に修正しようとしている問題を指摘してくれた Oli に感謝します。

4

6 に答える 6

28

http://en.wikipedia.org/wiki/Hann_function . 実装は、定義から非常に簡単に従います。関数を乗数として使用し、w(n)すべてのサンプルをループして (変更nしながら)、それだけです。

for (int i = 0; i < 2048; i++) {
    double multiplier = 0.5 * (1 - cos(2*PI*i/2047));
    dataOut[i] = multiplier * dataIn[i];
}
于 2010-08-24T10:13:47.377 に答える
4

あなたの質問への答えではなく、あなたの問題についての余談です。ウィンドウ処理は、エイリアシングの問題ではなく、スペクトルの漏れの問題を解決するのに役立ちます。

スペクトル漏れ効果は、波形の周波数成分がサンプル レートの正確な整数分数でない場合に発生します。

エイリアシングがある場合は、根本的に失敗しています。サンプル レートを上げるか、サンプルする前に (より良い) アンチエイリアシング フィルターを挿入する必要があります。

于 2010-08-24T10:34:58.927 に答える
2

ウィキペディアはあなたの友達です:ハニング ウィンドウ

確かにあなたのグーグルはウィキペディアを思いついた?! とにかく、長さ N の配列をハニング係数で返す関数を作成し、この配列に を掛けるだけdataIn[2048]です。

于 2010-08-24T10:12:36.943 に答える