欢迎来到天天文库
浏览记录
ID:47477215
大小:395.89 KB
页数:18页
时间:2020-01-11
《基于DSP的C程序实验报告------快速傅立叶变换(FFT)算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、目录一.引言二.实验原理三.FFT基本结构(1)信号流图(2)软件程序流图四.实验程序五.调试过程与步骤六.实验结果七.结果分析八.遇到的问题及解决办法九.实验体会实验题目:快速傅立叶变换(FFT)算法一.引言众所周知,FFT是离散傅立叶变换(DFT)的一种快速算法。由于计算DFT时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。每运算一个X(k)需要4N次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。所以整个DFT运算总共需要4N^2次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。如此一
2、来,计算时乘法次数和加法次数都是和N^2成正比的,当N很大时,运算量是可观的,因而需要改进对DFT的算法提高运算速度。我们观察DFT的系数特性,可发现其对称性和周期性,我们可以将DFT运算中有些项合并。因此,FFT就孕育而生了。一.实验原理1.FFT的原理和参数生成公式:我们先设序列长度为N=2^L,L为整数。将N=2^L的序列x(n)(n=0,1,……,N-1),按N的奇偶分成两组,也就是说我们将一个N点的DFT分解成两个N/2点的DFT,他们又重新组合成一个如下式所表达的N点DFT:我们称这样的RFFT优化算法是包装算法:首先2N点
3、实数的连续输入称为“进包”。其次N点的FFT被连续运行。最后作为结果产生的N点的合成输出是“打开”成为最初的与DFT相符合的2N点输入。三.FFT的基本结构:1.FFT信号流图如下:整个过程共有log2N次,每次分组间隔为2^(L-1)----------------1=4、(2πm/N),求正弦和余弦函数值的计算量是很大的。(4)本程序采用的输入信号为:1024*sin(2*pi*3*t),采样频率为10242.程序流程图:四.实验程序#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include File#include "f2812a.h"#include"math.h"#define PI 3.1415926#de5、fine SAMPLENUMBER 128void InitForFFT();void MakeWave();/oid FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]);int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBE6、R];void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]){int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p,L;float TR,TI,temp;/********** following code invert sequence ************/for ( i=0;i7、0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataI[xx]=dataR[i];}for ( i=0;i8、r(1) */b=1; i=L-1;while ( i>0 ) {b=b*2; i--;} /* b= 2^(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1;
4、(2πm/N),求正弦和余弦函数值的计算量是很大的。(4)本程序采用的输入信号为:1024*sin(2*pi*3*t),采样频率为10242.程序流程图:四.实验程序#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include File#include "f2812a.h"#include"math.h"#define PI 3.1415926#de
5、fine SAMPLENUMBER 128void InitForFFT();void MakeWave();/oid FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]);int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBE
6、R];void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]){int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p,L;float TR,TI,temp;/********** following code invert sequence ************/for ( i=0;i7、0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataI[xx]=dataR[i];}for ( i=0;i8、r(1) */b=1; i=L-1;while ( i>0 ) {b=b*2; i--;} /* b= 2^(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1;
7、0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataI[xx]=dataR[i];}for ( i=0;i8、r(1) */b=1; i=L-1;while ( i>0 ) {b=b*2; i--;} /* b= 2^(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1;
8、r(1) */b=1; i=L-1;while ( i>0 ) {b=b*2; i--;} /* b= 2^(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1;
此文档下载收益归作者所有