2016-08-23 246 views
2

我正在嘗試fftw與c + +。我想測試它的工作是否正確。我實施了一個簡單的fftw/C++計算fft錯誤,與matlab相比

ifft(fft(shift(data)) - data == 0 

測試,完全失敗。

測試數據是一個矩形函數,幅度和相位1.用於比較的matlab代碼完全適用於相同的測試。

最基本的問題是:我做錯了什麼?

這裏的matlab代碼(這也是使用fftw ...)FFTW DLL/.h是最新的。

data = zeros(1, 64); 
halfsize = numel(data)/2; 
data(halfsize-10:halfsize+10) = 1; 

phase = ones(size(data)); 
data = data.*exp(phase*sqrt(-1)); 

Ft = fft(fftshift(data)); 

original data fourier transform

在C++代碼(未完成)

std::vector<complex<double>,fftalloc<complex<double> > > data(N); 
std::vector<complex<double>,fftalloc<complex<double> > > dataFourier(N); 
... create data 
int nfft = data.size(); 
fftw_plan plan = fftw_plan_dft_1d(nfft,fftw_cast(&data[0]),fftw_cast(&dataFourier[0]), FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT); 
fftw_execute(plan); 
//fftw_execute_dft(plan, fftw_cast(&data[0]),fftw_cast(&dataFourier[0])); 
cout << dataFourier[0] << dataFourier.back() << endl; 

的輸出是完全不同的 C++ plots

第一復值是完全不同的最後

(59.8627,7.57324)(-4.00561,7.33222) 

而在MATLAB中它們是相似的。還相位完全不同:

11.3463 +17.6709i 10.8411 +13.7128i 

對於高N這些值是相同的(這裏N = 64)

+2

你爲什麼在時域使用fftshift?它被用於頻域。我知道這是一個常見的謬誤,但這並不正確。 http://de.mathworks.com/help/matlab/ref/fftshift.html Btw。 Matlab內部使用FFTW來計算DFT。 – ypnos

+0

我也建議你可能居中你的矩形函數(halfsize-9:halfsize + 10),並且我想補充一點,矩形函數由於它的不連續性而不是通過DFT轉換的正確函數。 – ypnos

+0

@Ynpos:我使用換檔,否則在f中的相位。域名是錯誤的。 –

回答

1

FFTW和Matlab不計算相同的事情。 From the FFTW tutorial

FFTW計算未標準化的DFT。因此,通過反向變換(或相反)計算前向 導致原始數組 縮小了n。有關DFT的定義,請參閱What FFTW Really Computes

+0

我知道,但這與我在這裏發佈的問題無關。縮放並不是我的問題。 fft是錯誤的,因此ifft也是錯誤的。 –