DSP大作业快速傅立叶变换实验与设计
快速傅里叶变换(FFT)的DSP实现
目录一、前言二、设计题目三、设计要求3.1 设计目的3.2 设计要求四、设计内容五、设计原理5.2 离散傅里叶变换DFT5.3 快速傅里叶变换FFT六、总体方案设计6.1 设计有关程序流程图6.2 在CCS环境下加载、调试源程序七、主要参数八、实验结果分析九、设计总结一、前言随着数字电子技术的发展,数字信号处理的理论和技术广泛的应用于通讯、语音处理、计算机和多媒体等领域。
快速傅里叶变换(FFT)使离散傅里叶变换的时间缩短了几个数量级。
在数字信号处理领域被广泛的应用。
FFT已经成为现代化信号处理的重要手段之一。
本次课程设计主要运用CCS这一工具。
CCS(Code Composer Studio)是一种针对TM320系列DSP的集成开发环境,在Windows操作系统下,采用图形接口界面,提供环境配置、源文件编辑、程序调试、跟踪和分析等工具,可以帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。
CCS有两种工作模式,即软件仿真器和硬件在线编程。
软件仿真器工作模式可以脱离DSP芯片,在PC上模拟DSP的指令集和工作机制,主要用于前期算法实现和调试。
硬件在线编程可以实时运行在DSP芯片上,与硬件开发板相结合进行在线编程和调试应用程序。
二、设计题目快速傅里叶变换(FFT)的DSP实现三、设计要求3.1设计目的⑴加深对DFT算法原理和基本性质的理解;⑵熟悉FFT的算法原理和FFT子程序的算法流程和应用;⑶学习用FFT对连续信号和时域信号进行频谱分析的方法;⑷学习DSP中FFT的设计和编程思想;⑸学习使用CCS 的波形观察器观察波形和频谱情况;3.2 基本要求⑴研究FFT 原理以及利用DSP 实现的方法;⑵编写FFT 程序;⑶调试程序,观察结果。
四、 设计内容⑴用DSP 汇编语言及C 语言进行编程;⑵实现FFT 运算、对输入信号进行频谱分析。
五、 设计原理快速傅里叶变换FFT快速傅里叶变换(FFT )是一种高效实现离散傅里叶变换(DFT )的快速算法,是数字信号处理中最为重要的工具之一,它在声学,语音,电信和信号处理等领域有着广泛的应用。
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快速傅立叶计算。
DSP实验3
实验三 快速傅里叶变换 FFT一、实验目的1.理解DFT 算法,并能用MATLAB 实现DFT 。
2. 加深对FFT 的理解,体会DFT 和FFT 之间的关系。
3.熟悉应用FFT 实现两个序列的线性卷积的方法。
二、实验原理N 点序列x(n) 的DFT 和IDFT 定义:若将DFT 变换的定义写成矩阵形式,则得到X=A ﹒x ,其中DFT 变换矩阵A 为⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧=---2)1(111...1...............11...11N N N N N N N W W W W A 可以用函数U=fft(u,N)和u=ifft(U,N)计算N 点序列的DFT 正、反变换。
三、实验内容(一)离散傅里叶变换(DFT )1.用MATLAB 求N=16的有限序列)4/sin()8/sin()(ππn n n x +=的DFT 结果,并画出结果图。
参考程序如下:N=16;n=0:1:N-1; %时域采样xn=sin(n*pi/8)+sin(n*pi/4);k=0:1:N-1; %频域采样WN=exp(-j*2*pi/N);nk=n'*k;WNnk=WN.^nk;Xk=xn*WNnk;subplot(2,1,1)stem(n,xn);subplot(2,1,2)stem(k,abs(Xk));2.矩形序列x(n)=R(n),求N分别取8,32时的DFT,最后绘出结果图形。
5参考程序如下:function[Xk]=dft(xn,N)n=[0:1:N-1]; %n的行向量k=[0:1:N-1]; %k的行向量WN=exp(-j*2*pi/N); %旋转因子nk=n'*k; %产生一个含nk值的N乘N维矩阵WNnk=WN.^nk; %DFT矩阵Xk=xn*WNnk; %DFT系数的行向量调用上面函数解题。
N=8;x=[ones(1,5),zeros(1,N-5)];n=0:N-1;X=dft(x,N); %N=8点离散傅立叶变换magX=abs(X);phaX=angle(X)*180/pi;k=(0:length(magX)'-1)*N/length(magX);subplot(2,2,1);stem(n,x);ylabel('x(n)');subplot(2,2,2);stem(k,magX);axis([0,10,0,5]);ylabel('|X(k)|');N=32;x=[ones(1,5),zeros(1,N-5)];n=0:N-1;X=dft(x,N); %N=32点离散傅立叶变换magX=abs(X);phaX=angle(X)*180/pi;k=(0:length(magX)'-1)*N/length(magX);subplot(2,2,3);stem(n,x);ylabel('x(n)');subplot(2,2,4);stem(k,magX);axis([0,32,0,5]);ylabel('|x(k)|');(二)快速傅里叶变换(FFT)1.已知一个8点的时域非周期离散阶跃信号,n1=0,n2=7,在n0=4前为0,n0以后为1。
(完整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 求它们的平方和,然后对平方和进行开平方运算。
快速傅里叶变换(含详细实验过程分析)
一、实验目的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 的对称性和周期性,即:k N N k N W W -=+2/可得:()()12(/2)kN X k N X k W X k +=-对X 1(k) 与X 2(k)继续以同样的方式分解下去,就可以使一个N 点的DFT 最终用一组2点的DFT 来计算。
DSP实验5
实验五:快速傅里叶变换(FFT)实验目的:快速傅立叶变换并不是一种新的变换方法,它是计算DFT的一种有效算法。
它是信号谱分析的有力工具,通过本次实验,学习使用FFT分析信号的方法,加深对FFT的理解。
实验任务:1.通过实际例子学习使用FFT 分析信号的方法。
2.通过采样点数的不同,了解对信号幅度谱的影响。
3.编程实现某一序列的FFT。
例1:模拟信号x(t)=2 sin(4πt)+5cos(8πt),t=0.01n(n=0:N-1)进行取样,求N点DFT的幅值谱。
N分别为(1)N=15;(2)N=25;(3)N=35;(4)N=55 解MATLAB程序为exam51.m:% Example%figure(1)subplot (2,2,1)N=15;n=0:N-1;t=0.01*n;q=n*2*pi/N;x=2*sin(4*pi*t)+5*cos(8*pi*t);y=fft(x,N);plot(q,abs(y))title('FFT N=15')%subplot(2,2,2);N=25;n=0:N-1;t=0.01*n;q=n*2*pi/N;x=2*sin(4*pi*t)+5*cos(8*pi*t);y=fft(x,N);plot(q,abs(y));title('FFT N=25');%subplot (2,2,3)N=35;n=0:N-1;t=0.01*n;q=n*2*pi/N;x=2*sin(4*pi*t)+5*cos(8*pi*t);y=fft(x,N);plot(q,abs(y))title('FFT N=35')%subplot (2,2,4)N=55;n=0:N-1;t=0.01*n;q=n*2*pi/N;x=2*sin(4*pi*t)+5*cos(8*pi*t);y=fft(x,N);plot(q,abs (y))title('FFT N=55')执行后可得如图所示的信号谱。
基于DSP的快速傅里叶变换
基于DSP的快速傅里叶变换1.简介快速傅氏变换(FFT),是离散傅氏变换的快速算法,是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
FFT是一种高效实现离散傅里叶变换(DFT)的快速算法,是数字信号处理中最为重要的工具之一,它在声学,语音,电信和信号处理等领域有着广泛的应用。
DSP是专门用来处理数字信号的处理器,用它来进行FFT信号处理可以大大缩短运算时间,从而保证系统有较好的实时性。
2.系统设计2.1 DSP采用TMS320F28335为核心的DSP开发板。
TMS320F28335可以用来做数字信号处理和一些简单的控制应用,其核心具有如下几个特点:(1)32位浮点处理器,高性能,高速度;(2)最高时钟频率150MHz,时钟周期6.67ns;(3)低功耗设计,核心电压1.9V,I/O电压3.3V;(4)哈佛总线架构;(5)快速中断响应和处理;(6)高效代码;(7)片内:RAM 34K FLASH 256K;(8)3个32为CPU定时器;(9)16通道12位AD转换:80ns快速转换时间,0~3V输入范围;(10)提供1路2.048V外部精准参考电压,ADCINA1~ADCINA8设计有信号预处理电路;(11)12路PWM输出信号;(12)4路CAP捕获信号;(13)2个QEP正交编码器输入通道;(14)1个SPI同步串口,2个SCI异步串口,1个CAN口,1个2I C口,1个McBSP同步串口,6通道DMA。
2.2 集成开发环境CCS3.3CCS(Code Composer Studio)是美国德州仪器公司(Texas Instrument,TI)出品的代码开发和调试套件,可用于DSP(数字信号处理器)和MCU(微处理器)的开发和调试。
CCS提供环境配置、源程序编辑、编译连接、跟踪分析等各个环节,以加速软件开发进程,提高工作效率。
它把软、硬件开发工具集成在其中,使程序的编写、汇编、软硬件仿真和调试等开发工作在同一的环境中进行,给DSP开发工作带来极大的方便。
快速傅立叶变换(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)
实验九快速傅立叶变换(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实验报告(二)
DSP实验报告(二)实验二应用FFT对信号进行频谱分析一、实验目的1、在理论学习的基础上,通过本次实验,加深对快速傅里叶变换的理解,熟悉FFT算法及其程序的编写。
2、熟悉应用FFT对典型信号进行频谱分析的方法。
3、了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。
二、实验原理与方法①一个连续信号的频谱可以用它的傅立叶变换表示为+ Xa(jW)=-jWtx(t)edtòa-如果对该信号进行理想采样,可以得到采样序列x(n)=xa(nT)同样可以对该序列进行z变换,其中T为采样周期X(z)=+ x(n)z-n+ -令z为ejw,则序列的傅立叶变换X(ejw)=x(n)ejwn-其中ω为数字频率,它和模拟域频率的关系为w=WT=W/fs式中的是采样频率。
上式说明数字频率是模拟频率对采样率的归一化。
同模拟域的情况相似。
数字频率代表了序列值变化的速率,而序列的傅立叶变换称为序列的频谱。
序列的傅立叶变换和对应的采样信号频谱具有下式的对应关系。
1X(e)=Tjw+ - w-2pXa(j)T即序列的频谱是采样信号频谱的周期延拓。
从式可以看出,只要分析采样序列的谱,就可以得到相应的连续信号的频谱。
注意:这里的信号必须是带限信号,采样也必须满足Nyquist定理。
在各种信号序列中,有限长序列在数字信号处理中占有很重要的地位。
无限长的序列也往往可以用有限长序列来逼近。
有限长的序列可以使用离散傅立叶变换。
当序列的长度是N时,定义离散傅立叶变换为:X(k)=DFT[x(n)]=其中W=e2pj-NN-1n=0WNkn它的反变换定义为:1x(n)=IDFT[X(k)]=N根据式和,则有N-1n=0X(k)WNknX(z)|z=Wnk=NN-1n=0x(n)WNnk=DFT[x(n)]j2pN可以得到X(k)2pk的点,就NN是将单位圆进行N等分以后第k个点。
所以,X(k)是z变换在单位圆上的等距采样,或者说是序列傅立叶变换的等距采样。
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算法设计
毕业设计(论文)学院名称学院名称专业名称专业名称学生学号学生学号学生姓名学生姓名指导教师教授姓名助理指导老师老师姓名202 年月快速傅里叶变换的DSP算法设计摘要数字信号处理(Digital Signal Processing,DSP)是一门应用十分广泛的学科。
DSP 是指利用计算机技术,以数字形式对信号进行采集、变换、压缩、滤波、估值、增强、识别等处理,得到符合设计者心愿的波形。
数字信号处理器也被称为DSP芯片,是一种用于进行DSP运算的微型处理器,主要功能是实时快速的实现各种数字信号处理算法和各种复杂控制算法。
本文采用高级C语言来实现FFT算法。
并且利用数字信号处理芯片专门的FFT指令和特有的哈佛结构。
可以使FFT在DSP上可以更快速的实现,进而促进了DSP芯片的发展,同时加快了基于DSP数字信号处理的速度。
通过对FFT 算法的研究,从基础开始深入研究与学习,并掌握FFT算法的关键。
研究数字信号处理芯片怎样可以加快蝶形运算以及如何更加有效的码位倒置的输出颠倒过来。
并且熟悉旋转因子的生成。
通过学习数字信号处理芯片的工作原理,和分析DSP的控制算法,并在芯片上实现FFT算法的设计。
通过对DSP开发环境的学习,掌握了CCS的简单调试和软件仿真。
在CCS开发环境中,观察正弦波输入、输出波形,PC机FFT计算处理之后的仿真波形。
再比较仿真波形图,验证设计、程序的正确性。
证明运用DSP特有的反序间接寻址让FFT实现的更加方便。
关键词:数字信号处理;快速傅里叶变换;蝶形运算Fast Fourier Transform of DSP Algorithm DesignAbstractDigital signal processing (Digital Signal Processing, DSP) is a very broad application of discipline. DSP is the use of computer technology in digital form for signal acquisition, conversion, compression, filtering, valuation, enhanced recognition process, get in line with the wishes of the waveform designers. Also known as digital signal processor DSP chip, a microprocessor is used for DSP operations, the main function is to quickly achieve a variety of real-time digital signal processing algorithms and a variety of complex control algorithms. In this paper, to achieve high-level C language FFT algorithm. And the use of digital signal processing chip FFT specialized instruction and unique Harvard architecture. FFT can make more rapid implementation in the DSP, thus contributing to the development of DSP chips, while accelerating the speed of DSP-based digital signal processing.Through the study of FFT algorithm starting from basic research and in-depth study and master the key FFT algorithm. Study how digital signal processing chip can speed butterfly operation and how to be more efficient code bits inverted output reversed. And familiar with the twiddle factor generation. It works by studying digital signal processing chip, and analysis DSP control algorithm, FFT algorithm design and implement on a chip. DSP development environment by learning to master a simple debugging and software simulation of CCS. In the CCS development environment, observe sine wave input, the output waveform, PC machine simulation waveform FFT calculation processing later. Then compare the simulation waveform diagram to verify the correctness of the design, the program. Demonstrate the use of DSP-specific reverse order indirection let FFT implementations easier.Key words: DSP; FFT; butterfly operation目录1 绪论 (1)1.1 课题研究的背景 (1)1.2 课题研究的意义 (2)1.3 本文主要研究内容 (2)2 快速傅里叶变换及其算法 (3)2.1 快速傅里叶变换的原理 (3)2.1.1 离散傅里叶变换的介绍及FFT的发展 (3)2.1.2 FFT原理 (6)2.2 快速傅里叶变换算法 (6)3 软件设计 (13)3.1 算法设计和程序编写 (13)3.1.1 算法设计流程 (13)3.1.2 程序编写 (13)3.2 CCS 开发环境的使用及软件仿真 (17)3.2.1 CCS 开发环境的使用 (17)3.3 CCS 软件仿真 (20)4 DSP 芯片的原理和 FFT 在 DSP 上的实现 (23)4.1 DSP 芯片的原理、特点和结构 (23)4.1.1 DSP 芯片的介绍 (23)4.1.2 DSP 芯片的分类 (23)4.1.3 DSP芯片的特点 (24)4.1.4 DSP芯片的选择 (24)4.1.5 TMS320C6000 芯片的结构特点 (25)4.2 FFT算法在DSP上的实现 (26)结论 (28)致谢 (29)参考文献 (30)附录 (31)1 绪论1.1 课题研究的背景近十几年来数字信号处理技术、大规模集成电路以及数字计算机等,发生了突飞猛进的发展,俨然已经成为了一门具有强大生命力的科学技术。
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来计算。
快速傅立叶变换(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 的算法减少运算速度。
DSP大作业-快速傅立叶变换(FFT)算法实验
《DSP原理及应用》大作业专业:电子信息工程姓名:学号:快速傅立叶变换(FFT)算法实验一、摘要基于CCS的DSP算法仿真实验设计简要介绍了CCS软件的主要功能, 利用CCS软件, 设计数字信号处理实验课程, 实现了FFT算法实验二、引言在当今的数字化时代背景下, DSP控制器以其可靠性高、扩充能力强、可维护性能好,可满足多种场合的应用需要,得到了国内外电子信息界和控制方案支持企业的青睐,被公认为控制实现技术的发展方向。
DSP已成为通信、计算机、消费类电子产品等领域的基础器件,被誉为信息社会革命的旗手。
三.实验原理1.FFT 的原理和参数生成公式:公式(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实验报告5
实验4.3 :快速傅立叶变换(FFT)算法一.实验目的1.掌握快速傅里叶变换(FFT)算法的原理。
2. 掌握在ccs 中利用C 语言编程实现FFT 算法对信号进行频域分析。
二.实验设备计算机,ICETEK-VC5509-A 实验箱及电源。
三.实验原理1.FFT 算法的原理:对于序列 x[n](0≤n ≤N-1),其频谱为: X(k)=DFT[x(n)]=∑-=1)(N n kn NWn x (0≤n ≤N-1),其中:旋转因子---=-NjN eW π2在x[n]为复数序列的情况下,完全可以直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次复数加法。
因此,对于一些相当大的N 值来说,直接计算它的DFT 所需计算量很大。
FFT (快速傅立叶变换)的基本思想为:将原来的N 点序列最终分成分成两点为一组序列,并将这些序列的DFT 通过蝶形运算(见下图)组合起来得到原序列的DFT 。
N 点FFT 仅需N N 2log 2次复数乘法和NN 2log 次复数加法。
8点FFT 运算流图2.程序流程图四.实验内容1.实验准备:设置软件仿真模式,参看:第二部分、第一章、四、1。
2.打开工程:C:\ICETEK\VC5509Ae\VC5509Ae\Lab0503-FFT\FFT.pjt。
//主程序:fft.c中的主要语句:main(){int i;InitForFFT(); // FFT系数初始化MakeWave(); // 产生输入正弦信号for ( i=0;i<SAMPLENUMBER;i++ ){fWaveR[i]=INPUT[i];fWaveI[i]=0.0f;w[i]=0.0f;}FFT(fWaveR,fWaveI); // 调用fft子程序计算输入信号的幅频谱,存入w数组for ( i=0;i<SAMPLENUMBER;i++ ){DA TA[i]=w[i]; //将w的数据存入输出信号数组DATA中}while ( 1 ); //无限循环,在此加断点}3.下载运行该程序。
实验七快速傅立叶变换(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实验大报告 (1)
快速傅里叶变换(FFT )一、摘要离散傅里叶变换(DFT )为数字信号频域分析提供了有利的变换工具,但其直接实现计算量大,计算时间长,快速傅里叶变换(FFT )的提出使得DFT 在数字信号处理领域的应用成为现实. 二、引言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 的算法减少运算速度。
三、实验原理对于一个长度为N 的有限长序列x(n),其DFT 的运算为:)(k X =)]([n x DFT =∑-=-12)(N n nkjNen x π =∑-=1)(N n nkNW n x , 10-≤≤N k)]([)(k X IDFT n x ==∑-=112)(N k knjNNek X π=∑-=-1)(N n knNW n x , 10-≤≤N n其中,eNjπ2-=W N 。
由这种方法计算DFT 对于)(k X 的每个k 值,需要进行4N 次实数相乘和(4N-2)次相加,对于N 个k 值,共需N*N 乘和N (4N-2)次实数相加。
改进DFT 算法,减小它的运算量,利用DFT 中knN W 的周期性和对称性,使整个DFT 的计算变成一系列迭代运算,可大幅度提高运算过程和运算量,这就是FFT 的基本原理。
设N 点序列x(n), N=2M,将x(n)按奇偶分组,有)2(I X =∑-=++1222)]()([N n InN W n x n x , 3,2,1=I ,……12-N)12(+I X =nN n InNN W W n x n x N ∑-=+-1222)]()([ , 3,2,1=I ,……12-N改写为 )()(21k X W k X k N + ,102-≤≤Nk一个N 点DFT 分解为两个 N/2点的DFT, )(1k X 和)(2k X 。
dsp算法实验
第七章5402算法实验指导实验一快速傅立叶变换(FFT)算法实验一.实验目的1.加深对DFT算法原理和基本性质的理解;2.熟悉FFT算法原理和FFT子程序的应用;3.学习用FFT对连续信号和时域信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确应用FFT。
二.实验设备计算机,CCS 2.0 版软件,实验箱,DSP仿真器。
三.基本原理1.离散傅立叶变换DFT的定义:将时域的采样变换成频域的周期性离散函数,频域的采样也可以变换成时域的周期性离散函数,这样的变换称为离散傅立叶变换,简称DFT。
2.FFT是DFT的一种快速算法,将DFT的N2步运算减少为(N/2)log2N步,极大的提高了运算的速度。
3.旋转因子的变化规律。
4.蝶形运算规律。
5.基2FFT算法。
四.实验步骤1.复习DFT的定义、性质和用DFT作谱分析的有关内容;2.复习FFT算法原理与编程思想,并对照DIT-FFT运算流程图和程序框图,了解本实验提供的FFT子程序;3.阅读本实验所提供的样例子程序;4.运行CCS软件,对样例程序进行跟踪,分析结果;记录必要的参数。
5.填写实验报告。
6.提供样例程序实验操作说明A.实验前准备:1)启动CCS2.0,并打开“ALGORITHM\EXP01_fft\exp01.pjt”工程文件;2)“A/D转换单元”的拨码开关如下设置:2OFF:3 ON:4 OFF:5 OFF:6 ON:SW2备注1 2 3 4 码位OFF OFF OFF OFF 使用默认中断分配码位备注1 OFF2OFF3)用导线连接“信号源”2号孔“信号源1”和“A/D单元”2号孔“ADIN1”模拟信号源左路调到3V,9KHz左右,正弦波。
正确完成计算机、DSP仿真器和实验箱的连接后,系统上电。
B.实验启动CCS 2.0,Project/Open打开“Algorithm”目录中“exp01_fft”子目录下“exp01.pjt”工程文件;双击“exp01.pjt”及“Source”可查看各源程序;加载“exp01.out”;在中断子程序中,t=0处设置断点;单击“Run”运行程序,程序将运行至断点处停止;用View / Graph / Time/Frequency打开一个图形观察窗口;设置该观察图形窗口变量及参数;采用双踪观察在启始地址分别为0x1f00h和0x1f80h,长度为128的单元中数值的变化,数值类型为16位有符号整型变量,这两段存储单元中分别存放的是经A/D转换后的语音信号和对该信号进行FFT变换的结果;单击“Animate”运行程序,或按F10运行;调整观察窗口并观察输入信号波形及其FFT变换结果;单击“Halt”暂停程序运行,关闭窗口,本实验结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP 原理及应用大作业——快速傅立叶变换专业:XXXX 姓名:XXX 学号:08201081XX 指导老师:XX 时间:2XXXX快速傅立叶变换(FFT )实验一、设计目的1.在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉FFT子程序。
2.熟悉应用FFT对典型信号进行频谱分析的方法3•了解应用FFT进行信号频谱分析过程中可能出现的问题以便在实际中正确应用FFT。
4.掌握用窗函数法设计FFT快速傅里叶的原理和方法;5 •熟悉FFT快速傅里叶特性;二、所需设备PC 兼容机一台,操作系统为Windows2000(或Windows98 , WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.0 软件。
三、设计内容本试验要求使用FFT变换求一个时域信号的频域特性,并从这个频域特性求出该信号的频率值。
使用c语言实现对FFT算法的仿真,然后使用DSP汇编语言实现对FFT 的DSP 编程。
本实验采用软件仿真,不需设置硬件。
四、设计原理在各种信号序列中,有限长序列信号处理占有很重要地位,对有限长序列,我们可以使用离散Fouier变换(DFT)。
这一变换不但可以很好的反映序列的频谱特性,而且易于用快速算法在计算机上实现,当序列x(n)的长度为N时,它的DFTN 1 1 N-1X(k)=》x(nW,n⑷x(n)=石送X(kW「n定义为:心,WN =e反换为:N心有限长序列的DFT是其Z变换在单位圆上的等距采样,或者是序列Fourier变换的等距采样,因此可以用于序列的谱分析。
FFT并不是与DFT不同的另一种变换,而是为了减少DFT运算次数的一种快速算法。
它是对变换式进行一次次分解,使其成为若干小点数的组合,从而减少运算量。
常用的FFT是以2为基数的,其长度N=2L,它的效率高,程序简单使用非常方便,当要变换的序列长度不等于2的整数次方时,为了使用以2为基数的FFT,可以用末位补零的方法,使其长度延长至2的整数次方。
在运用DFT进行频谱分析的过程中可能产生几种问题:⑴混叠序列的频谱时被采样信号的周期延拓,当采样速率不满足Nyquist定理时,就会发生频谱混叠,使得采样后的信号序列频谱不能真实的反映原信号的频谱。
避免混叠现象的唯一方法是保证采样速率足够高,使频谱混叠现象不致出现,即在确定采样频率之前,必须对频谱的性质有所了解,在一般情况下,为了保证高于折叠频率的分量不会出现,在采样前,先用低通模拟滤波器对信号进行滤波。
⑵泄漏实际中我们往往用截短的序列来近似很长的甚至是无限长的序列,这样可以使用较短的DFT来对信号进行频谱分析,这种截短等价于给原信号序列乘以一个矩形窗函数,也相当于在频域将信号的频谱和矩形窗函数的频谱卷积,所得的频谱是原序列频谱的扩展。
泄漏不能与混叠完全分开,因为泄漏导致频谱的扩展,从而造成混叠。
为了减少泄漏的影响,可以选择适当的窗函数使频谱的扩散减至最小。
DFT是对单位圆上Z变换的均匀采样,所以它不可能将频谱视为一个连续函数,就一定意义上看,用DFT来观察频谱就好像通过一个栅栏来观看一个图景一样,只能在离散点上看到真实的频谱,这样就有可能发生一些频谱的峰点或谷点被尖桩的栅栏”所拦住,不能别我们观察到。
减小栅栏效应的一个方法就是借助于在原序列的末端填补一些零值,从而变动DFT的点数,这一方法实际上是人为地改变了对真实频谱采样的点数和位置,相当于搬动了每一根尖桩栅栏”的位置,从而使得频谱的峰点或谷点暴露出来。
用FFT可以实现两个序列的圆周卷积。
在一定的条件下,可以使圆周卷积等于线性卷积。
一般情况,设两个序列的长度分别为N1和N2,要使圆周卷积等于线性卷积的充要条件是FFT的长度N> N1 + N2对于长度不足N的两个序列,分别将他们补零延长到N。
当两个序列中有一个序列比较长的时候,我们可以采用分段卷积的方法。
有两种方法:重叠相加法。
将长序列分成与短序列相仿的片段,分别用FFT对它们作线性卷积,再将分段卷积各段重叠的部分相加构成总的卷积输出。
重叠保留法。
这种方法在长序列分段时,段与段之间保留有互相重叠的部分,在构成总的卷积输出时只需将各段线性卷积部分直接连接起来,省掉了输出段的直接相加。
(3)栅栏效应DFT是对单位圆上z变换的均匀采样,所以它不可能将频谱视为一个连续函数,从某种意义上讲,用DFT来观察频谱就如同通过一个栅栏来观看景象一样,只能在离散点上看到真实的频谱,这样一些频谱的峰点或谷点就可能被"尖桩的栅栏"挡住,也就是正好落在两个离散采样点之间,不能被观察到。
减小栅栏效应的一个方法是在原序列的末端填补一些零值,从而变动DFT的点数,这一方法实际上是人为地改变了对真实频谱采样的点数和位置,相当于搬动了"尖桩栅栏"的位置,从而使得频谱的峰点或谷点暴露出来。
⑷DFT的分辨率填补零值可以改变对DTFT的采样密度,人们常常有一种误解,认为补零可以提高DFT的频率分辨率,事实上,DFT的频率分辨率通常规定为©N,这里的N 是指信号X n U勺有效长度,而不是补零的长度。
不同长度的x,n I其DTFT的结果是不同的;而相同长度的X,n I尽管补零的长度不同其DTFT的结果应是相同的,它们的DFT只是反映了对相同的DTFT采用了不同的采样密度。
总结一下:要提高DFT分辨率只有增加信号X,n I的截取长度N。
五、实验内容1、原来的程序下做出的图| QK | Cancel HelpFFT将程序改为四个节点时的程序如下:#include "myapp.h"#include "csedu.h"#include "scancode.h"#include <math.h>#define PI 3.1415926#define SAMPLENUMBER 128 void FFT(float dataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]){int x0,x1,x2,x3,xx;int i,j,k,b,p,L;float TR,TI,temp;void InitForFFT();void MakeWave();intINPUT[SAMPLENUMBER],DATA[SA MPLENUMBER]; floatfWaveR[SAMPLENUMBER],fWaveI[S AMPLENUMBER],w[SAMPLENUMB ER];float sin_tab[SAMPLENUMBER],cos_tab[S AMPLENUMBER];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++ ){DATA[i]=w[i];}while ( 1 ); // break pointfollowing code invert sequencefor( i=0;i<SAMPLENUMBER;i++ ){ x0=x1=x2=x3=0;x0=i&0x01; x1=(i/2)&0x01;x2=(i/4)&0x01; x3=(i/8)&0x01;xx=x0*8+x1*4+x2*2+x3;dataI[xx]=dataR[i];}for( i=0;i<SAMPLENUMBER;i++ ){dataR[i]=dataI[i]; dataI[i]=0;}FFTfollowing code for ( L=1;L<=4;L++ ){ /* for(1) */ b=1; i=L-1; while( i>0 ){ b=b*2; i--;} /* b= 2A(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1; i=4-L;while ( i>0p=pow(2,8-L)*j; */{p=p*2; i--;) /*p=p*j;for ( k=j;k<128;k=k+2*b ) /* for (3) */{TR=dataR[k];Tl=datal[k]; temp=dataR[k+b];dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+datal[k+b]*sin_tab[p];datal[k]=datal[k]-dataR[k+b]*sin_tab[p]+datal[k+b]*cos_tab[p];dataR[k+b]=TR-dataR[k+b]*cos_ta b[p]-datal[k+b]*sin_tab[p];datal[k+b]=TI+temp*sin_tab[p]-datal[k+b]*cos_tab[p];} /* END for (3) */} /* END for (2) */} /* END for (1) */for(i=0;i<SAMPLENUMBER/2;i++ ){w[i]=sqrt(dataR[i]*dataR[i]+datal[i] *datal[i]);} } /* END FFT */void ln itForFFT(){int i;for(i=0;i<SAMPLENUMBER;i++ ){sin_tab[i]=si n(PI*2*i/SAMPLENU MBER);cos_tab[i]=cos(PI*2*i/SAMPLENU MBER);}}void MakeWave(){int i;for(i=0;i<SAMPLENUMBER;i++ ){lNPUT[i]=s in( Pl*2*i/SAMPLENUMBER*3)*1024;}}得出的图为:3 3e+4.2 2e+4-1.1 e+4-0--1.1e+4--2.2e+4:程序改为八个节点时:#include ER];"myapp.h" float#i nclude "csedu.h" sin_tab[SAMPLENUMBER],cos_tab[S #in clude "sca ncode.h" AMPLENUMBER];#in clude <math.h>mai n()#define PI 3.1415926 {#defi ne SAMPLENUMBER 128 int i;void In itForFFT();void MakeWave();intINPUT[SAMPLENUMBER],DATA[SA MPLENUMBER]; float fWaveR[SAMPLENUMBER],fWaveI[S AMPLENUMBER],w[SAMPLENUMBIni tForFFT();MakeWave();for(i=O;i<SAMPLENUMBER;i++ ) {fWaveR[i]=INPUT[i];fWaveI[i]=0.0f; w[i]=0.0f;}FFT(fWaveR,fWaveI);for( i=0;i<SAMPLENUMBER;i++ ){DATA[i]=w[i];}while ( 1 ); // break point} void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]){int x0,x1,x2,x3,x4,x5,x6,x7,xx;int i,j,k,b,p,L;float TR,TI,temp;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;x7=(i/128)&x01;while ( i>0 ){b=b*2; i--;} /* b= 2A(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1; i=8-L;while ( i>0 ) /*p=pow(2,8-L)*j; */{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];dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];dataR[k+b]=TR-dataR[k+b]*cos_ta b[p]-dataI[k+b]*sin_tab[p];xx=x0*128+x1*64+x2*32+x3*16+x4*8+x5*4+x6*2+x7; dataI[xx]=dataR[i];}for( i=0;i<SAMPLENUMBER;i++ ){dataR[i]=dataI[i]; dataI[i]=0;}FFTfor ( L=1;L<=8;L++ ){ /* for(1) */ b=1; i=L-1;dataI[k+b]=TI+temp*sin_tab[p]-dat aI[k+b]*cos_tab[p];} /* END for (3) */} /* END for (2) */} /* END for (1) */for( i=0;i<SAMPLENUMBER/2;i++ ){w[i]=sqrt(dataR[i]*dataR[i]+dataI[i] *dataI[i]);}} /* END FFT */following code invert sequencefollowing codevoid In itForFFT(){int i;for(i=O;i<SAMPLENUMBER;i++ ) {sin_tab[i]=si n(PI*2*i/SAMPLENU void MakeWave(){int i;for(i=0;i<SAMPLENUMBER;i++ ){MBER);cos_tab[i]=cos(PI*2*i/SAMPLENUINPUT[i]=s in( PI*2*i/SAMPLENU MBER*3)*1024;MBER);出的图为得六、总结信号频率和采样频率之间需要满足奈奎斯特采样定理。