我正在尝试在Armadillo包的矩阵中使用FFTW。我需要在2D矩阵上执行N个独立FFT。按照FFTW手册和其他在线资源,我有以下代码:
#include <armadillo>
#include <iostream>
#include "fftw3.h"
using namespace std;
using namespace arma;
fftw_plan fplan;
int main(int argc, char *argv[])
{
cx_mat psi;
int NCOL=2, NROW=4;
int frank=1;
int howmany=NCOL;
int n[]={NROW};
int idist=NROW, odist=NROW;
int istride=1, ostride=1;
int *inembed=n, *onembed=n;
psi.resize(NROW, NCOL);
psi(0,0)=cx_double(1,1); psi(0,1)=cx_double(1,1);
psi(1,0)=cx_double(2,1); psi(1,1)=cx_double(1,2);
psi(2,0)=cx_double(3,1); psi(2,1)=cx_double(1,3);
psi(3,0)=cx_double(4,1); psi(3,1)=cx_double(1,4);
cout << psi << endl; // the output is correct at here
fftw_complex* in = reinterpret_cast<fftw_complex*>(psi.memptr());
fplan = fftw_plan_many_dft(frank, n, howmany,
in, inembed, istride, idist,
in, onembed, ostride, odist,
FFTW_FORWARD, FFTW_MEASURE);
cout << endl << "after fftw plan: " << endl << psi << endl; // all zeros
// fftw_execute(fplan); // output zeros again if execute
cx_double* A_mem=psi.memptr();
cout << endl << "by reference: " << endl << *A_mem << " " << *(A_mem+1) << endl;
return 0;
}
代码编译没有任何错误。但是如果我运行代码,在fftw_plan_many_dft之后,它会输出所有的零。如果我删除fftw_plan_many_dft,输出是正确的。我甚至没有执行fftw计划,所以为什么只是通过设置计划来清理我的数据?
答案 0 :(得分:1)
使用FFTW_MEASURE
标志,缓冲区实际上用于调整FFT算法。您应该首先创建计划,然后初始化输入数据。
请注意,FFTW_ESTIMATE
不会出现此行为,因此您也可以在当前代码中更改此标志以解决问题,但随后您的代码可能会运行得更慢。 / p>