1. FFTW库的介绍
FFTW库是用于一维或多维快速傅里叶变换(FFT)的C函数库。
2. FFTW库在Windows中的安装和使用
2.1 下载FFTW 3.3.5版本
Windows 64位平台下载:FFTW Installation on Windows
2.2 预编译
将2.1中下载的压缩包解压;
打开VS的"x64 Native Tools Command Prompt for VS 2022"工具;
用该工具进入到解压的文件夹下,依次运行如下命令:
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
如下图所示:
2.3 配置VS项目
打开Visual Studio,创建项目;
通过上方项目→属性,打开项目的属性页:
1. 在配置属性→C/C++→常规中的附加包含目录加入解压的FFTW文件夹的路径。(本质是将头文件fftw3.h的路径加入项目);
2. 在配置属性→链接器→常规中的附加库目录加入FFTW文件夹的路径。(本质是将lib库的路径加入项目);
3. 在配置属性→链接器→输入中的附加依赖项中追加FFTW文件夹中如下lib库文件的名字。
4. 在VS中右击项目,打开创建的VS项目文件夹的路径,将FFTW文件夹中如下的动态库文件直接拷贝到VS项目文件夹中。
FFTW文件夹中如下这三个动态库文件,
拷贝至如下VS项目文件夹中:
3. 编码测试
代码如下:
#include "fftw3.h"
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int main() {
double array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double* out;
double* err;
int i, size = 10;
fftw_complex* out_cpx;
fftw_plan fft;
fftw_plan ifft;
out_cpx = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * size);
out = (double*)malloc(size * sizeof(double));
if (out == NULL) {
exit(1);
}
err = (double*)malloc(size * sizeof(double));
if (err == NULL) {
exit(1);
}
fft = fftw_plan_dft_r2c_1d(size, array, out_cpx, FFTW_ESTIMATE); //Setup fftw plan for fft
ifft = fftw_plan_dft_c2r_1d(size, out_cpx, out, FFTW_ESTIMATE); //Setup fftw plan for ifft
fftw_execute(fft);
fftw_execute(ifft);
for (i = 0; i < size; i++) {
err[i] = (array[i] - out[i]);
printf("%f\t%f\n", (array[i]), out[i] / size);//需要做归一化处理
}
fftw_destroy_plan(fft);
fftw_destroy_plan(ifft);
fftw_free(out_cpx);
free(err);
free(out);
system("pause");
return 0;
}
运行结果:
成功。
1. FFTW库的介绍
FFTW库是用于一维或多维快速傅里叶变换(FFT)的C函数库。
2. FFTW库在Windows中的安装和使用
2.1 下载FFTW 3.3.5版本
Windows 64位平台下载:FFTW Installation on Windows
2.2 预编译
将2.1中下载的压缩包解压;
打开VS的"x64 Native Tools Command Prompt for VS 2022"工具;
用该工具进入到解压的文件夹下,依次运行如下命令:
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
如下图所示:
2.3 配置VS项目
打开Visual Studio,创建项目;
通过上方项目→属性,打开项目的属性页:
1. 在配置属性→C/C++→常规中的附加包含目录加入解压的FFTW文件夹的路径。(本质是将头文件fftw3.h的路径加入项目);
2. 在配置属性→链接器→常规中的附加库目录加入FFTW文件夹的路径。(本质是将lib库的路径加入项目);
3. 在配置属性→链接器→输入中的附加依赖项中追加FFTW文件夹中如下lib库文件的名字。
4. 在VS中右击项目,打开创建的VS项目文件夹的路径,将FFTW文件夹中如下的动态库文件直接拷贝到VS项目文件夹中。
FFTW文件夹中如下这三个动态库文件,
拷贝至如下VS项目文件夹中:
3. 编码测试
代码如下:
#include "fftw3.h"
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int main() {
double array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double* out;
double* err;
int i, size = 10;
fftw_complex* out_cpx;
fftw_plan fft;
fftw_plan ifft;
out_cpx = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * size);
out = (double*)malloc(size * sizeof(double));
if (out == NULL) {
exit(1);
}
err = (double*)malloc(size * sizeof(double));
if (err == NULL) {
exit(1);
}
fft = fftw_plan_dft_r2c_1d(size, array, out_cpx, FFTW_ESTIMATE); //Setup fftw plan for fft
ifft = fftw_plan_dft_c2r_1d(size, out_cpx, out, FFTW_ESTIMATE); //Setup fftw plan for ifft
fftw_execute(fft);
fftw_execute(ifft);
for (i = 0; i < size; i++) {
err[i] = (array[i] - out[i]);
printf("%f\t%f\n", (array[i]), out[i] / size);//需要做归一化处理
}
fftw_destroy_plan(fft);
fftw_destroy_plan(ifft);
fftw_free(out_cpx);
free(err);
free(out);
system("pause");
return 0;
}
运行结果:
成功。