1

IFFT 後の虚数部のみでの競合の背後にある理由を知りたいと思っていました。

私の C/C++ 実装と Matlab 実装の両方で、次の同じ手順を実行しています。

  1. 私の信号xは次元Mx1であり、その信号に対してNポイントFFT ( N = 2* M ) を実行して、周波数ドメインでNポイント信号を取得します。
  2. この周波数領域信号にカスタマイズされたフィルターを適用します (実数部と虚数部の両方が段階的に変更されます)。
  3. N点逆 FFTで実行します。

C/C++ と Matlab の両方の実装は、逆 IFFT ステップの後、虚部は一致しませんが、実部は一致することを除いて、まったく同じ結果を生成します。

上記のステップ 2 をスキップすると、両方の実装の IFFT 出力は問題なく一致します。IFFT への入力信号 (つまり、step2 フィルターの後) が共役対称である必要がないことが意図されています。実際、この信号はエルミート/対称ではない場合さえあります。

smbFft現在、このCPP-FILEで利用可能な関数として定義されている FFT/IFFT の C 実装を使用しています。

手がかりはありますか、なぜこれが起こっているのでしょうか?

PS: 対応する Matlab の実装と正確に一致する C/C++ での FFT の実装を誰かが教えてくれれば、それは素晴らしいことです。

ありがとう。

編集:(smbFfT上記で述べた)代わりにFFTWの実装をテストしました。FFTW 実装にも同じ問題があり、これらのテスト済み C 実装の両方がエルミート対称設定で IFFT を実行することを示唆しています。Matlab で行うのと同じ IFFT を C で実行する必要がありIFFT(..., 'nonsymmetric')ます。

4

1 に答える 1

1

厳密に実数の結果 (虚数部がすべてゼロに等しい) が必要な場合は、IFFT の前に、ベクトルを正確に共役対称にする必要があります (実数部はミラーリングされ、虚数部は逆ミラーリングされます)。

Matlab と C では、配列のインデックス 0 または 1 の扱いが異なります。フィルターもそれを考慮に入れていることを確認してください。

于 2013-11-08T20:16:38.197 に答える