今天,雖然努力使我的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的一個怪癖,它不需要在輸入中鏡像數據,或者可能還有其他事情正在進行?