C++问题七 C++写Matlab中FFT(快速傅里叶变换) 和ifft函数

C++问题七 C++写Matlab中FFT(快速傅里叶变换)函数

用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之后结果如第二列。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42655134/article/details/107940232