赞
踩
用C++写fft函数可以调用库函数,在这里我调用的库函数是fftw,库下载地址(http://www.fftw.org/install/windows.html),为:FFTW 3.3.5 Windows DLLs,我下载的是fftw-3.3.5-dll64.zip。
第一步:解压缩下载的fftw-3.3.5-dll64.zip。在此我下载到了D盘。
第二步:在window10的开始菜单栏中打开VS2017的X64工具。
第三步:运行lib.exe命令。
具体步骤:1.在D:\visiostudio\anzhuang>后边输入lib.exe,出现下图。
2.打上你下载的盘然后加冒号(我第一次忘记加了)。
3.然鹅。。。。。。。我发现了问题,由于本人VS2017是安装在D盘,并且这个库也是直接解压在D盘了,所以此时,我把这个库放在了命令提示所在的这个目录下::(D:\visiostudio\anzhuang),此时输入cd fftw-3.3.5-dll64(中间有空格),得到结果如图
4.打开库所在目录之后我们开始运行命令(分别输入三行命令后,结果如图所示)
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
lib /machine:x64 /def:libfftw3f-3.def
并且在D:\visiostudio\anzhuang\fftw-3.3.5-dll64下出现三个exp和三个lib
5.将新出现的三个lib放到D:\visiostudio\anzhuang\VC\Tools\MSVC\14.16.27023\lib\x64下边(我的VS下的是专业版的,所以目录与社区版有所不同,大家找到对应的去放即可)
将fftw3.h放在
D:\visiostudio\anzhuang\VC\Tools\MSVC\14.16.27023\include下
libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll复制到C:\Windows\SysWOW64
libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll复制到C:\Windows\System32
第四步 在工程属性,配置属性 连接器 输入下的附加依赖项添加如下
libfftw3-3.lib
libfftw3f-3.lib
libfftw3l-3.lib
第五步:验证
代码如图
#include "fftw3.h" #include<stdio.h> //#include <windows.h> #include<iostream> #include<vector> using namespace std; int main() { //****************************ifft******************************** double array[] = { 0.1, 0.6, 0.1, 0.4, 0.5, 0, 0.8, 0.7, 0.8, 0.6, 0.1 }; 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)); err = (double *)malloc(size * sizeof(double)); 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); //printf("Input: \tOutput: \tError:\n"); for (i = 0; i < size; i++) { err[i] = (array[i] - out[i]); printf("%f\t%f\n", (array[i]), out[i] / size);//需要做归一化处理 //printf("%f\t%f\t%f\n",(array[i]),out[i],err[i]); } fftw_destroy_plan(fft); fftw_destroy_plan(ifft); fftw_free(out_cpx); free(err); free(out); //***************************************ifft********************* system("pause");//暂停 return 0; }
结果如下,第一列是输入,经过fft ifft之后结果如第二列。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。