VS配置FFTW库及FFTW库lib生成

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;

}

测试结果:
在这里插入图片描述