当前位置: 首页 > 工具软件 > PlanOut > 使用案例 >

fftw_plan_many_dft 使用

魏元白
2023-12-01


前言

同时使用FFTW处理多组数据时,比如对一个N行M列的矩阵同时做N个FFT,可以使用 fftw_plan_many_dft 函数。


一、fftw_plan_many_dft相关参考资料

官方 fftw文档 对函数的参数做了介绍,并且给了例子。不过我刚开始也是看的似懂非懂。后面在CSDN看到了一篇文章fftw3:fftw_plan_many_dft_r2c 同时处理多组fft。对其中的一些参数做了简单的翻译。
并且给了一个例子,不过例子中输入是float数组,输出是复数数组。
而且有个重要的事情没有讲到,就是输入数据的排列。

二、例子

我这边直接给出一个例子

int real_data_length = 2048; //单信号长度
int fft_rank=1; //1维fft
int fft_col = real_data_length;  //单信号长度
int fft_row = 2; //同时做两个信号的FFT
fftwf_complex *fftw_in =(fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*fft_row*fft_col); //申请内存
fftwf_complex *fftw_out =(fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*fft_row*fft_col);
fftwf_plan planer_arr =fftwf_plan_many_dft(fft_rank,&fft_col,fft_row,fftw_in,NULL,fft_row,1,fftw_out,NULL,fft_row,1,FFTW_FORWARD,FFTW_ESTIMATE);
//上边相当于istride=2, int idist=1,表示输入的两个信号交错排列成一个向量作为输入
for(int i=0;i<fft_length;i++){
	in1[i][0]=1;  //输入信号1实部I
	in1[i][1]=1;  //输入信号1虚部Q
	in2[i][0]=1;  //输入信号2实部I
	in2[i][1]=1;  //输入信号2虚部Q
}

//给出一个关于上述信号排列的matlab代码
//StackOverflow 上关于这个[数据排列问题](https://stackoverflow.com/questions/6021740/how-do-i-use-fftw-plan-many-dft-on-a-transposed-array-of-data)也讨论过
/*
istride = 2;
idist = 1;
for k=1:2
  for j=1:256
    data_index(k,j) = j*istride + k*idist;
  end
end
*/

//将两个信号排列成一个信号,注意上边设置了istride=2, int idist=1,这里要交错排列
for(int i=0;i<fft_length;i++){
    fftw_in[2*i][0]=in1[i][0];
    fftw_in[2*i][1]=in1[i][1];
    fftw_in[2*i+1][0]=in2[i][0];
    fftw_in[2*i+1][1]=in2[i][1];
}

fftwf_execute(planer_arr); //执行FFT变换

//记得释放内存,销毁句柄
fftwf_free(in1);
fftwf_free(in2);
fftwf_free(fftw_in);
fftwf_free(fftw_out);
fftwf_destroy_plan(planer_arr);


总结

主要还是数据排列的问题容易踩坑,这点需要注意一下,另外CUFFT的用法跟这个差不多。

 类似资料: