DSP-应用实例分析-课件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第8章应用实例分析TMS320C54系列DSP原理与应用教学内容及要求教学内容:本章介绍了几个DSP的应用实例,具体包括FIR滤波器、IIR滤波器、快速傅里叶变换和信号发生器等几个部分。每一部分均给出了较详细的原理说明,并对具体实现过程给出了详细分析,而且均提供了较完整的实现代码供参考。教学要求:本章要求学生了解每一个实例的基本原理和实现过程,能够在已有代码的基础上,完成相关课题的实现任务,达到举一反三的效果。本章主要内容8.1FIR滤波器的C54X实现方法8.2IIR滤波器的C54X实现方法8.3快速傅里叶变换(FFT)的C54X实现方法8.4正弦和余弦信号发生器C54X实现方法8.1FIR滤波器的C54X实现方法)1(),...,2(),1(),0(Nhhhh)1(),...,2(),1(),0(Nhhhh的冲击响应系数。因此可使用Matlab语言实现这一过程,得到滤波器的冲击相应系数;再将冲击响应系数应用到DSP汇编语言程序中,以实现上面的计算公式,就可以实现FIR滤波器,达到滤波效果。图8.1是N阶FIR滤波器的方框图。图中表明了实现滤波器的整个过程。图8.1N阶FIR滤波器的原理图8.1.2FIR滤波器程序设计1.Matlab语言编程用Matlab语言下的FDA工具箱来设计FIR滤波器,具体的使用方法可以参考相关书籍,这里给出FIR滤波器的程序以及相应的结果。function[des,wt]=taperedresp(order,ff,grid,wtx,aa)nbands=length(ff)/2:des=grid:wt=grid:fori=1:nbandsk=find(grid=ff(2*i-1)&grid=ff(2*i)):npoints=length(k):t=0:npoints-1:des(k)=linspace(aa(2*i-1),aa(2*i),npoints):ifi=1wt(k)=wtx(i)*(1.5+cos((t)*pi/(npoints-1))):elseifi=nbandswt(k)=wtx(i)*(1.5+cos(pi+(t)*pi/(npoints-1))):elsewt(k)=wtx(i)*(1.5-cos((t)*2*pi/(npoints-1))):endend[b,err,res]=gremez(53,[00.30.330.770.81],{'taperedresp',[001100]},[221]):[H,W,S]=freqz(b,1,1024):S.plot='mag':S.yunits='linear':freqzplot(H,W,S):上述程序实现了一个最接近矩形的带通FIR滤波器。程序中使用的Matlab内部函数有linspace、gremez、freqz、freqzplot等,这些函数的说明请参考Matlab的帮助文件。程序运行后的结果如图8.2所示。从图中可以看出,带通宽度基本上接近矩形,滤波器的最大纹波系数小于0.1,阻带很大。图8.2矩形带通FIR滤波器幅频图2.DSP编程DSP编程能实现FIR滤波器的多种实现方法,既可以使用MAC指令的循环寻址方式实现,也可以使用指令FIRS实现。FIRS指令是C54X系列汇编语言中专门为FIR滤波器设计的,可以提高FIR滤波器的运行时间,完成一些对实时性要求比较高的滤波器。8.2IIR滤波器的C54X实现方法不同结构的数字滤波器来实现而不影响系统总的传输函数。图8.3是四阶直接型IIR滤波器的结构。图8.3四阶直接型IIR滤波器的结构8.2.2IIR滤波器实现举例[例]要求设计抽样频率为1200Hz、截止频率为200Hz的高通滤波器。设计IIR滤波器实现上述要求。输入信号频率为100Hz和300Hz的合成信号,目的是通过所设计的滤波器将100Hz的信号滤掉,余下300Hz的信号成分,达到滤波的效果。1.滤波器的Matlab语言设计在Matlab中使用滤波器设计工具箱(FDA)来设计滤波器,首先打开Matlab,在命令框中输入FDAtool,将出现滤波器设计工具箱。图8.4是打开的滤波器设计的主页面,在图8.4中通过输入有关滤波器的参数可以设计各种满足用户要求的滤波器。图8.4滤波器设计的主界面图8.4中所设计IIR型的3阶切比雪夫I型高通滤波器的抽样频率(Fs)为1200Hz,截止频率(Fpass)为200Hz。图中中间显示的数据为设计好的滤波器参数。图8.5、图8.6、图8.8、图8.8、和图8.9分别对应滤波器的频率特性图、冲激响应特性图、阶跃特性图、零极点示意图和结构示意图。图8.5滤波器的频率特性图图8.6滤波器的冲击响应特性图图8.7滤波器的阶跃响应特性图图8.8滤波器的零极点示意图图8.9直接I型滤波器结构示意图2从Matlab语言转换成通用语言从使用Matlab语言设计出滤波器的参数之后,紧接着需要编写通用语言,以便向DSP所需要的汇编语言转换。也可以直接使用C语言,然后调用CCS自带的C语言转换成汇编语言,但一般情况下,滤波器对实时要求比较高,而整个滤波器的程序编写也不是很大,所以建议采用汇编语言编写。滤波器设计的第二步需要编写通用的语言,本书使用Matlab语言编写,如下所示。clearall:%清寄存器值clf:%清屏N=256:%数据点数fs=1200:%采样频率dt=1/fs:fork=1:N:f1=75:%信号频率f2=300:%信号频率y(k)=sin(2*pi*f1*k*dt)+sin(2*pi*f2*k*dt):%产生信号endlp=200:%截止频率wn1=2*lp/fs:%函数的参数[z1,p1,k1]=CHEBY1(3,0.5,wn1,'high'):%滤波器的极零点表示[B,A]=CHEBY1(3,0.5,wn1,‘high’):%滤波器的传递函数表示yy1(1)=0:yy1(2)=0:yy1(3)=0:b(1)=0.3236:b(2)=-0.9707:b(3)=0.9707:b(4)=-0.3236:a(1)=1:a(2)=-0.9215:a(3)=0.0422:a(4)=-0.0247:n=253:fori=1:nyy1(i+3)=b(4)*y(i)+b(3)*y(i+1)+b(2)*y(i+2)+b(1)*y(i+3)-a(4)*yy1(i)-a(3)*yy1(i+1)-a(2)*yy1(i+2):endfigure(1):t=0:dt:255*dt:plot(t,y)y=fft(y,N):%将信号做FFT变换pyy=y.*conj(y):%做功率谱分析f=(0:(N/2-1)):%标转换figure(2):plot(4.6875*f,pyy(1:N/2)):%原信号功率谱y=fft(yy1,N):%将滤波后数据做功率谱分析pyy=y.*conj(y):%做功率谱分析f=(0:(N/2-1)):%坐标转换figure(3):plot(4.6875*f,pyy(1:N/2)):%滤波后信号功率谱对程序的说明:程序有四个部分。第一部分产生需要滤波的信号;第二部分生成Chebyl滤波器,产生极点和零点;第三部分进行滤波;第四部分画出信号的功率谱图。图8.10、图8.11和图8.12分别是输入信号的时域波形、滤波前的信号功率谱图和滤波后的信号功率谱图。图8.10滤波前的时域波形图8.11滤波前的功率谱图图8.12滤波后的信号功率频谱图3滤波器的DSP程序设计(1)IIR滤波器的C语言实现:(2)IIR滤波器的汇编语言实现:在编写汇编语言程序之前,首先确定滤波器的参数,从上面滤波器的设计中得出滤波器的参数如下,这些参数从图8.4打开的FDA主界面图也可以看到。图8.13显示的就是滤波器参数。若滤波器的参数中有大于1的数据,将其直接放入DSP中的话,需要进行数据格式的浮点运算,这将增加编程的复杂程度,而且也会导致DSP运行程序速度的降低。一般情况下都不这样使用,而是将数据做一定比例的压缩后计算。图8.13滤波器的参数4.CCS环境下对滤波程序的调试(1)单击CCS界面中的rebuild快捷键,对iir.asm进行rebuild.如果有错误则应对该.asm程序改正,直至出现“0Errors”为止.编译通过后单击菜单file中的loadprogram会出现loadprogram对话框,选择ti\myproject\iir\debug目录下的iir.out文件,载入.out文件。运行程序。单击工具栏上的run符号,程序运行后,在主菜单view中找到graph,选择Time/Frequency,出现如图8.14所示的界面。在“StartAddress”栏中该地址为inputdata,“DisplayType”栏,选择SingleTime。“AcquisitionBufferSize”栏改读取缓存大小为256,“DisplayDataSize”栏改显示点数为256,“DSPDataType”下拉选框中选择“16-bitsingedinteger”,“SamplingRate(Hz)”中改抽样频率为1200,如图8.14所示。图8.14图形属性设置(3)单击图8-36所示对话框的“OK”按钮,得到信号滤波前的波形图,如图8.15所示。图8.15滤波前CCS中的数据时域波形(4)在图8.14所示对话框中,把“DisplayType”栏改为FFTMagnitude,则可以观察到信号滤波前的频谱,如图8.16.所示。图8.16滤波前CCS中的数据频谱(5)在图8.14所示对话框中,如在“StartAddress”栏输入filterdata,则可以观察到信号滤波后的波形图,如图8.17所示。图8.17滤波后CCS中的数据时域波形(6)在图8.14所示对话框中,如果把“DisplayType”栏改为FFTMagnitude,在“StartAddress”栏输入filterdata,则可以观察到信号滤波后的频谱图,如图8.18所示。图8.18滤波后CCS中的数据频谱8.3快速傅里叶变换(FFT)的C54X实现方法8.3.1FFT基本原理快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的快速算法,FFT是数字信号处理中最为重要的算法之一,在声学、语音、电信和信号处理等各个领域都有广泛的应用,FFT也成为DSP运算能力的一个考核因素。离散傅里叶变换的目的是把信号由时域变换到频域,从而可以在频域分析处理信息,得到的结果再由傅里叶逆变换到时域。本实例介绍基2按时间抽取的FFT的基本原理及其实现方法,程序基于C54X系列DSP。下面首先介绍FFT基本原理。对于有限长离散数字信号它的离散频谱可由离散傅里叶变换求得。DFT定义如下10)/2(][)(NnnkNjenxkX1,...,2,1,0Nk也可以方便地把它改写成如下形式。10][)(NnnkNWnxkX(8-6)(8-7)式中(有时简写为W)代表。不难看出,是周期性的,且周期为N,即nkNlNkmNnNWW))((...2,1,0,lmnkW的周期性是DFT的关键之一。常用表达式取代W以便明确地给出的周期为N。nkW由DFT的定义可以看出,在为复数序列的情况下,直接运算N点DFT需要次复数乘法和次复数加法。因此,对于一些相当大的N值(如1024点)(8-8)来说,由DFT的定义可以看出,在为复数序列的情况下,直接运算N点DFT需要次复数乘法和次复数加法。因此,对于一些相当大的N值(如1024点)来说,直接计算它的DFT的计算量是很大的。一个优化的实数FFT算法是一个组合以后的算法。原始的2N个点的实输入序列组合成一个N点的复序列,然后对复序列进行N点的FFT运算,最后再由N点复数输出拆散成2N点的复数序列,这2N点的复数序列与原始的2N点的实数输入序列的DFT输出一致。FFT的基本思想在于:将原来的N点序列分成两个较短的序列,这些序列的DFT可很简单地组合起来得到原序列的DFT。例如,若N为偶数,将原有的

1 / 76
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功