IFFT 後の虚数部のみでの競合の背後にある理由を知りたいと思っていました。
私の C/C++ 実装と Matlab 実装の両方で、次の同じ手順を実行しています。
- 私の信号xは次元Mx1であり、その信号に対してNポイントFFT ( N = 2* M ) を実行して、周波数ドメインでNポイント信号を取得します。
- この周波数領域信号にカスタマイズされたフィルターを適用します (実数部と虚数部の両方が段階的に変更されます)。
- 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')
ます。