FFTW是C语言的FFT库,之前用matlab想跑一个FFT ,因为频率很高,结果发现频谱分析如果要达到1Hz的分辨率,信号的时间是1s,采样率上M,导致数据点很多,matlab完全跑不过来了,于是折腾了几天,用上了FFTW,这个库似乎支持任意信号长度,跑起来果然快太多。
官网: http://www.fftw.org/
我是win7 64位,也没看网上的怎么配置,直接解压了 fftw-3.3.3-dll32,然后就在这个文件夹里写代码了,反正只是试试而已。
其实很简单,只列出几个主要函数了。
fftw3 里有个 ffw_real 实际就是double,所以我直接用double了。
#include "fftw3.h"
#define PI 3.14159
double *in;
fftw_complex *out;
fftw_plan p;
in = (double*) fftw_malloc(sizeof(double) * N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
for(i=0;i<N;i++)
in[i]=3*sin(2*PI*2.4*((double)i)/N*2);
p=fftw_plan_dft_r2c_1d(N,in,out,FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed*/
fp=fopen("out.txt","w+");
for(j = 0;freqOut < saveDataFreq ;j++)
{
freq=((double)j)/N;
mag=sqrt(pow(out[j][0],2)+pow(out[j][1],2))*2/N;
fprintf(fp,"%6.2lf %6.2lf\n",freq,mag);
// printf("%6.2f ",out[j][0]);
}
fclose(fp);
fftw_destroy_plan(p);
//fftw_free(in);
free(in);
fftw_free(out);
return 0;
}