当前位置:   article > 正文

C++问题七 C++写Matlab中FFT(快速傅里叶变换) 和ifft函数_c++怎么直接调用库进行fft运算

c++怎么直接调用库进行fft运算

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;
}
  • 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
  • 46
  • 47
  • 48

结果如下,第一列是输入,经过fft ifft之后结果如第二列。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/105006
推荐阅读
相关标签
  

闽ICP备14008679号