2011-10-20 11 views
1

今日、Matlabと同じ結果を得るためにC++コード(Ooura FFTライブラリを使用)を作成するのに苦労しながら、私はついに問題と解決策を見つけました。 MATLABでOoura逆FFTの違いがMatlab ifft

振幅 - 周波数応答は、以下の方法(MATLABの内部fir2は()関数からのコード断片)で行われるのグリッドの逆係数計算:我々はバック16384個のビンを得る結果として

%H contains 8192 points of AFR data 
Hconj = [H conj(H(npt-1:-1:2))]; % Fourier transform of real series 
ht = real(ifft(Hconj));   % Symmetric real series 

を後半は投げ捨てることができますが、前半は後でFIR係数として使用できます。

しかし、私は実質DFT RDFT()関数を使用して、大浦で同じことを行うならば、私は結果のAFRにミラー効果を作成する係数を取得し、AFRプロット上のすべての周波数は、だから、2

によって分割されています私のC++コードでは、Hを2倍(16384ポイント)作成し、ミラーリングせずに周波数データをすべて埋めました。そしてボイル!それは働いた、今私は16384ポイントを持って、8192ポイントの後にすべてを捨てて、今結果AFRはMatlabに一致します。

すべての標準FFT実装でこのミラーリングが必要であると確信しました。それは入力でミラーリングデータを必要としない、または何か他のことが起こっているかもしれないというOouraのちょっとした変わったものですか?

答えて

1

「実際の」FFTは、ミラー化された値の入力の複素共役を自動的に使用することで内部的にミラーリングを行うことがよくあります。標準FFT/IFFTは、実数のみの出力に制約されたFFT/IFFT実装の2倍の自由度(例えば、複素出力またはIFFTからの複素領域フィルタを生成するなど)を有するため、これを行わない。

FFTの周波数ビンステップサイズは、その長さによって制御されます。長さの半分は元のトライアルの場合と同様に、周波数ステップサイズの半分になります。