fftw3.3.5的库出现的问题

我们在使用傅里叶变换的时候,会出现要求截断数据求频率值或则填零求频率。而麻省理工这个3.3.5的库不能够实现填零求超过输入数组长度的值的问题。

譬如以下的情况

代码:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <fftw3.h>
#define PI 3.1415926


using namespace std;
using namespace cv;



int main()
{

	double *in = NULL;
	// 如果要使用float版本,需先引用float版本的lib库,然后在fftw后面加上f后缀即可.
	fftw_complex *out = NULL;// fftwf_complex --> 即为float版本
	fftw_plan p;
	in = (double *)fftw_malloc(sizeof(double) * 50);
	out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * 26);
	float kkk[] = { 0.08, 0.191348, 0.424885
		, 0.858924
		, 1.55
		, 2.52566
		, 3.78
		, 5.27245
		, 6.93
		, 8.65269
		, 10.3221
		, 11.8119
		, 13
		, 13.7806
		, 14.0756
		, 13.8443
		, 13.09
		, 11.863
		, 10.26
		, 8.41886
		, 6.51
		, 4.72408
		, 3.25745
		, 2.29618
		, 2 };
	// 输入纯实数

	for (int i = 0; i < 50; i++)
	{
		if (i<25) {
			in[i] = kkk[i];
		}
		else {
			//in[i] = 0;
		}
		
		cout << in[i] << endl;
	}


	// 傅里叶变换
	p = fftw_plan_dft_r2c_1d(50, in, out, FFTW_ESTIMATE);
	fftw_execute(p);

	// 输出幅度谱
	for (int i = 0; i < 9; i++)
	{
		cout << "out1:" << out[i][0] << endl << "out2:" << out[i][1] << endl;
	}

	// 释放资源
	fftw_destroy_plan(p);
	fftw_free(in);
	fftw_free(out);

	system("pause");
	return 0;
}

得到结果:

这里面需要你手动往后面填零:

代码

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <fftw3.h>
#define PI 3.1415926


using namespace std;
using namespace cv;



int main()
{

	double *in = NULL;
	// 如果要使用float版本,需先引用float版本的lib库,然后在fftw后面加上f后缀即可.
	fftw_complex *out = NULL;// fftwf_complex --> 即为float版本
	fftw_plan p;
	in = (double *)fftw_malloc(sizeof(double) * 50);
	out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * 26);
	float kkk[] = { 0.08, 0.191348, 0.424885
		, 0.858924
		, 1.55
		, 2.52566
		, 3.78
		, 5.27245
		, 6.93
		, 8.65269
		, 10.3221
		, 11.8119
		, 13
		, 13.7806
		, 14.0756
		, 13.8443
		, 13.09
		, 11.863
		, 10.26
		, 8.41886
		, 6.51
		, 4.72408
		, 3.25745
		, 2.29618
		, 2 };
	// 输入纯实数

	for (int i = 0; i < 50; i++)
	{
		if (i<25) {
			in[i] = kkk[i];
		}
		else {
			in[i] = 0;
		}
		
		cout << in[i] << endl;
	}


	// 傅里叶变换
	p = fftw_plan_dft_r2c_1d(50, in, out, FFTW_ESTIMATE);
	fftw_execute(p);

	// 输出幅度谱
	for (int i = 0; i < 9; i++)
	{
		cout << "out1:" << out[i][0] << endl << "out2:" << out[i][1] << endl;
	}

	// 释放资源
	fftw_destroy_plan(p);
	fftw_free(in);
	fftw_free(out);

	system("pause");
	return 0;
}

结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值