FFTW: 实数FFT的输出项(仅填充n/2+1项),复数IFFT的幅度(需手工归一1/N)

    // 注1. 输入为实数形式(r2c):输出呈现共轭对称规律,FFTW为省时间,仅输出前面 [floor(n/2)+1]项的计算值 (切记!后面项为定义时的随机值) 
    // 注2. 输入为复数形式(c2c):输出所有项的计算值 
    // 注3. FFTW库的逆傅里叶变换FFTW_BACKWARD得到的结果未进行归一化,因此需要手动对结果进行/N的操作

--------------------------------------------------------------------------------------------------------

#include "fftw3.h"  
#include<stdio.h>
#include<iostream>
//#include<vector>

using namespace std;
int main()
{
	//****************************ifft********************************
	// 注1. 输入为实数形式(r2c):输出呈现共轭对称规律,FFTW为省时间,仅输出前面 [floor(n/2)+1]项的计算值 (切记!后面项为定义时的随机值) 
	// 注2. 输入为复数形式(c2c):输出所有项的计算值 
	// 注3. FFTW库的逆傅里叶变换FFTW_BACKWARD得到的结果未进行归一化,因此需要手动对结果进行/N的操作
	// 
	//---------- FFTW #1: 输入数据 ----------------------
	// 1. 实数形式
	double inData[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int size = sizeof(inData)/sizeof(inData[0]);
	// 2. 复数形式
	fftw_complex* inDataCpx = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * size);
	for (int i = 0; i < size; i++)
	{
		inDataCpx[i][0] = inData[i];	// Re
		inDataCpx[i][1] = 0;			// Im
	}

	//---------- FFTW #2: 输出数据 ----------------------
	fftw_complex* outDftCpx = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * size);
	double* outIdftReal = (double*)fftw_malloc(size * sizeof(double));	// 若长度先知道,用数组形式,可省略free()步骤

	//---------- FFTW #3: 算法计划 ----------------------

	fftw_plan p_fft;
	fftw_plan p_ifft;
	// 实数to复数变换(结果仅填充一半)
	p_fft  = fftw_plan_dft_r2c_1d(size, inData, outDftCpx, FFTW_ESTIMATE);  //Setup fftw plan for fft
	// 复数to复数变换(结果全填充)
	//p_fft  = fftw_plan_dft_1d(size, inDataCpx, outDftCpx, FFTW_FORWARD, FFTW_ESTIMATE);  //Setup fftw plan for fft

	p_ifft = fftw_plan_dft_c2r_1d(size, outDftCpx, outIdftReal, FFTW_ESTIMATE);   //Setup fftw plan for ifft



	//---------- FFTW #4: 算法执行 ----------------------
	fftw_execute(p_fft);
	fftw_execute(p_ifft);


	for (int i = 0; i < size; i++)
	{
		printf("R2C_DFT[%d]: Re= %lf,Im(j)= %lf \n", i, outDftCpx[i][0], outDftCpx[i][1]);//需要做归一化处理
	}
	for (int i = 0; i < size; i++)
	{
		printf("%f\t%f\n", inData[i], outIdftReal[i] / size);//需要做归一化处理
	}

	//---------- FFTW #5: 缓存释放 ----------------------
	fftw_destroy_plan(p_fft);
	fftw_destroy_plan(p_ifft);
	fftw_free(outDftCpx);
	fftw_free(inDataCpx);

	fftw_free(outIdftReal);
	//***************************************ifft*********************

	system("pause");//暂停
	return 0;
}

--------------------------------------------------------------------------------------------------------

实数输入下使用 fftw_plan_dft_r2c_1d() 的输出结果:

R2C_DFT[0]: Re= 55.000000,Im(j)= 0.000000
R2C_DFT[1]: Re= -5.500000,Im(j)= 18.731280
R2C_DFT[2]: Re= -5.500000,Im(j)= 8.558167
R2C_DFT[3]: Re= -5.500000,Im(j)= 4.765777
R2C_DFT[4]: Re= -5.500000,Im(j)= 2.511766
R2C_DFT[5]: Re= -5.500000,Im(j)= 0.790781
R2C_DFT[6]: Re= 0.000000,Im(j)= 0.000000
R2C_DFT[7]: Re= 0.000000,Im(j)= 0.000000
R2C_DFT[8]: Re= 0.000000,Im(j)= 0.000000
R2C_DFT[9]: Re= 0.000000,Im(j)= 0.000000
R2C_DFT[10]: Re= 0.000000,Im(j)= 0.000000

FFT              IFFT(FFT)
0.000000        0.000000
1.000000        1.000000
2.000000        2.000000
3.000000        3.000000
4.000000        4.000000
5.000000        5.000000
6.000000        6.000000
7.000000        7.000000
8.000000        8.000000
9.000000        9.000000
10.000000       10.000000

--------------------------------------------------------------------------------------------------------

复数输入下使用 fftw_plan_dft_1d() 的输出结果:

C2C_DFT[0]: Re= 55.000000,Im(j)= 0.000000
C2C_DFT[1]: Re= -5.500000,Im(j)= 18.731280
C2C_DFT[2]: Re= -5.500000,Im(j)= 8.558167
C2C_DFT[3]: Re= -5.500000,Im(j)= 4.765777
C2C_DFT[4]: Re= -5.500000,Im(j)= 2.511766
C2C_DFT[5]: Re= -5.500000,Im(j)= 0.790781

C2C_DFT[6]: Re= -5.500000,Im(j)= -0.790781
C2C_DFT[7]: Re= -5.500000,Im(j)= -2.511766
C2C_DFT[8]: Re= -5.500000,Im(j)= -4.765777
C2C_DFT[9]: Re= -5.500000,Im(j)= -8.558167
C2C_DFT[10]: Re= -5.500000,Im(j)= -18.731280

FFT              IFFT(FFT)
0.000000        -0.000000
1.000000        1.000000
2.000000        2.000000
3.000000        3.000000
4.000000        4.000000
5.000000        5.000000
6.000000        6.000000
7.000000        7.000000
8.000000        8.000000
9.000000        9.000000
10.000000       10.000000

### 回答1: fftw_plan_dft_r2c_1d是一个函数,用于创建一个实向复的一维傅里叶变换计划。它的函数原型为: ``` fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned flags); ``` 其中,n表示输入数组的长度,in表示指向输入实数组的指针,out表示指向输出复数数组的指针,flags表示变换的选。该函数返回一个fftw_plan对象,用于执行实向复的一维傅里叶变换。 要注意的是,该函数要求输入数组in的长度必须是偶数,且输出数组out的长度为n/2+1。此外,该函数还支持多线程计算,可以通过设置FFTW_MEASURE或FFTW_ESTIMATE标志来选择计算方式。 ### 回答2: fftw_plan_dft_r2c_1d是一个作者为计算一维实向量到一维复数向量的离散傅里叶变换(DFT)的快速算法(FFT)所提供的函数。该函数通过使用混洗计算序列的方法,能够对实数数据进行快速的离散傅里叶变换。 在fftw_plan_dft_r2c_1d函数中,输入数据是一个一维实向量,输出则是一个长度为N/2+1的一维复数向量。这里的N表示输入实向量的长度。函数首先根据输入实向量的长度申请所的空间,然后进行相关计算,并将结果存储在输出复数向量中。 fftw_plan_dft_r2c_1d函数的使用要预先安装FFTW库,并在代码中包含相应的头文件。使用该函数时,要先创建一个FFTW计划(plan),即通过fftw_plan_dft_r2c_1d函数创建一个用于DFT计算的实例。计划创建后,便可以通过调用fftw_execute函数来执行计算,将实向量转换为复数向量。计算完成后,再通过访问输出向量中的元素来获取结果。 fftw_plan_dft_r2c_1d函数在数值计算领域得到广泛的应用。它的设计充分考虑了效率和实用性,通过使用优化算法和避免重复计算等手段,能够显著提高计算速度和准确性。同时,由于函数所的输入和输出都是标准的一维实向量和复数向量,因此用户可以方便地在自己的代码中使用该函数进行离散傅里叶变换的计算,以满足不同应用领域的求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值