欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    武汉理工基于fir的高通滤波器DSP综合报告.doc

    • 资源ID:9928550       资源大小:460KB        全文页数:20页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    武汉理工基于fir的高通滤波器DSP综合报告.doc

    摘 要 DSP 技术一般指将 DSP 处理器用于完成数字信号处理的方法与技术。目前的 DSP 芯片 以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热 点技术。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。其中 利用 DSP 来实现数字滤波器就是很重要的一种应用,本文深入研究 DSP 芯片的滤波器系统 软件实现方法,用窗口设计法实现 FIR 滤波器,实验结果表明滤波结果效果良好,达到了 预期的性能指标。 一、实验目的一、实验目的 1 掌握 FIR 数字滤波器的原理。 2 2 掌握 FIR 数字滤波器的 DSP 实现方法。 二、实验原理二、实验原理 数字滤波器一直以来就是数字信号处理器最广为人知的应用。数字滤波器有别于模拟 滤波器的优点是:1)可重复设计,不需更改任何硬件电路的设计,就可以将一个低通滤 波器重新设计成一个高通滤波器。2)执行阶段可以直接更新滤波器的系数,形成适应性 滤波器。滤波器分成两种形态:有限长度脉冲响应(FIR)滤波器。FIR 指的是单一采样 响应的期间是有限长的,IIR 指的是单一采样响应的期间是无限长的。FIR 滤波器的特性 可以用一个差分方程来描述: ).2()2() 1() 1 ()()0()(nxhnxhnxhny 其中是滤波器的系数。 ., 210 aaa 常用的滤波器有:低通、高通、带通及带阻滤波器。滤波器特性可以由很多的参数来决定, 这些参数包括带通涟波、带阻涟波、带通截止频率及带阻截止频率。在设计 FIR 滤波器 时,必须根据这些参数来确定 FIR 滤波器的系数及阶数。这个过程可以通过几种方法来完成。一是通过 Matlab 软件来 完成,二是通过专门的数字滤波器设计的软件包来完成。这一过程本实验不详述,本实验 假定该过程已经完成,并得到了滤波器的阶数及系数。 本设计是基于 FIR 算法的 dsp 高通滤波器的设计,采用DSP 芯片。其中采样频率为 64000HZ,高通滤波器的边界频率为 2000HZ,阶数为 101 阶。 三、算法设计 1采用 MATLAB 设计 FIR 数字滤波器 采用 MATLAB 设计 FIR 数字滤波器的方法有多种,本实验采用 fir1 函数,使用方法简介如下: 设计高通滤波器,格式为:b=fir1(N,Wn, high) 其中 N+1 为滤波器阶数,b 为返回的长度为 N+1 的系数向量。Wn 为归一化边界频率,0 < Wn DARAM .text: DARAM .stack: DARAM .sysstack: DARAM .cinit: DARAM2 .pinit: DARAM2 .bss: DARAM2 .const: DARAM2 /*firhigh.cmd/ ; fir.asm 该程序用于实现 FIR 滤波器,可被 C 语言程序调用 ; int fir(int *,int *, unsigned int,int) ; 参数 0: AR0 输入信号缓冲区指针 ; 参数 1: AR1 - FIR 滤波器系数向量指针 ; 参数 2: T0 - FIR 滤波器的阶数 L ; 参数 3: T1 - 输入信号当前值在循环缓冲区的序数 ; 返回值: T0 - 输出信号当前值 .global _fir .def _fir _fir pshm ST1_55 ;现场 ST1,ST2 和 ST3 入栈 pshm ST2_55 pshm ST3_55 or #0 x340,mmap(ST1_55) ;设置 FRCT,SXMD,SATD bset SMUL ;置位 SMUL mov mmap(AR0),BSA01 ;AR0=输入信号循环缓冲区的起始地址 mov mmap(AR1),BSA23 ;AR1=滤波器系数循环缓冲区的起始地址 mov mmap(T0),BK03 ;设置循环缓冲区大小 or #0 x5,mmap(ST2_55) ;AR0 和 AR2 为循环缓冲区指针 mov T1,AR0 ; AR0 从 index 偏移量开始 mov #0,AR2 ; AR2 从 0 偏移量开始 sub #2,T0 ;T0=L-2 mov T0,CSR ;设置外部循环次数为 L-1 mpym *AR0+,*AR2+,AC0 ;执行第一次运算 | rpt CSR ;启动循环 macm *AR0+,*AR2+,AC0 mov hi(AC0),T0 ; 用 Q15 格式存放结果 popm ST3_55 ; 恢复 ST1, ST2 和 ST3 popm ST2_55 popm ST1_55 ret .end /* main.c/ #include math.h #define Fs 64000 /* 采样频率 */ #define T 1/Fs /* 采样时间 */ #define f1 500 /* 正弦信号 1 频率 */ #define f2 2500 /* 正弦信号 2 频率 */ #define f3 3300 /* 正弦信号 3 频率 */ #define PI 3.1415926 #define w1 (2*PI*f1*T) /* 正弦信号 1 数字频率=2*pi*f1/Fs */ #define w2 (2*PI*f2*T) /* 正弦信号 2 数字频率=2*pi*f2/Fs */ #define w3 (2*PI*f3*T) /* 正弦信号 3 数字频率=2*pi*f3/Fs */ #define a1 0.333 /* 正弦信号 1 幅度 */ #define a2 0.30 /* 正弦信号 2 幅度 */ #define a3 0.30 /* 正弦信号 3 幅度 */ extern int fir(int *,int *,unsigned int,int ); /* Low-pass FIR filter coefficients */ int coeff101= 6 , 3 , 0 , -4 , -8 , -13 , -19 , -25, -31 , -38 , -44 , -49 , -52 , -53 , -51 , -45, -34 , -20 , 0 , 24 , 53 , 85 , 120 , 155, 189 , 221 , 247 , 266 , 274 , 270 , 251 , 216, 163 , 91 , 0 , -110 , -238 , -381 , -538 , -705, -879 , -1055 , -1229 , -1397 , -1554 , -1695 , -1817 , -1915, -1988 , -2033 , 30713 , -2033 , -1988 , -1915 , -1817 , -1695, -1554 , -1397 , -1229 , -1055 , -879 , -705 , -538 , -381, -238 , -110 , 0 , 91 , 163 , 216 , 251 , 270, 274 , 266 , 247 , 221 , 189 , 155 , 120 , 85, 53 , 24 , 0 , -20 , -34 , -45 , -51 , -53, -52 , -49 , -44 , -38 , -31 , -25 , -19 , -13, -8 , -4 , 0 , 3 , 6 ; int in101; /* input buffer */ int out101; /* Output buffer */ main() unsigned int L=101; unsigned int i; float signal; unsigned int n=0; int index=0; for(i=0;i2 以后,yk能用 yk-1和 yk-2算出,这是一个递归的差分方程。式中 ,2cos2cos(2* */) s ATnff 1B sinsin(2* */) s CTnff fs 为采样频率,f 为正弦波频率。A 为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就 是用程序实现上述的递归差分方程。 如要产生振荡器的频率为 2kHz 正弦波,设采样速率为 40k,通过定时器设置,每隔 25us 中断一 次,即产生一个 yn。则递归差分方程系数为: 2cos2cos(2*/) s ATff2cos(2*2000/40000)2*0.95105652 B=-1 sinsin(2*/)sin(2*2000/40000)0.30901699 s CTff 为了便于定点 DSP 处理,将所有系数除以 2,然后用 16 位定点格式表示为: A=79bcH,B=C000H,C=13c7H,这便是产生 2kHz 正弦信号的三个系数。 主程序初始化时先计算出 y1和 y2,然后开放定时器中断,以后每次进入定时器中断服务程序 时,利用前面计算出的 y1和 y2计算出新的 y。 初始化 y1和 y2 SSBX FRCT ;置 FRCT=1,准备进行小数乘法运算 ST #0 x79BC,AA ;将常数装入变量 AA ST #0 xC000H,BB ;将常数装入变量 BB ST #0 x13C7H,CC;将常数装入变量 CC PSHD CC ;将 CC 压入堆栈 POPD Y2 ; 初始化 Y2=CC LD AA,T ; 将 AA 装到 T 寄存器 MPY Y2,A ;Y2 乘以系数 A,结果放入 A 寄存器 STH A,Y1 ;将 A 寄存器的高 16 位存入变量 Y1 ;中断服务程序段: LD BB,T ;将系数 B 装入 T 寄存器 MPY Y2,A ;Y2 乘系数 B,结果放入 A 寄存器 LTD Y1 ;将 Y1 装入 T 寄存器,同时复制到 Y2 MAC AA,A ;完成新正弦数据计算,A 寄存器 ;中为 Y1*AA+Y2*BB STH A,1,Y1 ;将新数据存入 Y1,因所有系数都 ;除过 2,在保存结果时转移一位, ;恢复数据正常大小 STH A,1,Y0 ;将新正弦数据存入 Y0 VC5402 的片内定时器利用 CLKOUT 时钟计数,用三个寄存器(TIM、PRD、TCR)来控制定时器。到 定时器实际上可以有 20 个比特的周期寄存器。它对 CLKOUT 信号计数,先将 PSC 减 1,直到 PSC 为 0,然后用 TDDR 重新装入 PSC,同时将 TIM 减 1,直到 TIM 减为 0。这时 CPU 发出 TINT 中断,同时在 TOUT 引脚输出一个脉冲信号,脉冲宽度为 CLKOUT 一致。然后用 PRD 重新装入 TIM,重复下去直到系 统或定时器复位。因而定时器中断的频率由下面的公式决定: TINT 的频率=,其中 tc表示 CLKOUT 的周期。设置 PRD 寄存器值为 11 1 PRDTDDRtc 12499,TINT 中断频率为 40kHz。 定时器初始化程序段为: STM #10H,TCR ;停止定时器 STM #2499H,PRD;设置PRD 寄存器值为2499, ;TINT 中断频率为Foutclk =(2499+1)= 100MHz/2500 = 40 kHz STM #20H,TCR ;重新装入TIM 和PSC,然后; ;启动定时器,在开放中断屏蔽寄存器IMR后,就可以产生频率为2000Hz的正弦波。 三、实验内容与步骤三、实验内容与步骤 .使用 C54x 汇编语言实现数字振荡器,并通过 CCS 提供的显示窗口观察输出信号波形以及频谱。 .根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明, 3. 启动 CCS,新建工程文件,如文件名为sinewave.pjt。并建立如下文件: 汇编源程序exer3.asm .title for test INT service program .(25 us) .mmregs .global _c_int00,_tint,vector OFF_INTIMER .set 04Ch ; vector of INTtimer at VECTOR+OFF_INTIMER INIT_A .set 079bch ; A/2=0.9510498 INIT_B .set 0c000h ; B/2=-0.5 INIT_C .set 013c7h ; C/2=0.1545105 .bss y0,1 .bss y1,1 .bss y2,1 .bss temp,1 .bss AA,1 .bss BB,1 .bss CC,1 .text _c_int00: ld #0,dp ssbx intm ; disable all interrupt ! st #1fffh,sp ld #vector, a ; get vector table address ! and #0FF80h, a andm #007Fh, pmst or pmst, a stlm a, pmst ; 设置IPTR stm #10h,TCR ; init TIMER stm #2499,PRD ; f=100M/(2499+1)=40kHz stm #20h,TCR ; reset TIMER ldm IMR,a ; read back IMR or #08h,a ; enable TIMER interrupt stlm a,IMR ; set IMR ld #temp,dp ; set DP ssbx FRCT ; prepare for fraction mpy st #INIT_A,AA ; init AA,BB,CC st #INIT_B,BB ; st #INIT_C,CC ; pshd CC popd y2 ; init y2,y2=CC ld AA,T ; T=AA mpy y2,a ; y2*AA - a sth a,y1 ; y2*AA - y1 stm #0h,TCR ; enable TIMER nop rsbx intm ; enable all int ! again: nop b again nop nop nop nop nop nop ;- ; interrupt for INT_TIMER ! ;- _tint: ld #BB,DP ld BB,T ; T=BB mpy y2,a ; a=y2*BB ltd y1 ; T=y1,y2=y1 mac AA,a ; a=a+y1*AA sth a,1,y1 ; new cos data - y1 sth a,1,y0 ; new cos data - y0 nop ; set breakpoint in CCS ! int1_end: nop rete .end vec_table.asm文件 .mmregs .ref _ret .ref _c_int00 .ref _tint .global vector .sect.int_table ;- ; interrupte vector table ! ;- vector: rs b _c_int00 nop nop nmi b _ret nop nop sint17 b _ret nop nop sint18 b _ret nop nop sint19 b _ret nop nop sint20 b _ret .word 0,0 sint21 b _ret .word 0,0 sint22 .word 01000h .word 0,0,0 sint23 .word 0ff80h .word 0,0,0 sint24 .word 01000h .word 0,0,0 sint25 .word 0ff80h .word 0,0,0 sint26 .word 01000h .word 0,0,0 sint27 .word 0ff80h .word 0,0,0 sint28 .word 01000h .word 0,0,0 sint29 .word 0ff80h .word 0,0,0 sint30 .word 01000h .word 0,0,0 int0 b _ret nop nop int1 b _ret nop nop int2 b _ret nop nop tint b _tint nop nop brint0 b _ret nop nop bxint0 b _ret nop nop trint b _ret nop nop dmac1 b _ret nop nop int3 b _ret nop nop hpint b _ret nop nop q26 .word 0ff80h .word 0,0,0 q27 .word 01000h .word 0,0,0 dmac4 b _ret nop nop dmac5 b _ret nop nop q30 .word 0ff80h .word 0,0,0 q31 .word 01000h .word 0,0,0 ;- ; end of interrupte vector table ! ;- _ret rete 链接定位sinewave.cmd MEMORY PAGE 1: INT_D: ORIGIN=80h, LENGTH=1F80h PAGE 0: EXT_P: ORIGIN=2000h, LENGTH=2000h SECTIONS .text : EXT_P PAGE 0 .int_table : (EXT_P ALIGN (128) PAGE (0) .data : INT_D PAGE 1 选择Project 菜单中的Add File to Project 选项,将汇编源程序exer3.asm、vec_table.asm 和连接 定位sinewave.cmd文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文 件类型来加快文件选择速度。你也可以使用鼠标右键单击工程文件名(如sinewave.pjt)并选择Add Files 项来添加需要的文件。其中,exer3.asm 包括初始化代码和中断服务程序,而vec_talbe.asm 包含中断向量表。 4. 完成编译、连接,正确生成OUT文件。然后使用File 菜单的“Load Program”选项,将生成的OUT 文件装入DSP 的片内存储器。这时CCS 将显示程序的启始地址_c_int00。 5. 选 ViewGraphTime/Frequency打开图形显示设置窗口。在弹出的对话框中按图4.1设置, 图图4.14.1 图形属性设置图形属性设置 主要修改“Start Address”为y0(y0为生成的正弦波输出变量);“Acquisition Buffer Size”为1,“DSP Data Type”为“16-bit signed integer”。 6. 在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。选择DebugAnimate,运行 程序,观察输出波形。数一数一个周期的正弦波有多少个点?算算频率是否是2kHz?另外,想想Run 和Animate 两种运行方式的区别? 7. 用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。将“DisplayType”项改 为“FFT Magnitude”以便显示信号频谱。修改“Sampling Rate(Hz)”项为40000,然后退出。注意观 察生成的正弦波频率。 四、实验报告要求四、实验报告要求 1、简述实验目的; 2、简述 DSP 定时器的基本工作原理; 3、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。 五、思考题五、思考题 .本实验程序产生了一个 2kHz 的正弦信号,请修改程序,产生一个频率相同的余弦信号。为了 验证产生的COS 信号,可以同时生成SIN 和COS 信号,然后在两个图形窗口中显示波形。它们应该正 好相差/2 相位。 2. 重新设计和实现一个数字振荡器,采样频率改为为 20KHz,输出正弦信号的频率为 4KHz。

    注意事项

    本文(武汉理工基于fir的高通滤波器DSP综合报告.doc)为本站会员(rrsccc)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开