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

上传人:文库蛋蛋多 文档编号:4143319 上传时间:2023-04-07 格式:DOC 页数:20 大小:460KB
返回 下载 相关 举报
武汉理工基于fir的高通滤波器DSP综合报告.doc_第1页
第1页 / 共20页
武汉理工基于fir的高通滤波器DSP综合报告.doc_第2页
第2页 / 共20页
武汉理工基于fir的高通滤波器DSP综合报告.doc_第3页
第3页 / 共20页
武汉理工基于fir的高通滤波器DSP综合报告.doc_第4页
第4页 / 共20页
武汉理工基于fir的高通滤波器DSP综合报告.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《武汉理工基于fir的高通滤波器DSP综合报告.doc》由会员分享,可在线阅读,更多相关《武汉理工基于fir的高通滤波器DSP综合报告.doc(20页珍藏版)》请在三一办公上搜索。

1、摘 要 DSP技术一般指将DSP 处理器用于完成数字信号处理的方法与技术。目前的DSP芯片以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热点技术。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。其中利用DSP来实现数字滤波器就是很重要的一种应用,本文深入研究DSP芯片的滤波器系统软件实现方法,用窗口设计法实现FIR滤波器,实验结果表明滤波结果效果良好,达到了预期的性能指标。一、实验目的1 掌握FIR数字滤波器的原理。2 掌握FIR数字滤波器的DSP实现方法。二、实验原理数字滤波器一直以来就是数字信号处理器最广为人知的应用。数字滤波器有别于模拟滤波

2、器的优点是:1)可重复设计,不需更改任何硬件电路的设计,就可以将一个低通滤波器重新设计成一个高通滤波器。2)执行阶段可以直接更新滤波器的系数,形成适应性滤波器。滤波器分成两种形态:有限长度脉冲响应(FIR)滤波器。FIR指的是单一采样响应的期间是有限长的,IIR指的是单一采样响应的期间是无限长的。FIR滤波器的特性可以用一个差分方程来描述: 其中是滤波器的系数。常用的滤波器有:低通、高通、带通及带阻滤波器。滤波器特性可以由很多的参数来决定,这些参数包括带通涟波、带阻涟波、带通截止频率及带阻截止频率。在设计FIR滤波器时,必须根据这些参数来确定FIR滤波器的系数及阶数。这个过程可以通过几种方法来

3、完成。一是通过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 DA

4、RAM .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 -

5、 输出信号当前值 .global _fir .def _fir _fir pshm ST1_55 ;现场ST1,ST2和ST3入栈 pshm ST2_55 pshm ST3_55or #0x340,mmap(ST1_55) ;设置FRCT,SXMD,SATDbset SMUL ;置位SMULmov mmap(AR0),BSA01 ;AR0=输入信号循环缓冲区的起始地址mov mmap(AR1),BSA23 ;AR1=滤波器系数循环缓冲区的起始地址mov mmap(T0),BK03 ;设置循环缓冲区大小or #0x5,mmap(ST2_55) ;AR0和AR2为循环缓冲区指针mov T1,AR0

6、 ; 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+,AC0mov hi(AC0),T0 ; 用Q15格式存放结果popm ST3_55 ; 恢复ST1, ST2和 ST3popm ST2_55 popm ST1_55 ret.end/* main.c/#include math.h#define Fs 64000 /* 采样频率 */#define T 1/Fs

7、 /* 采样时间 */#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幅度 */#defin

8、e 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

9、, 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 , 2

10、70, 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

11、index=0; for(i=0;i2以后,yk能用yk-1和yk-2算出,这是一个递归的差分方程。式中,fs为采样频率,f为正弦波频率。A为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就是用程序实现上述的递归差分方程。如要产生振荡器的频率为2kHz正弦波,设采样速率为40k,通过定时器设置,每隔25us中断一次,即产生一个yn。则递归差分方程系数为:B=-1 为了便于定点DSP处理,将所有系数除以2,然后用16位定点格式表示为:A=79bcH,B=C000H,C=13c7H,这便是产生2kHz正弦信号的三个系数。主程序初始化时先计算出y1和y2,然后开放定时器中断,以后每次进入定时器中断

12、服务程序时,利用前面计算出的y1和y2计算出新的y。初始化y1和y2SSBX FRCT ;置FRCT=1,准备进行小数乘法运算ST #0x79BC,AA ;将常数装入变量AAST #0xC000H,BB ;将常数装入变量BBST #0x13C7H,CC;将常数装入变量CCPSHD CC ;将CC压入堆栈POPD Y2 ; 初始化Y2=CCLD 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 Y

13、1 ;将Y1装入T寄存器,同时复制到Y2MAC AA,A ;完成新正弦数据计算,A寄存器;中为Y1*AA+Y2*BBSTH A,1,Y1 ;将新数据存入Y1,因所有系数都;除过2,在保存结果时转移一位,;恢复数据正常大小STH A,1,Y0 ;将新正弦数据存入Y0VC5402的片内定时器利用CLKOUT时钟计数,用三个寄存器(TIM、PRD、TCR)来控制定时器。到定时器实际上可以有20个比特的周期寄存器。它对CLKOUT信号计数,先将PSC 减1,直到PSC 为0,然后用TDDR 重新装入PSC,同时将TIM减1,直到TIM减为0。这时CPU 发出TINT中断,同时在TOUT 引脚输出一个脉

14、冲信号,脉冲宽度为CLKOUT 一致。然后用PRD 重新装入TIM,重复下去直到系统或定时器复位。因而定时器中断的频率由下面的公式决定:TINT的频率=,其中tc表示CLKOUT的周期。设置PRD寄存器值为12499,TINT中断频率为40kHz。定时器初始化程序段为:STM #10H,TCR ;停止定时器STM #2499H,PRD;设置PRD 寄存器值为2499,;TINT 中断频率为Foutclk =(2499+1)= 100MHz/2500 = 40 kHzSTM #20H,TCR ;重新装入TIM 和PSC,然后;启动定时器,在开放中断屏蔽寄存器IMR后,就可以产生频率为2000Hz

15、的正弦波。三、实验内容与步骤.使用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_INTIMERINIT_A .set 079bch ; A/2=0.9510498INIT_B .set 0c000h ; B/2=-0.5INIT_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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号