当前位置:   article > 正文

C++调用FFTW之注意_fftw_plan_dft_1d

fftw_plan_dft_1d

FFTW库函数的fftw_plan_dft_1d中的第三个输入参数FFTW_FORWARD为正傅里叶变换,FTW_BACKWARD为逆傅里叶变换;第四个输入参数FFTW_MEASURE表示准确计算,FFTW_ESTIMATE表示快速估计。

fftw_plan_dft_1d的执行需要在赋值fftIN之前。

fftIn和fftOut的长度需要一致,默认初始化为0。

int main()
{
	int Nfft = 1024, Ns = 600;
	double fc1 = 0e6;
	double fc2 = 1.2e6;
	double Fs = 3.5e6;
	fftw_complex *fftIn = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Nfft);
	fftw_complex *fftOut = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Nfft);
	fftw_plan plan = fftw_plan_dft_1d(Nfft, fftIn, fftOut, FFTW_FORWARD, FFTW_MEASURE);
	for (int i = 0; i < Ns; i++)
	{
		fftIn[i][0] = cos(2 * PI*fc1*i / Fs)+ cos(2 * PI*fc2*i / Fs); // real part
		fftIn[i][1] = sin(2 * PI*fc1*i / Fs)+ sin(2 * PI*fc2*i / Fs); // imag part
	}
	fftw_execute(plan);
	fftw_destroy_plan(plan);
	double *fftres = new double[Nfft];
	VectorXd freqpoint = VectorXd::LinSpaced(Nfft, -Nfft / 2, Nfft / 2 - 1);
	freqpoint = freqpoint*Fs / Nfft/1e6;
	for (int i = 0; i < Nfft; i++)
	{
		if (i<Nfft/2)
			fftres[i + Nfft / 2] = 10 * log10(sqrt(fftOut[i][0] * fftOut[i][0] + fftOut[i][1] * fftOut[i][1]));
		else
			fftres[i - Nfft / 2] = 10 * log10(sqrt(fftOut[i][0] * fftOut[i][0] + fftOut[i][1] * fftOut[i][1]));
	}
}
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/105163
推荐阅读
  

闽ICP备14008679号