在C语言中用fftw.h计算fft和ifft

在C语言中用fftw.h计算fft和ifft,c,signal-processing,fft,fftw,C,Signal Processing,Fft,Fftw,大家好 我正在使用fftw C库计算嵌入式系统上一些信号处理应用程序的频谱。然而,在我的项目中,我遇到了一点阻碍 下面是我为确保正确实现fftw函数而编写的一个简单程序。基本上我想计算12个数字序列的fft,然后进行ifft,再次得到相同的数字序列。如果您安装了fftw3和gcc,如果您使用以下工具进行编译,该程序应该可以运行: gcc -g -lfftw3 -lm fftw_test.c -o fftw_test 当前,我的fft长度与输入阵列的大小相同 #include <stdio

大家好 我正在使用fftw C库计算嵌入式系统上一些信号处理应用程序的频谱。然而,在我的项目中,我遇到了一点阻碍

下面是我为确保正确实现fftw函数而编写的一个简单程序。基本上我想计算12个数字序列的fft,然后进行ifft,再次得到相同的数字序列。如果您安装了fftw3和gcc,如果您使用以下工具进行编译,该程序应该可以运行:

gcc -g -lfftw3 -lm fftw_test.c -o fftw_test
当前,我的fft长度与输入阵列的大小相同

#include <stdio.h>
#include <stdlib.h>
#include <sndfile.h>
#include <stdint.h>
#include <math.h>
#include <fftw3.h>

int main(void)
{
double array[] = {0.1, 0.6, 0.1, 0.4, 0.5, 0, 0.8, 0.7, 0.8, 0.6, 0.1,0};
//double array2[] = {1, 6, 1, 4, 5, 0, 8, 7, 8, 6, 1,0};
double *out;
double *err;
int i,size = 12;

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");
printf("Input:    \tOutput:\n");
for(i=0;i<size;i++)
{
err[i] = abs(array[i] - out[i]);    
printf("%f\t%f\n",(array[i]),out[i]);
//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);
return 0;
}
显然,ifft正在产生一些放大的结果。在此处找到的fftw文档中: .
它提到了一些缩放,但是我使用的是“r2c”和“c2r”变换,而不是FFT_向前和FFT_向后。如有任何见解,将不胜感激

查看,您将看到您正在使用FFT\u FORWARD和FFT\u BACKWARD,这正是您想要的。因此,您以前找到的缩放信息也适用于此处。

很抱歉,您太迂腐了,但您的out\u cpx尺寸不正确。它应该是size/2+1,而不是size-long。这是因为实信号的FFT是厄米的。您可以通过将out_cpx初始化为某个随机数(全部为3.14159)来验证我的说法。向前和向后运行,然后打印出从大小/2+1到大小的\u cpx。它不会改变


r2c和c2r基本上与常规傅里叶变换相同。唯一的区别是输入和输出数组都需要保存一半的数字。请看一下手册的最后一段。所以标准化因子正是实数数组的元素数,或者在你的例子中是变量
大小(==12)。

好的,谢谢,是的,我确实在某个时候读过。这是漫长的一天。。。是的:out[i]=out[i]/尺寸;非常感谢您的意见:)现在请阅读文档。
Input:      Output:
0.100000    1.200000
0.600000    7.200000
0.100000    1.200000
0.400000    4.800000
0.500000    6.000000
0.000000    0.000000
0.800000    9.600000
0.700000    8.400000
0.800000    9.600000
0.600000    7.200000
0.100000    1.200000
0.000000    0.000000