基于DSP的C程序实验报告------快速傅立叶变换(FFT)算法
DSP实验报告

DSP 实验报告实验一 快速傅里叶变换一 实验目的1 在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解;2 熟悉并掌握按时间抽取FFT 算法的程序;3 了解应用FFT 进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、栅栏效应等,以便在实际中正确应用FFT 。
二 实验内容1 仔细分析教材第六章‘时间抽取法FFT ’的算法结构,编制出相应的用FFT 进行信号分析的MATLAB 语言(或C 语言)程序;2 用FFT 程序计算有限长度正弦信号()sin(2),0*y t f t t N T π=≤<分别在以下情况下所得的DFT 结果并进行分析和讨论:本实验时域上加时窗,对应的是频率上与sinc 函数做卷积,当采样为整数倍的周期时,时窗对频谱图无影响,当采样是非整数个周期时,时窗对频谱图影响较大。
a ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.000625sX(k)值如下表,频谱图如下b)信号频率f=50Hz,采样点数N=32,采样间隔T=0.005s X(k)值如下表,频谱图如图分析:50Hz在第8点和第24点,8个周期采样32个点,采样频率为32/8*50,即第32个点对应32/8*50Hz,每个栅栏的宽度为1/8*50Hz,所以50Hz第8个点上,可以采到50Hz这个点。
时域窗宽8个周期,图谱节点宽度1/(8T)=(1/8)*50Hz,所以在非第8点和第24点时采样值为0。
c)信号频率f=50Hz,采样点数N=32,采样间隔T=0.0046875sX(k)值如下表,频谱图如图分析:50Hz在第7.5(24.5)个点上,7.5个周期采样32个点,采样频率为32/7.5*50,即第32个点对应32/7.5*50Hz,每个栅栏的宽度为1/7.5*50Hz,所以50Hz第7.5个点上,采不到50Hz这个点。
时域窗宽7.5个周期,图谱节点宽度1/(7.5T)=(1/8)*50Hz,所以在每一个采样点都可以采到非0值。
快速傅立叶变换FFT实验报告

快速傅立叶变换〔FFT〕算法试验一.试验目的1.加深对DFT 算法原理和根本性质的理解;2.生疏FFT 算法原理和FFT 子程序的应用;3.学习用FFT 对连续信号和时域信号进展谱分析的方法,了解可能消灭的分析误差及其缘由,以便在实际中正确应用FFT。
二.试验设备计算机,CCS 3.1 版软件,E300 试验箱,DSP 仿真器,导线三.根本原理1.离散傅立叶变换DFT 的定义:将时域的采样变换成频域的周期性离散函数,频域的采样也可以变换成时域的周期性离散函数,这样的变换称为离散傅立叶变换,简称DFT。
2.FFT 是DFT 的一种快速算法,将DFT 的N2 步运算削减为〔N/2〕logN 步,极大2的提高了运算的速度。
3.旋转因子的变化规律。
4.蝶形运算规律。
5.基2FFT 算法。
四.试验步骤1.E300 底板的开关SW4 的第1 位置ON,其余置OFF。
其余开关不用具体设置。
2.E300 板子上的SW7 开关的第1 位置OFF,其余位置ON3.阅读本试验所供给的样例子程序;4.运行CCS 软件,对样例程序进展跟踪,分析结果;记录必要的参数。
5.填写试验报告。
6.供给样例程序试验操作说明A.试验前预备用导线连接“Signal expansion Unit”中2 号孔接口“SIN”和“A/D 单元”的2 号孔接口“AD_IN0”。
〔试验承受的是外部的AD模块〕B.试验1.正确完成计算机、DSP 仿真器和试验箱的连接后,系统上电。
2.启动CCS3.1,Project/Open 翻开“algorithm\01_fft”子名目下“fft.pjt”工程文件;双击“fft.pjt”及“Source”可查看各源程序;加载“Debug\fft.out”;3.单击“Debug\Go main”进入到主程序,在主程序“flag=0;”处设置断点;4.单击“Debug \ Run”运行程序,或按F5 运行程序;程序将运行至断点处停顿;5.用View / Graph / Time/Frequency 翻开一个图形观看窗口;设置该观看图形窗口变量及参数;承受双踪观看在启始地址分别为px 和pz,长度为128,数值类型为16 位整型,p x:存放经A/D 转换后的输入信号;p z:对该信号进展FFT 变换的结果。
DSP-FFT快速傅立叶计算实验

《DSP原理及应用》课程实验报告学生姓名:所在班级:电信1001指导教师:记分及评价:项目满分5分得分一、实验名称实验5:FFT快速傅立叶计算二、任务及要求【基本部分】3分把教材7-13FFT快速傅立叶计算的程序补充完整,进行仿真实验。
【发挥部分】2分把exam5-1中的sian1或sian2数据调用进来进行快速傅立叶计算。
三、实验程序(原理图)#include "fcomplex.h"void fft(complex *X, unsigned int M, complex *W, unsigned int SCALE){complex temp; /* 复变量临时存储器 */complex U; /* 旋转因子W^k */unsigned int i,j;unsigned int id; /* 蝶形运算中下位节点的序号 */unsigned int N=1<<M; /* FFT 的点数*/unsigned int L; /* FFT 的级序号 */unsigned int LE; /* L级子FFT的点数 */unsigned int LE1; /* L级子FFT蝶形运算的个数 */float scale;scale = 0.5;for (L=1; L<=M; L++){LE=1<<L;LE1=LE>>1;U.re = 1.0;U.im = 0.;for (j=0; j<LE1;j++){for(i=j; i<N; i+=LE) /* 进行蝶形计算 */{id=i+LE1;temp.re = (X[id].re* U.re - X[id].im* U.im)*scale; temp.im = (X[id].im* U.re + X[id].re* U.im)*scale;X[id].re = X[i].re*scale - temp.re;X[id].im = X[i].im*scale - temp.im;X[i].re = X[i].re*scale + temp.re;X[i].im = X[i].im*scale + temp.im;}/* 递推计算W^k */temp.re = U.re* W[L-1].re - U.im* W[L-1].im;U.im = U.re* W[L-1].im + U.im* W[L-1].re;U.re = temp.re;}}}/*fft_test.c - Example to test FFT*/#include <math.h>#include "fcomplex.h"extern void bit_rev(complex *, unsigned int); /*位反转函数声明*/ extern void fft(complex *, unsigned int, complex *, unsigned int); extern void generator(float *, unsigned int);/* fft函数声明 */#define N 128 /* FFT的数据个数 */#define M 7 /* M=log2(N) */#define PI 3.1415926complex X[N]; /* 说明输入信号数组,为复数 */complex W[M]; /* 说明旋转因子数组e^(-j2PI/N),为复数 */ complex temp; /* 说明临时复数变量 */float xin[N];float spectrum[N]; /* 说明功率谱信号数组,为实数 */float re1[N],im1[N]; /* 说明临时变量数组,为实数 */void main(){unsigned int i,L,LE,LE1;/* ------------------------------------------------------------- */ /* 产生旋转因子表 */for (L=1; L<=M; L++){LE=1<<L; /* 子FFT中的点数LE=2^L */LE1=LE>>1; /* 子FFT中的蝶形运算数目*/W[L-1].re = cos(PI/LE1);W[L-1].im = -sin(PI/LE1);}/* ------------------------------------------------------------- */ generator(xin,N);for (;;){/* --------------------------------------------------------- */for (i=0; i<N; i++){/* 构造输入信号样本 */X[i].re =xin[i];X[i].im = 0;/* 复制到参考缓冲器 */re1[i] = X[i].re;im1[i] = X[i].im;}/* 启动 FFT */bit_rev(X,M); /* 以倒位次序排列X[] */fft(X,M,W,1); /* 执行 FFT *//* 计算功率谱,验证FFT结果 */for (i=0; i<N; i++){temp.re = X[i].re*X[i].re;temp.im = X[i].im*X[i].im;spectrum[i] = (temp.re + temp.im)*4;}}}四、仿真及结果分析五、硬件验证无六、小结这次的实验使我理解FFT快速傅立叶计算,同时对傅里叶计算以及CCS应用有更加深的理解,在设计FFT快速傅立叶计算的初期我有很多问题都不太清楚,通过老师和同学的指导,最终使我明白了如何实现FFT快速傅立叶计算。
(完整word版)基于DSP的快速傅立叶变换(FFT)的实现(汇编语言)

快速傅立叶变换(FFT )的实现一、实验目的1.了解FFT 的原理及算法;2.了解DSP 中FFT 的设计及编程方法;3.熟悉FFT 的调试方法;二、实验原理FFT 是一种高效实现离散付立叶变换的算法,把信号从时域变换到频域,在频域分析处理信息。
对于长度为N 的有限长序列x (n ),它的离散傅里叶变换为:(2/)j N nk N W e π-=,称为旋转因子,或蝶形因子。
在x (n )为复数序列的情况下,计算X (k ):对某个k 值,需要N 次复数乘法、(N -1)次复数加法;对所有N 个k 值,需要2N 次复数乘法和N (N -1)次复数加法。
对于N 相当大时(如1024)来说,直接计算它的DFT 所作的计算量是很大的,FFT 的基本思想在于: 利用2()j nk N N W e π-=的周期性即:k N k N N W W +=对称性:/2k k N N N W W +=-将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。
按时间抽取的FFT ——DIT FFT 信号流图如图5.1所示:图5.1 时间抽取的FFT —DIT FFT 信号流图FFT 算法主要分为以下四步。
第一步 输入数据的组合和位倒序∑=-=10)()(N n nk N W n x k X把输入序列作位倒序是为了在整个运算最后的输出中得到的序列是自然顺序。
第二步 实现N 点复数FFT第一级蝶形运算;第二级蝶形运算;第三级至log2N 级蝶形运算;FFT 运算中的旋转因子N W 是一个复数,可表示:为了实现旋转因子N W 的运算,在存储空间分别建立正弦表和余弦表,每个表对应从0度到180度,采用循环寻址来对正弦表和余弦表进行寻址。
第三步 功率谱的计算X (k )是由实部()R X k 和虚部()I X k 组成的复数:()()()R I X k X k jX k =+;计算功率谱时只需将FFT 变换好的数据,按照实部()R X k 和虚部()I X k 求它们的平方和,然后对平方和进行开平方运算。
基于DSP的FFT实现设计报告

DSP课程设计姓名:学号:日期:一、实验目的1.加深对DFT算法原理和基本性质的理解;2.熟悉FFT的算法原理和FFT子程序的算法流程和应用;3.学习用FFT对连续信号和时域信号进行频谱分析的方法;4.学习DSP中FFT的设计和编程思想;5.学习使用CCS的波形观察器观察波形和频谱情况;二、实验内容用DSP汇编语言及C语言进行编程,实现FFT运算、对输入信号进行频谱分析。
三、实验原理快速傅里叶变换FFT旋转因子W N有如下的特性。
对称性:W N k+N/2=-W N k(2)周期性:W N n(N-k)=W N k(N-n)=W N-nk (3)利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。
FFT就是利用了旋转因子的对称性和周期性来减少运算量的。
FFT的算法是将长序列的DFT分解成短序列的DFT。
例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一半,继续进行分解可以大大减少计算量。
最小变换的点数称为基数,对于基数为2的FFT算法,它的最小变换是2点DFT。
一般而言,FFT算法分为按时间抽取的FFT(DIT FFT)和按频率抽取的FFT(DIF FFT)两大类。
DIF FFT算法是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。
而DIF FFT算法是在频域内将每一级输入序列依次奇/偶分成2个短序列进行计算。
两者的区别是旋转因子出现的位置不同,得算法是一样的。
在DIF FFT 算法中,旋转因子W N 出现在输入端,而在DIF FFT 算法中它出现在输入端。
假定序列x(n)的点数N 是2的幂,按照DIF FFT 算法可将其分为偶序列和奇序列。
偶序列:x(2r)=x 1(r) 奇序列:x(2r+1)=x 2(r)其中:r=0,1,2,…,N/2-1,则x(n)的DFT 表示为式中,X 1 (k)和X 2(k)分别为X 1(r)和X 2(r)的N/2的DFT 。
基于DSP的C程序实验报告------快速傅立叶变换(FFT)算法

目录一.引言二.实验原理三.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)次实数加法。
如此一来,计算时乘法次数和加法次数都是和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 点实数的连续输入称为“进包”。
其次N 点的FFT 被连续运行。
最后作为结果产生的N 点的合成输出是“打开”成为最初的与DFT 相符合的2N 点输入。
三.FFT 的基本结构: 1.FFT 信号流图如下:整个过程共有log2N 次,每次分组间隔为2^(L-1)----------------1=<L<=log2N(1)如上图第一次蝶形运算间隔为一,如第一个和第二个,第三个和第四个,以此类推;第二次间隔为二,如第一个和第三个,第二个和第四个等(2)基本运算单元以下面的蝶形运算为主:计算公式如下:)()()()(11q X W X p X q X W X p X m rNm m m rN m m -=+=++(3)在FFT 运算中,旋转因子WmN=cos(2πm/N)-jsin(2πm/N),求正弦和余弦函数值的计算量是很大的。
快速傅立叶变换(FFT)的实现(DSP实验报告)

快速傅立叶变换(FFT )的实现一、实验目的在数字信号处理系统中,FFT 作为一个非常重要的工具经常使用,甚至成为DSP 运算能力的一个考核因素。
FFT 是一种高效实现离散付氏变换的算法。
离散付氏变换的目的是把信号由时域变换到频域,从而可以在频域分析处理信息,得到的结果再由付氏逆变换到时域。
本实验的目的在于学习FFT 算法,及其在TMS320C54X 上的实现,并通过编程掌握C54X 的存储器管理、辅助寄存器的使用、位倒序寻址方式等技巧,同时练习使用CCS 的探针和图形工具。
另外在BIOS 子目录下是一个使用DSP/BIOS 工具实现FFT 的程序。
通过该程序,你可以使用DSP/BIOS 提供的分析工具评估FFT 代码执行情况。
二、实验原理1)基 2 按时间抽取FFT 算法对于有限长离散数字信号{x[n]} ,0 ≤n ≤-1 N,其离散谱{x[k]} 可以由离散付氏变换(DFT)求得。
DFT 的定义为:X(k) x[n]e N k 0,1,...,N 1 n0可以方便的把它改写为如下形式:N1nkX(k) x[n]W n N k k 0,1,..., N 1n0不难看出,WN 是周期性的,且周期为N,即( n mN )(k lN ) nkm,l 0, 1, 2...W N W NWN 的周期性是DFT 的关键性质之一。
为了强调起见,常用表达式WN 取代W 以便明确其周期是N。
2) 实数FFT 运算对于离散傅立叶变换( DFT)的数字计算,FFT 是一种有效的方法。
一般假定输入序列是复数。
当实际输入是实数时,利用对称性质可以使计算DFT 非常有效。
一个优化的实数FFT 算法是一个组合以后的算法。
原始的2N 个点的实输入序列组合成一个N 点的复序列,之后对复序列进行N 点的FFT 运算,最后再由N 点的复数输出拆散成2N 点的复数序列,这2N点的复数序列与原始的2N点的实数输入序列的DFT 输出一致。
基于DSP的FFT实现设计报告

DSP课程设计姓名:学号:日期:一、实验目的1.加深对DFT算法原理和基本性质的理解;2.熟悉FFT的算法原理和FFT子程序的算法流程和应用;3.学习用FFT对连续信号和时域信号进行频谱分析的方法;4.学习DSP中FFT的设计和编程思想;5.学习使用CCS的波形观察器观察波形和频谱情况;二、实验内容用DSP汇编语言及C语言进行编程,实现FFT运算、对输入信号进行频谱分析。
三、实验原理快速傅里叶变换FFT旋转因子W N有如下的特性。
对称性:W N k+N/2=-W N k(2)周期性:W N n(N-k)=W N k(N-n)=W N-nk (3)利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。
FFT就是利用了旋转因子的对称性和周期性来减少运算量的。
FFT的算法是将长序列的DFT分解成短序列的DFT。
例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一半,继续进行分解可以大大减少计算量。
最小变换的点数称为基数,对于基数为2的FFT算法,它的最小变换是2点DFT。
一般而言,FFT算法分为按时间抽取的FFT(DIT FFT)和按频率抽取的FFT(DIF FFT)两大类。
DIF FFT算法是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。
而DIF FFT算法是在频域内将每一级输入序列依次奇/偶分成2个短序列进行计算。
两者的区别是旋转因子出现的位置不同,得算法是一样的。
在DIF FFT 算法中,旋转因子W N 出现在输入端,而在DIF FFT 算法中它出现在输入端。
假定序列x(n)的点数N 是2的幂,按照DIF FFT 算法可将其分为偶序列和奇序列。
偶序列:x(2r)=x 1(r) 奇序列:x(2r+1)=x 2(r)其中:r=0,1,2,…,N/2-1,则x(n)的DFT 表示为式中,X 1 (k)和X 2(k)分别为X 1(r)和X 2(r)的N/2的DFT 。
DSP实验手册 实验九 快速傅立叶变换(FFT)

实验九快速傅立叶变换(FFT)一. 实验目的:1.熟悉CCS集成开发环境2.熟悉SEED-DTK5416实验环境3.加深对DFT算法原理和基本性质的理解4.熟悉FFT的算法原理和FFT子程序的算法流程和应用5.学习用FFT对连续信号和时域信号进行频谱分析的方法6.了解DSP处理FFT算法的特殊寻址方式二. 实验内容:1. DSP初始化;2. A/D采样;3. FFT的位倒序程序;4. FFT的蝶形运算程序;5.求功率谱的程序;6.串口发送与接收。
三. 实验背景知识:1. DFT算法的原理2. FFT快速算法的基本原理3. FFT位倒序的实现四. 实验程序功能与结构说明:在数字滤波器实验中,主要包含以下文件:1. Dtk-fft.c:这是实验的主程序,包含了系统的初始化,主要是异步串口的初始化、MCBSP的初始化、以及系统时钟的设置;完成与SEED-MMI5402系统的异步通讯、信号的采集与FFT的运算及功率谱的计算程序。
2. dec5416.c:对SEED-DEC5416各项资源的操作的函数集,主要包含了对UART 的操作的各个函数,对CODEC的各个控制函数。
以及对系统各项的初始化函数。
3. rfft1024.asm:1024点的FFT函数。
4. rftt512.asm:512点的FFT函数。
5. rfft256.asm:256点的FFT函数。
6. cbrev.asm:位倒序函数。
7. sqrt.asm:开方函数。
8. iircas5.asm:IIR滤波器函数。
9. fltoq15.asm:浮点数到Q15定点数的转换;10.b oot.asm:C环境的引导程序。
11.m emory.asm:包含了对FLASH的各项操作、程序空间MEMORY。
12.s ysreg.asm:包含了对DSP的各项控制,像中断的设置、系统时钟设置,及13.对各寄存器的操作。
14.u art.asm:对异步串口的寄存器的读与写。
DSP实验报告

一.课程设计目的1.掌握用窗函数法设计FFT 快速傅里叶的原理和方法;2.熟悉FFT 快速傅里叶特性;3.了解各种窗函数对快速傅里叶特性的影响。
二.课程设计要求将所给的128点FFT算法的源程序改成八点或16点程序,并对其进行硬件仿真。
三.实验设备PC 兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.0 软件。
ICETEK–VC5509-A 硬件评估板。
四.实验原理1.FFT 的原理和参数生成公式2.公式(1)FFT 运算公式FFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法。
由于我们在计算DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。
每运算一个X(k)需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。
所以整个DFT运算总共需要4N^2 次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。
如此一来,计算时乘法次数和加法次数都是和N^2 成正比的,当N 很大时,运算量是可观的,因而需要改进对DFT 的算法减少运算速度。
根据傅立叶变换的对称性和周期性,我们可以将DFT 运算中有些项合并。
我们先设序列长度为N=2^L,L 为整数。
将N=2^L 的序列x(n)(n=0,1,……,N-1),按N 的奇偶分成两组,也就是说我们将一个N 点的DFT 分解成两个N/2 点的DFT,他们又从新组合成一个如下式所表达的N 点DFT:一般来说,输入被假定为连续的。
当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算DFT。
我们称这样的RFFT 优化算法是包装算法:首先2N 点实数的连续输入称为“进包”。
其次N点的FFT 被连续被运行。
最后作为结果产生的N 点的合成输出是“打开”成为最初的与DFT 相符合的2N 点输入。
DSP的FFT实现设计报告

DSP的FFT实现设计报告一、引言快速傅里叶变换(Fast Fourier Transform, FFT)是一种用于计算离散傅里叶变换(Discrete Fourier Transform, DFT)的快速算法。
FFT广泛应用于信号处理、图像处理、通信等领域。
本报告旨在介绍FFT的实现设计,探讨其原理、算法和优化方法。
二、FFT的原理傅里叶变换是信号处理中的重要工具,可以将一个信号在频域中进行分解。
离散傅里叶变换是对离散信号进行傅里叶变换的离散采样版本。
FFT是一种高效的离散傅里叶变换算法,通过利用输入序列的对称性和分治策略来减少计算量。
三、FFT的算法FFT的算法有多种变种,其中最为常见的是Cooley-Tukey算法。
Cooley-Tukey算法基于分治策略,将一个长度为N的DFT分解为两个长度为N/2的DFT,并通过旋转因子进行合并。
算法的关键步骤包括:分解、旋转因子计算、合并。
四、FFT的优化1.选择合适的长度和分解策略:对于长度为2^k的序列,可以直接使用蝶形操作进行计算,提高效率。
对于长度不是2的幂的序列,可以通过增加0元素的方式填充到2的幂次方长度,再进行计算。
2.使用查表法计算旋转因子:由于旋转因子具有周期性和对称性,可以将旋转因子的计算结果预先存储在一个查找表中,提高运算速度。
3.使用位翻转法重新排列输入序列:FFT的关键步骤是将输入序列重新排列成位翻转的顺序,这样可以实现更高效的计算。
位翻转法可以通过二进制位运算实现,减少乘法和除法的运算量。
4.使用并行计算:FFT的计算过程中存在大量的矩阵乘法运算,可以通过并行计算的方式提高计算效率,如使用SIMD指令来同时计算多个数据。
五、实现设计基于以上原理和优化方法,我们设计了一个基于C语言的FFT算法实现。
主要步骤包括:1.输入信号预处理:将输入信号重排列成位翻转的顺序。
如果输入序列长度不是2的幂次方,则填充0元素。
2.计算旋转因子:通过查表法计算旋转因子。
dsp实验报告5

数字信号处理实验报告姓名:实验五快速傅里叶变换一、实验仪器:PC机一台、JQ-SOPC开发系统实验箱及辅助软件(DSP Builder、Matlab/Simulink、Quartus II、Modelsim)二、实验目的:(1)了解快速傅里叶变换的基本结构组成。
(2)学习使用DSP Builder设计FFT。
三、实验原理:(1)FFT的原理:快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的一种高效运算方法,它大大简化了DFT 的运算过程,使运算时间缩短几个数量级。
FFT 算法可以分为按时间抽取(DIT)和按频率抽取(DIF)两类,输入也可分为实数和复数两种情况。
八点时间抽取基-2FFT算法信号流图如图1示:图1 8点基-2 DIT-FFT信号流图(2) DSP Builder设计流程图2显示了利用DSP Builder设计FFT的流程。
图2 DSP Builder设计流程下面部分将以N=8点实数输入基-2DIT-FFT为例介绍用DSP Builder实现FFT 的详细过程。
四、实验步骤:(1)在Matlab/Simulink环境下调用Altera DSP Builder Blockset和Simulink库内的基本模块(block)搭建FFT模型如图3所示,假设模型名为my_fft_8。
图3 FFT模型图FFT可分为输入、蝶形运算、输出三个功能模块,分别对应图三中的subsystem、subsystem1、subsystem2。
每个功能模块的详图分别如图4、图5和图6所示。
图4 输入模块详图LUT0~LUT7存储的输入数据分别为{2.0,1.1,5.6,10.2,4.0}{2.0,5.0,5.0,15.3,10.5}{4.0,10.5,15.8,18.1,15.6}{7,15.3,20.4,20 .3,20.3}{3,20.2,25.2,24.2,25.2}{5,25.7,35.1,30.0,35.7}{5,30.6,40.2,35.2,40.5}{8,40.1 ,45.0,42.3,45.0}(2)在Matlab/Simulink环境下对my_fft_8.mdl文件进行仿真参数设置,点击菜单栏的simulation选项,选择下拉菜单中的configuration parameters项,在弹出的对话框里的simulation time一栏下设置仿真开始时间和结束时间,这里可分别设为0、100.0。
快速傅里叶变换(含详细实验过程分析)

[实验2] 快速傅里叶变换 (FFT) 实现一、实验目的1、掌握FFT 算法和卷积运算的基本原理;2、掌握用C 语言编写DSP 程序的方法;3、了解利用FFT 算法在数字信号处理中的应用。
二、实验设备 1. 一台装有CCS 软件的计算机; 2. DSP 实验箱的TMS320C5410主控板; 3. DSP 硬件仿真器。
三、实验原理 (一)快速傅里叶变换傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。
离散傅里叶变换(DFT )是傅里叶变换在离散系统中的表示形式。
但是DFT 的计算量非常大, FFT 就是DFT 的一种快速算法, FFT 将DFT 的N 2步运算减少至 ( N/2 )log 2N 步。
离散信号x(n)的傅里叶变换可以表示为∑=-=10][)(N N nk N W n x k X , Nj N e W /2π-=式中的W N 称为蝶形因子,利用它的对称性和周期性可以减少运算量。
一般而言,FFT 算法分为时间抽取(DIT )和频率抽取(DIF )两大类。
两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。
本实验以时间抽取方法为例。
时间抽取FFT 是将N 点输入序列x(n) 按照偶数项和奇数项分解为偶序列和奇序列。
偶序列为:x(0), x(2), x(4),…, x(N-2);奇序列为:x(1), x(3), x(5),…, x(N-1)。
这样x(n) 的N 点DFT 可写成:()()∑++∑=-=+-=12/0)12(12/02122)(N n kn NN n nkNW n x Wn x k X考虑到W N 的性质,即2/)2//(22/)2(2][N N j N j N W e e W ===--ππ因此有:()()∑++∑=-=-=12/02/12/02/122)(N n nkN k NN n nkN W n x WWn x k X或者写成:()()12()kN X k X k W X k =+由于X 1(k) 与X 2(k) 的周期为N/2,并且利用W N 的对称性和周期性,即:kNNkNWW-=+2/可得:()()12(/2)kNX k N X k W X k+=-对X1(k) 与X2(k)继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。
基于DSP的快速傅里叶变换算法

摘要采用高级C语言实现FFT算法。
利用DSP芯片特有的哈佛结构和专门的FFT指令。
在DSP上能够更快速的实现FFT。
从而促进DSP芯片的发展,同时加快基于DSP数字信号处理的速度。
通过对FFT的算法进行研究,从基础深入研究和学习,掌握FFT算法的关键。
研究DSP芯片如何加快蝶形计算以及如何有效地码位倒置的输出颠倒过来。
熟悉旋转因子的生成。
通过学习DSP芯片的工作原理,分析DSP控制的算法,在DSP芯片上实现快速傅里叶变换算法的设计。
通过对DSP开发环境的学习,掌握CCS的简单调试和软件仿真。
在CCS开发环境中观察正弦波输入波形、输出波形、PC机FFT 计算处理后的仿真波形图。
比较仿真图,验证设计和程序的正确性。
表明利用DSP 控制器特有的反序间接寻址使FFT的实现更加方便。
关键词:DSP;FFT;旋转因子AbstractUsing advanced C language to realize FFT algorithm. Using digital signal processor (DSP) endemic harvard structure and special FFT instructions. In more quickly on DSP can realize FFT. In order to promote the development of digital signal processor (DSP) based on DSP, accelerate the speed of digital signal processing.Base on the study of FFT, from basic research and study, the key to mastering FFT algorithm. Research on how to accelerate DSP and wing how effectively yards of a output upside down. Familiar with the rotation factor production. Through studying the working principle of DSP, analyzes the algorithm, realized the design of FFT algorithm in DSP. Based on studying DSP development environment, CCS simple commissioning and software simulation. CCS development environment in observing sine wave, the output waveform input, PC FFT calculation of wave graph with simulation. Comparative simulation diagram, verify the correctness of design and program. Use DSP controller that peculiar sequence indirect addressing the realization of FFT make more convenient.Key words:DSP; FFT; Rotation目录第1章概述 0课题研究的背景及意义 0本文主要研究内容 (1)第2章快速傅里叶变换及其算法 (3)快速傅里叶变换的原理 (3)快速傅里叶变换算法 (6)本章小结 (13)第3章软件设计 (14)算法设计和程序编写 (14)算法设计流程 (14)CCS开发环境的使用及软件仿真 (18)本章小结 (23)第4章DSP芯片的原理和FFT在DSP上的实现 (25)DSP芯片的原理、特点和结构 (25)FFT算法在DSP上的实现 (30)本章小结 (31)结论 (32)参考文献 (33)致谢 (34)附录 (35)第1章概述课题研究的背景及意义课题背景近十多年来数字信号处理技术同数字计算机、大规模集成电路等,有了突飞猛进的发展,日新月异,已经成为一门具有强大生命力的技术科学。
快速傅里叶变换(FFT)

快速傅⾥叶变换(FFT)§4.3 [实验4.3] 快速傅⾥叶变换 (FFT) 实现⼀、实验⽬的 1. 掌握FFT 算法的基本原理;2. 掌握⽤C 语⾔编写DSP 程序的⽅法。
⼆、实验设备 1. ⼀台装有CCS 软件的计算机; 2. DSP 实验箱的TMS320C5416主控板; 3. DSP 硬件仿真器。
三、实验原理傅⾥叶变换是⼀种将信号从时域变换到频域的变换形式,是信号处理的重要分析⼯具。
离散傅⾥叶变换(DFT )是傅⾥叶变换在离散系统中的表⽰形式。
但是DFT 的计算量⾮常⼤, FFT 就是DFT 的⼀种快速算法, FFT 将DFT 的N 2 步运算减少⾄ ( N/2 )log 2N 步。
离散信号x(n)的傅⾥叶变换可以表⽰为∑=-=10][)(N N nk N W n x k X , Nj N e W /2π-=式中的W N 称为蝶形因⼦,利⽤它的对称性和周期性可以减少运算量。
⼀般⽽⾔,FFT 算法分为时间抽取(DIT )和频率抽取(DIF )两⼤类。
两者的区别是蝶形因⼦出现的位置不同,前者中蝶形因⼦出现在输⼊端,后者中出现在输出端。
本实验以时间抽取⽅法为例。
时间抽取FFT 是将N 点输⼊序列x(n) 按照偶数项和奇数项分解为偶序列和奇序列。
偶序列为:x(0), x(2), x(4),…, x(N-2);奇序列为:x(1), x(3), x(5),…, x(N-1)。
这样x(n) 的N 点DFT 可写成:()()∑++∑=-=+-=12/0)12(12/02122)(N n kn NN n nkNW n x Wn x k X考虑到W N 的性质,即2/)2//(22/)2(2][N N j N j N W e e W ===--ππ因此有:()()∑++∑=-=-=12/02/12/02/122)(N n nkN k NN n nkN W n x WWn x k X或者写成:()()k Z W k Y k X kN +=)(由于Y(k) 与Z(k) 的周期为N/2,并且利⽤W N 的对称性和周期性,即:k N N k N W W -=+2/可得:()()k Z W k Y N k X k N -=+)2/(对Y(k) 与Z(k) 继续以同样的⽅式分解下去,就可以使⼀个N 点的DFT 最终⽤⼀组2点的DFT 来计算。
快速傅立叶变换(FFT)算法-DSP实验

快速傅立叶变换(FFT)算法实验摘要:FFT(Fast Fourier Transformation),即为快速傅里叶变换,是离散傅里叶变换的快速算法,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
这种算法大大减少了变换中的运算量,使得其在数字信号处理中有了广泛的运用。
本实验主要要求掌握在CCS环境下用窗函数法设计FFT快速傅里叶的原理和方法;并且熟悉FFT快速傅里叶特性;以及通过本次试验了解各种窗函数对快速傅里叶特性的影响等。
引言:快速傅里叶变换FFT是离散傅里叶变换DFT的一种快速算法。
起初DFT的计算在数字信号处理中就非常有用,但由于计算量太大,即使采用计算机也很难对问题进行实时处理,所以并没有得到真正的运用。
1965年J.W.库利和T.W.图基提出快速傅里叶变换,采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
从此,对快速傅里叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIF。
FFT 的出现,使信号分析从时域分析向频域分析成为可能,极大地推动了信号分析在各领域的实际应用。
FFT在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
一、 实验原理:FFT 并不是一种新的变换,它是离散傅立叶变换(DFT )的一种快速算法。
由于我们在计算DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。
每运算一个X (k )需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。
所以整个DFT 运算总共需要4N^2次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。
如此一来,计算时乘法次数和加法次数都是和N^2成正比的,当N 很大时,运算量是可观的,因而需要改进对DFT 的算法减少运算速度。
实验七快速傅立叶变换(FFT)算法的DSP实现(C语言)

实验七快速傅⽴叶变换(FFT)算法的DSP实现(C语⾔)实验七快速傅⽴叶变换(FFT )算法的DSP 实现(C 语⾔)⼀、实验⽬的1.掌握FFT 算法的基本思想。
2.掌握利⽤ CCS 软件中的dsplib 库进⾏fft 算法的程序设计⼆、实验环境1.奔腾IV 计算机2.Code Composer Studio (CCS)软件三、实验原理1.FFT 算法的基本思想对于序列 x[n](0≤n ≤N-1),其频谱为:X(k)=DFT[x(n)]=∑-=10)(N n kn N Wn x (0≤n ≤N-1),其中:旋转因⼦---=-N j N e W π2在x[n]为复数序列的情况下,完全可以直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次复数加法。
因此,对于⼀些相当⼤的N 值来说,直接计算它的DFT 所需计算量很⼤。
FFT (快速傅⽴叶变换)的基本思想为:将原来的N 点序列最终分成分成两点为⼀组序列,并将这些序列的DFT 通过蝶形运算(见下图)组合起来得到原序列的DFT 。
N 点FFT 仅需 N N 2log 2次复数乘法和N N 2log 次复数加法。
图1 8点FFT 运算流图2. ccs 软件中dsplib (信号处理库)简介TMS320C54X 系列函数库(DSPLIB )是对C 语⾔编程可调⽤优化的DSP 函数库,它含有50个通⽤⽬的的信号处理程序,全部由汇编语⾔编写,并可由C 语⾔调⽤,⽅便C 语⾔与汇编语⾔混合编程。
这些程序⽤在计算强度⼤、执⾏速度重要的实时运算中。
通过使⽤这些程序,可以取得较⽤C 语⾔编写的相关程序快的多的运⾏速度,另外通过使⽤现成的程序可以使开发速度⼤⼤加快。
DSPLIB 可进⾏的运算有:FFT 运算、滤波与卷积运算、⾃适应滤波运算、相关运算、数学函数运算、三⾓函数运算、矩阵运算等。
dsplib 位于C:\ti\c5400\dsplib其⽤户⼿册为:TMS320C54x dsp library programer's reference.pdf三、实验内容1.信号x(n)是2个频率分别为1kHz 和2kHz 余弦信号的合成,取样频率为fs=16000Hz,采⽤FFT 对该信号进⾏频域分析。
基于DSP的FFT算法实现

基于DSP的FFT算法实现1、FFT的原理快速傅氏变换(FFT)是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N2次运算。
当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。
这样变换以后,总的运算次数就变成N+2(N/2)2=N+N2/2。
继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
数字信号处理器(DSP)是一种可编程的高性能处理器,近年来发展很快.它不仅适用于数字信号处理,而且在图像处理、语音处理、通信等领域得到了广泛的应用.通用的微处理器在运算速度上很难适应信号实时处理的要求.联沪处理器中集成有高速的乘法器硬件,能快速地进行大量数据的乘法和加法运算。
快速傅里叶变换(FFT)的出现使得DFr在实际应用中得到了广泛的应用.2、基于DSP的FFT算法实现用C语言实现FFT算法/*****************fft programe*********************/#include "typedef.h"#include "math.h"struct compx EE(struct compx b1,struct compx b2){struct compx b3 ;b3.real=b1.real*b2.real-b1.imag*b2.imag ;b3.imag=b1.real*b2.imag+b1.imag*b2.real ;return(b3);}void FFT(struct compx*xin,int N){int f,m,nv2,nm1,i,k,j=1,l ;/*int f,m,nv2,nm1,i,k,j=N/2,l;*/struct compx v,w,t ;nv2=N/2 ;f=N ;for(m=1;(f=f/2)!=1;m++){;}nm1=N-1 ;/*变址运算*/for(i=1;i<=nm1;i++){if(i<j){t=xin[j];xin[j]=xin[i];xin[i]=t ;}k=nv2 ;while(k<j){j=j-k ;k=k/2 ;}j=j+k ;}{int le,lei,ip ;float pi ;for(l=1;l<=m;l++){le=pow(2,l);// 这里用的是L而不是1lei=le/2 ;pi=3.14159 ;v.real=1.0 ;v.imag=0.0 ;w.real=cos(pi/lei);w.imag=-sin(pi/lei);for(j=1;j<=lei;j++){/*double p=pow(2,m-l)*j;double ps=2*pi/N*p;w.real=cos(ps);w.imag=-sin(ps);*/for(i=j;i<=N;i=i+le){/* w.real=cos(ps);w.imag=-sin(ps);*/ip=i+lei ;t=EE(xin[ip],v);xin[ip].real=xin[i].real-t.real ;xin[ip].imag=xin[i].imag-t.imag ;xin[i].real=xin[i].real+t.real ;xin[i].imag=xin[i].imag+t.imag ;}v=EE(v,w);}}}return ;}/*****************main programe********************/#include<math.h>#include<stdio.h>#include<stdlib.h>#include "typedef.h"float result[257];struct compx s[257];int Num=256 ;const float pp=3.14159 ;main(){int i=1 ;for(;i<0x101;i++){s[i].real=sin(pp*i/32);s[i].imag=0 ;}FFT(s,Num);for(i=1;i<0x101;i++){result[i]=sqrt(pow(s[i].real,2)+pow(s[i].imag,2));}}3、ICETEK-F2812-A的实验板调试步骤1.实验准备(1)连接实验设备:(2)准备信号源进行A D 输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];
float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];{DATA[i Nhomakorabea=w[i];
}
while ( 1 ); // break point
}
void InitForFFT()
{
int i;
for ( i=0;i<SAMPLENUMBER;i++ )
{
sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);
cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);
for ( i=0;i<SAMPLENUMBER;i++ )
{
x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&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;i<SAMPLENUMBER;i++ )
{
dataR[i]=dataI[i]; dataI[i]=0;
}
/************** following code FFT *******************/
3.实验中我们遇到了不少的问题,但我们经过细致的检查,一一解决了问题,我想这说明了两个问题:
(1)做实验时不够细心,导致问题百出,这个问题我想必须注意。
(2)类比能力很差,之前的做实验过程中部分步骤做过,相关问题也出现过,但没有好好吸取教训。
4.经过本次试验,我想我收获很多,首先是对于FFT的理解以及应用,再者对于个人能力的提高有很大帮助。
#include "f2812a.h"
#include"math.h"
#define PI 3.1415926
#define SAMPLENUMBER 128
void InitForFFT();
void MakeWave();
/ oid FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]);
(1)如上图第一次蝶形运算间隔为一,如第一个和第二个,第三个和第四个,以此类推;
第二次间隔为二,如第一个和第三个,第二个和第四个等
(2)基本运算单元以下面的蝶形运算为主:
计算公式如下:
(3)在FFT运算中,旋转因子WmN=cos(2πm/N)-jsin(2πm/N),求正弦和余弦函数值的计算量是很大的。
main()
{
int i;
InitForFFT();
MakeWave();
for ( i=0;i<SAMPLENUMBER;i++ )
{
fWaveR[i]=INPUT[i];
fWaveI[i]=0.0f;
w[i]=0.0f;
}
FFT(fWaveR,fWaveI);
for ( i=0;i<SAMPLENUMBER;i++ )
for ( L=1;L<=7;L++ )
{ /* for(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; i=7-L;
while ( i>0 ) /* p=pow(2,7-L)*j; */
我们观察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:
一.引言
二.实验原理
三.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)次实数加法。如此一来,计算时乘法次数和加法次数都是和N^2成正比的,当N很大时,运算量是可观的,因而需要改进对DFT的算法提高运算速度。
(4)本程序采用的输入信号为:1024*sin(2*pi*3*t),采样频率为1024
2.程序流程图:
四.实验程序
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
我们称这样的RFFT优化算法是包装算法:首先2N点实数的连续输入称为“进包”。其次N点的FFT被连续运行。最后作为结果产生的N点的合成输出是“打开”成为最初的与DFT相符合的2N点输入。
三.FFT的基本结构:
1.FFT信号流图如下:
整个过程共有log2N次,每次分组间隔为2^(L-1)----------------1=<L<=log2N
图1
图2
图3
3.清除显示:在以上打开的窗口中单击鼠标右键,选择弹出式菜单中“Clear Display”功能。
4.设置断点:在程序FFT.c中有注释“break point”的语句上设置软件断点。
图4
5.运行并观察结果。
⑴选择“Debug”菜单的“Animate”项,或按Alt+F5键运行程序。
⑵观察“Test Wave”窗口中时域图形;
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
{
p=p*2; i--;
}
p=p*j;
for ( k=j;k<128;k=k+2*b ) /* for (3) */
{
TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
3.未能出现想要的图像
经过仔细检查,浏览了程序后,发现断点设置有些问题,改正后问题解决,显示正确图像。
九.实验体会
1.本次试验详细的介绍了FFT的特点和原理,以及设计方法,通过实验充分展示了FFT快速傅里叶变换相比于普通的算法的明显优点。
2.通过本次试验,我想我们已经熟练的掌握了FFT快速傅里叶变换的方法,在今后的学习中,可以熟练地运用这一方法解决实际的问题,这对于我们来说至本次实验带给我们的最好的礼物。
图5
⑶在“Test Wave”窗口中点击右键,选择属性,更改图形显示为FFT。观察频域图形。
图6
⑷观察“FFT”窗口中的由CCS计算出的正弦波的FFT。
图7
六.实验结果
通过观察频域和时域图,程序计算出了测试波形的功率谱,与CCS计算的FFT结果相近。
七.结果分析
(1)观察图6和图7,可以看到二者波形相似,但横纵坐标均不相同,纵坐标大约是二倍的关系,横坐标大约为142倍。
}
}
void MakeWave()
{
int i;
for ( i=0;i<SAMPLENUMBER;i++ )
{
INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024;
}
}
五.调试过程与步骤
1.编译并下载程序。
2.打开观察窗口:
*选择菜单View->Graph->Time/Frequency…进行如下图所示设置。
void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER])
{
int x0,x1,x2,x3,x4,x5,x6,xx;
int i,j,k,b,p,L;