2011-10-20 116 views
1

今天,雖然努力使我的C++代碼(使用Ooura FFT庫)給出與Matlab相同的結果,但我終於發現了一個問題和解決方案。Ooura反傅里葉變換的差異來自Matlab ifft

在Matlab中計算幅度 - 頻率響應的網格反向係數以下面的方式完成(代碼片段從Matlab的內部FIR2()函數):作爲結果

%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 

我們回到16384米倉,後半部分可以扔掉,但後半部分可以用作FIR係數。

但是,如果我使用Real DFT RDFT()函數做相同的Ooura,我得到它創造所產生的AFR鏡面效果係數,在AFR情節的所有頻率由2

如此大的分歧有一個想法出現在我身上:在我的C++代碼中,我使H的兩倍大(16384分),並用頻率數據填充它們而沒有鏡像。瞧!它的工作,現在我得到了16384點,扔掉8192點之後的所有東西,現在AFR與Matlab的匹配。

我確信所有標準的FFT實現都需要這種鏡像。這只是Ooura的一個怪癖,它不需要在輸入中鏡像數據,或者可能還有其他事情正在進行?

回答

1

「真實」的FFT通常會自動使用輸入的複共軛作爲鏡像值來進行內部鏡像。標準的FFT/IFFT不這樣做,因爲它具有兩倍的自由度(例如,產生一個複數輸出或來自IFFT的一個複數域濾波器)的FFT/IFFT實現被約束爲僅實數輸出。

FFT的頻率步長由其長度控制。與原始試驗相同,長度的一半會產生一半的頻率步長。