我正在尝试使用C++进行fftw。我想测试它是否正确。我实现了一个简单的

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

测试,那完全失败了。

testdata是一个rect函数,具有幅度和相位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++ - 与Matlab相比,fftw/c++计算fft错误-LMLPHP
c++ - 与Matlab相比,fftw/c++计算fft错误-LMLPHP

在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&#43;&#43; - 与Matlab相比,fftw/c&#43;&#43;计算fft错误-LMLPHP

第一个复数值与最后一个完全不同
(59.8627,7.57324)(-4.00561,7.33222)

而在matlab中,它们是相似的。阶段也完全不同:
11.3463 +17.6709i  10.8411 +13.7128i

对于更高的N,这些值是相同的(此处N = 64)

最佳答案

FFTW和Matlab的计算结果不同。从the FFTW tutorial:

关于c++ - 与Matlab相比,fftw/c++计算fft错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39109615/

10-15 04:44