用C中的fftw.h计算fft和ifft

dig*_*phd 5 c signal-processing fft fftw

大家好我正在使用fftw C库来计算嵌入式系统上某些信号处理应用的频谱.但是,在我的项目中,我遇到了轻微的阻碍.

下面是我编写的一个简单程序,以确保我正确实现fftw函数.基本上我想计算12个数字序列的fft,然后做ifft并再次获得相同的数字序列.如果你安装了fftw3和gcc,那么如果用以下代码编译,这个程序应该可行:

gcc -g -lfftw3 -lm fftw_test.c -o fftw_test
Run Code Online (Sandbox Code Playgroud)

目前我的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;
}
Run Code Online (Sandbox Code Playgroud)

其中产生以下输出:

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
Run Code Online (Sandbox Code Playgroud)

显然,ifft正在产生一些放大的结果.在这里找到的fftw文档: 关于缩放的fftw文档.它提到了一些缩放,但是我使用"r2c"和"c2r"变换而不是FFT_FORWARD和FFT_BACKWARD.任何见解将不胜感激.

rub*_*nvb 5

看着您使用的功能丰富的文档,你会发现你正在使用FFT_FORWARD和FFT_BACKWARD,以及它的确切位置意.因此,您之前找到的缩放信息也适用于此处.