DSP大作业快速傅立叶变换实验与设计

合集下载

快速傅里叶变换(FFT)的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-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

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)的实现(汇编语言)

(完整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

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的快速傅里叶变换

基于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)的实现(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 输出一致。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);出的图为得六、总结信号频率和采样频率之间需要满足奈奎斯特采样定理。

相关文档
最新文档