// 注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