2016-08-23 250 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也是错误的。 –