FTW是世界范围内最有名的计算fft的库,平时熟悉的Origin及Matlab计算fft采用的也是fftw。fftw库支持计算一维及多维的任意长度数据,反正用就行了,毕竟人家成熟商业软件计算fft用的都是这个库,更多详情请查看其官网fftw库官网。
FFTW官网提供了源码及头文件、dll、def文件,一般我们需要根据def文件生成lib文件,也可以用源码+Cmake生成dll和lib文件。网上得到lib文件的方式基本都是根据vs自带的lib.exe将.def文件生成.lib文件。如下图所示(利用vs2017生成64位的fftw lib文件),将ide文件中的4个文件msobj140.dll、mspdb140.dll、mspdbcore.dll、mspdbsrv.exe复制到x64文件夹下,并且还要将三个以def为后缀名的fftw文件拷到该x64文件夹下,最后利用cmd进到x64文件下执行lib.exe,然后分别执行:
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3l-3.def
以生成lib文件,最后还要在VS里配置一下。
用这个方法,出现如下错误,提示不能加载mspdcore.dll文件,最后发现可能是版本不一致的问题。于是,后来便在网上找相同版本的dll文件,没找到,放弃。为了得到lib文件,后来又尝试了其他几种方法,例如利用32位的def生成lib+采用64位的dll文件、卸载vs重新安装vs2017,但都无果。今晚,和师兄聊天,得知他那有利用Cmake生成的lib文件,于是便拷了一份,最终结束lib的生成之路,并能成功运行。
最后,给出福利链接:链接:https://pan.baidu.com/s/1w5KTnsq6trzBX9zCbxENpw
提取码:7385
,里面有32位、64位的bin、lib、include文件,可以直接下载用,不用再自己生成lib文件。关于VS配置的问题,可以自行百度,末尾给出测试代码。
测试代码:
1 2 3 4 5 6 7 | #include <iostream> #include "fftw3.h" using namespace std; #define REAL 0 #define IMAG 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ```cpp int main() { const double PI = 3.14159265358979323846; const int L = 10000; double Fs = 500; double T = 1.0 / Fs; fftw_complex x[L]; fftw_complex y[L]; double time = 0.0; for (int i = 0; i < L; i++) { time = i * T; x[i][REAL] = 0.7*sin(2 * PI * 50 * time) + sin(2 * PI * 120 * time); x[i][IMAG] = 0; } fftw_plan plan = fftw_plan_dft_1d(L, x, y, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(plan); double *freq = new double[L]; double *Amp = new double[L]; cout<<"Freq"<< " " << "Amp"<< endl; int i = 0; freq[0] = 0; Amp[0] = sqrt(y[i][REAL] * y[i][REAL] + y[i][IMAG] * y[i][IMAG]) / L; cout << freq[0] << " " << Amp[0] << endl; for (int i = 1; i < L/2; i++) { freq[i] = i*Fs/L; Amp[i] = sqrt(y[i][REAL] * y[i][REAL] + y[i][IMAG] * y[i][IMAG])*2 / L; cout << freq[i] << " " << Amp[i] << endl; } freq[i] = Fs/2; Amp[i] = sqrt(y[L/2][REAL] * y[L/2][REAL] + y[L/2][IMAG] * y[L/2][IMAG]) / L; cout << freq[i] << " " << Amp[i] << endl; fftw_destroy_plan(plan); delete []freq; delete []Amp; } |
测试结果: