今天终于把DSP中的FFT弄清楚了,现在总结下成果。
一、首先介绍下FFT的理论知识
快速傅里叶变换(FFT)是DFT的一种快速算法实现。
FFT的物理意义如下:
二、然后介绍下具体的编程实现
#include <stdio.h>#include <math.h>#include <fft.h>/* Create an Instance of FFT module */#define PI 3.141592653589793#define N 128 #pragma DATA_SECTION(ipcb, "FFTipcb");#pragma DATA_SECTION(mag, "FFTmag");CFFT32 fft=CFFT32_128P_DEFAULTS; long ipcb[2*N];long mag[N];long data[N];const long win[N/2]=HAMMING128; void main(){int i = 0;/* generate data */for( i = 0; i < N; i++)data[i] = (long)(0x10000000*sin(2*PI*i*1000/16000) + 0x10000000*sin(2*PI*i*2000/16000));// data[i] = (long)(0x10000000*sin(2*PI*i*1/128));/* Initialize FFT module */ fft.ipcbptr=ipcb; fft.magptr=mag;// fft.winptr=(long *)win; fft.init(&fft);for (i=0;i<N;i++){ipcb[2*i] = data[i];ipcb[2*i+1] = 0;}CFFT32_brev2(ipcb,ipcb,N);// RFFT32_brev(ipcb,ipcb,N);// fft.win(&fft); // RFFT32_brev(ipcb,ipcb,N);// RFFT32_brev(ipcb,ipcb,N); fft.izero(&fft); fft.calc(&fft);// fft.split(&fft); fft.mag(&fft); exit(0);}
一开始mag(幅值)数组的值一直为零,但是icpb(傅里叶变换后的x(k))的值却是正确的,先以table的形式解释下两个数组吧
查看了这么多资料还是不及TI的官方资料有用!!!看了TI官方的fft_mdl.PDF后恍然大悟,原来calc计算出来的ipcb是采取Q31格式的,而mag则是Q30格式的。开始之所以出现零,是因为其他一些资料上说是Q15格式,所以导致最
后得到的数据很小,等于零。因此只要放大波形幅值就能解决问题了。不过会过来想想,可能是因为long和int的原因,long是4个字节,即32bit,int是2个字节即16bit,而fftlib中的数据时0-1范围,因此对于32bit应该是采用Q31.