目录
官网网址:http://www.fftw.org/
这个已经能正常使用,不会继续研究了,这个FFTW只给预编译版本,没法学习源代码。且商用还需要花钱购买许可。
如果需要我已经移植好的源码,见如下链接:
扫描二维码关注公众号,回复: 9817358 查看本文章
一、FFTW简介(官网翻译)
FFTW(The Fastest Fourier Transform in the West)是一个计算一维或者多维DFT(the discrete Fourier transform)的c程序子库,支持任意输入长度,可以是实数或者复数数据。官方当前版本最新是3.3.8(截至2019年8月1日)。
作者是MIT的博士生Matteo Frigo(wiki:https://www.chessprogramming.org/Matteo_Frigo)
和Steven G. Johnson(wiki:https://en.wikipedia.org/wiki/Steven_G._Johnson,个人主页:http://math.mit.edu/~stevenj/)。
软件的基准是:工作在各种平台上且效果优于其他典型的FFT软件,与vendor-tuned codes也有得一拼(可能是另一种FFT软件)且FFTW是可移植的,不需修改就能在其他架构上直接使用,而vendor-tuned codes不行。
二、软件特点(官网翻译)
1.速度快;
2.支持一维和多维变换;
3.支持任意输入长度变换;
4.纯实数输入输出时能快速变换;
5.支持实数奇偶输入数据变换(不太懂);he discrete cosine transform (DCT) and the discrete sine transform (DST)
6.高效处理多个或者多步变换,如一次性处理多个需要变换的数据列,变换多维数据的某一维,变换多部分向量的某一部分;
7.并行变换,只对支持多线程的机器有效;
8.对使用C编译器的平台都是可移植的;
9.开源协议为:GPL。
PS:这个开源的软件没有开源源码,只有预编译版本的文件。也就是只能用,不能学习。且如果商用的话,还得花钱买许可。有点背离我使用它的初衷了,这里将VS2015下使用以及QT中使用的方法写出来,然后果断换一个有源码的库。
三、资源信息
说明文档:http://www.fftw.org/fftw3.pdf
问题和回答:http://www.fftw.org/faq/
和其他FFT算法的速度比较:http://www.fftw.org/speed/。点击机器型号就能看到在该机器下的算法速度比较;
和其他FFT算法的准确度比较:http://www.fftw.org/accuracy/
对作者的采访:https://www.rce-cast.com/Podcast/rce-73-fftw-fastest-fourier-transform-in-the-west.html
访谈在b站:https://www.bilibili.com/video/av61715568/
下载页面:http://www.fftw.org/download.html
四、VS2015下的FFTW库使用
这个fftw库在windows下的编译真的好复杂,老是出错。这里介绍一下成功在vs2015中编译x86和x64平台测试成功的经验,以及使用qt平台编译成功的经验
(首先是x86版本)
1.下载32位的预编译代码并解压该zip文件
2.使用vs2015的x86命令提示操作生成lib文件
lib文件有三种精度的,这里我们把它全部生成出来
3.拷贝3种精度的dll文件到C:\Windows\SysWOW64下
4.新建vs2015的c++工程
5.将解压并生成了lib文件的文件夹拷贝到工程目录下
6.导入头文件fftw3.h并新建测试代码
测试代码如下:
#pragma comment(lib, "D:\\qt4.8.0\\userfile\\cplusfile\\Project3\\fftw-3.3.5-dll32\\libfftw3-3.lib")
#pragma comment(lib, "D:\\qt4.8.0\\userfile\\cplusfile\\Project3\\fftw-3.3.5-dll32\\libfftw3f-3.lib")
#pragma comment(lib, "D:\\qt4.8.0\\userfile\\cplusfile\\Project3\\fftw-3.3.5-dll32\\libfftw3l-3.lib")
#include <stdio.h>
#include <stdlib.h>
#include <fftw3.h>
#define N 5
int main()
{
fftw_complex *in, *out;
fftw_plan p;
in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
int n;
for (n = 0; n < N; n++)
{
in[n][0] = 1;
in[n][1] = 2;
}
fftw_execute(p);
fftw_destroy_plan(p);
for (n = 0; n < N; n++)
{
printf("%3.2lf+%3.2lfi ", out[n][0], out[n][1]);
}
printf("\n");
fftw_free(in); fftw_free(out);
system("pause");
return 0;
}
7.进行lib文件的路径设置
8.当你自己使用时,需要改lib文件的路径
9.最终运行成功的标志
(然后是x64版本)
区别1:下载并使用64位的zip文件。
区别2:使用vs2015的x64命令提示符工具生成lib文件
区别3:vs2015的工程需要使用x64平台,然后修改lib文件路径
其他的同x86平台下的操作。
五、Qt版本下的移植
我使用的qt版本如下:
昨天加今天上午一直搞不好,结果自从使用vs2015成功移植32位的fftw库后,下午非常快地成功了。前期对于下载的x64zip文件的处理都是相同的,主要是需要在qt中添加dll和lib文件。
1.下载x64fftw的zip文件并解压,然后与前面使用vs2015添加x64的fftw库一样生成lib文件
生成的指令需要指定位x64的机器,如下:
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3l-3.def
2.新建一个qt的纯c++项目
需要注意的是,选择Mingw,而非msvc2015(我还没测试过)。
3.将下载解压以及生成了lib文件的的fftw库文件夹拷贝到工程目录下,并导入头文件fftw3.h
4.将dll文件拷贝到C:\Windows\System32
lib文件和dll文件都是需要的,如果不放在该目录下,也需要在pro中指示dll文件路径
或者在工程的debug目录下放dll文件
5.编写测试代码
#include <iostream>
#include "fftw-3.3.5-dll64/fftw3.h"
#include <stdlib.h>
#include <stdio.h>
#define N 5
using namespace std;
int main()
{
fftw_complex *in, *out;
fftw_plan p;
in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
int n;
for (n = 0; n < N; n++)
{
in[n][0] = 1;
in[n][1] = 2;
}
fftw_execute(p);
fftw_destroy_plan(p);
for (n = 0; n < N; n++)
{
printf("%3.2lf+%3.2lfi ", out[n][0], out[n][1]);
}
printf("\n");
fftw_free(in);
fftw_free(out);
return 0;
}
6.在pro文件中添加lib库
7.运行的结果如下图说明成功