我正在尝试使用 C++ 进行 fftw 。我想测试一下它是否正常工作。我实现了一个简单的
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));
在 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;
The output is completely different
第一个复数值与最后一个完全不同
(59.8627,7.57324)(-4.00561,7.33222)
而在 matlab 中它们是相似的。而且阶段也完全不同:
11.3463 +17.6709i 10.8411 +13.7128i
对于较高的 N,这些值是相同的(此处 N = 64)