dsp原理及其应用课程设计报告-基于fir的语音信号滤波内容摘要:

fread 和 fwrite 函数。 对于用 DSP器件设计的语音信号滤波器 , 其系统软件设计可使用 CCS (Code Composer Studio)软 件来进行调试。 设计调试时 , 首先应对 各个设备 进行初始化配置 , 然后再调用子程序来处理音频数据的输入和输出。 在子程序中 , 首先初始化语音缓冲区和工作变量 , 等待 MCBSP通道 0传送结束后 , 再采集语音信号 , 然后传送到 MCBSP并保存于左声道缓冲区 , 此时即可调用 材料 计算 FIR滤波输出 , 滤波后的结果存放于右声道缓冲区 , 最后将滤波后的信号输出到 MCBSP 接口 , 再将此信号传送到 TMS320C5410中。 通过 DSP 的串口 0 输入 /输出数据。 在串口通讯中,数据时钟和帧同步信号都由 AC01 产生,所以 VC5410 将使用外部时钟和帧同步信号。 串口设置代码如下: stm 0,spsa0 stm 2020h,spcr10 stm 1,spsa0 stm 0c0h,spcr20 stm 2,spsa0 stm 40h,39h stm 3,spsa0 stm 0,39h stm 4,spsa0 stm 40h,xcr10 stm 5,spsa0 stm 0,39h 基于 FIR 的语音信号滤波 第 16 页 共 34 页 stm 0eh,spsa0 stm 0dh,pcr0 stm 7h,spsa0 stm 8000h,39h rpt 0ffffh nop stm 00h,dxr10 ldm 22h,a stm 1,38h stm 0c1h,39h 完成串口设置后,还需要修改中断向量表以便正确响应串口 0 的接收和发送中断请求。 使用发送中断产生送出滤波之后的数字语音信号;使用接收中断存贮输入的数据,并设置新数据到达标志。 主循环在检测到该标志后,调用 FIR 滤波程序,完成对输入数据的处理。 matlab设计 fir带通滤波器 [n,Wn,beta,ftype]=kaiserord([7 13 17 23],[0 1 0],[ ],100)。 //得出滤波器的阶数 n=38, beta= w1=2*fc1/fs。 w2=2*fc2/fs。 //将模拟滤波器的技术指标转换为数 字滤波器的技术指标 window=kaiser(n+1,beta)。 //使用 kaiser窗函数 b=fir1(n,[w1 w2],window)。 //使用标准频率响应的加窗设计函数 fir1 freqz(b,1,512)。 //数字滤波器频率响应 t = (0:100)/Fs。 s = sin(2*pi*t*5)+sin(2*pi*t*15)+sin(2*pi*t*30)。 //混和正弦波信号 sf = filter(b,1,s)。 //对信号 s进行滤波 基于 FIR 的语音信号滤波 第 17 页 共 34 页 图 滤波前后的波形 运行程序后,使用 DSP 的集成开发环境 CCS 可以将输入数据与滤波结果显示出来,通过与使用 MATLAB 的 SIMULINK 功能仿真出的滤波结果进行比较,可以验证用 DSP 芯片 C54x 实现的该 FIR 滤波器的滤波过程是否正确。 利用MATLAB 的滤波器设计函数 fir1 设计了一个具有线性相位的数字低通 FIR 滤波器,得到了该滤波器的滤波系数及幅频特性曲线、相频特性曲线,并且用MATLAB 的仿真工具 SIMULINK 仿真了该 FIR 滤波器的滤波过程;通过线性缓冲区法对 FIR 滤波器在 DSP 芯片 C54x 的实现做了理论上的分析。 用 MATLAB语言可方便、快捷地设计具有线性相位的 FIR 滤波器,而且对于参数的修改也十分方便。 用 MATLAB 仿真工具可以清晰地仿真出 FIR 滤波器的滤波过程,有利于理解滤波过程,且 可以判断滤波结果的正确性。 利用 DSP 芯片实现 FIR 滤波器,不仅具有准确度高、执行速度快等特点,而且用程序可移植性好 ,实用性强可以十分方便地改变滤波器特性。 在实际应用中,只需要按照要求修改滤波器的参数,并对程序作微小的改动,即可实现不同要求的 FIR 滤波器。 基于 FIR 的语音信号滤波 第 18 页 共 34 页 4 程序编写及调试结果 程序 BSP .set 0。 //当前使用 McBsp0。 McBsp0 内存映射寄存器 SPSA0 .set 038h。 //定义子地址寄存器映射位置 SPSD0 .set 039h。 //定义子块数据寄存器映射位置 DRR10 .set 021h。 //接收数据寄存器 1 映射位置 DRR20 .set 020h。 //接收数据寄存器 2 映射位置 DXR10 .set 023h。 //发送数据寄存器 1 映射地址 DXR20 .set 022h。 //发送数据寄存器 2 映射地址。 McBsp1 //内存映射寄存器 SPSA1 .set 048h SPSD1 .set 049h DRR11 .set 041h DRR21 .set 040h DXR11 .set 043h DXR21 .set 042h。 McBsp Subaddressed Registers SPCR1 .set 00h。 //定义 SPCR10 的映射子地址 SPCR2 .set 01h //定义 SPCR20 的映射子地址 RCR1 .set 02h //接收控制寄存器 1 映射子地址 RCR2 .set 03h //接收控制寄存器 2 映射子地址 XCR1 .set 04h //发送控制寄存器 1 映射子地址 XCR2 .set 05h //发送控制寄存器 2 映射子地址 SRGR1 .set 06h //采样率发生器寄存器 1 映射子地址 SRGR2 .set 07h //采样率发生器寄存器 2 映射子地址 基于 FIR 的语音信号滤波 第 19 页 共 34 页 MCR1 .set 08h //多通道控制寄存器 1 映射子地址 MCR2 .set 09h //多通道控制寄存器 2 映射子地址 RCERA .set 0ah //接收通道控制寄存器 1 映射子地址 RCERB .set 10bh //接收通道控制寄存器 2 映射子地址 XCERA .set 0ch //发送通道使能寄存器 A 映射子地址 XCERB .set 0dh //发送通道使能寄存器 B 映射子地址 PCR .set 0eh //引脚控制寄存器映射子地址 .if BSP = 0 //条件汇编,因为 5402 有两个同步缓冲口如果 BSP=0 则使用同步缓冲口 0 SPSA .set SPSA0 //由于同步缓冲口采用子地址寻址方式 SPSD .set SPSD0 RDRR .set DRR10 RDXR .set DXR10 .endif .if BSP = 1 //条件汇编,因为 5402 有两个同步缓冲口如果 BSP=1 则使用同步缓冲口 1 SPSA .set SPSA1 SPSD .set SPSD1 RDRR .set DRR11 RDXR .set DXR11 .endif //以下程序是写数据的子程序也就是宏 WR_SUB_REG .macro val,addr //写 McBsp 控制寄存器 stm addr,SPSA //将 ADDR 的地址写入 SPSA nop //空操作 stm val,SPSD //将配置值写入 SPSD nop //空操作 基于 FIR 的语音信号滤波 第 20 页 共 34 页 .endm //以下程序是读数据的子程序也就是宏 RD_SUB_REG .macro addr,acc //读 McBsp 控制寄存器 stm addr,SPSA //将 ADDR 的地址写入 SPSA nop //空操作 ldm SPSD,acc //送入累加器保存 nop //空操作 nop nop .endm WAITTRX .macro //等待串口中断宏 WAITR? RD_SUB_REG SPCR1,A and 11, A bc WAITR?, AEQ .endm PROGREG .macro progword //DSP 与 AD50 的二次通讯 (将其最后一位置为 1 便可 ) stm 01h,RDXR WAITTRX stm progword,RDXR WAITTRX .endm //以下程序是等待延时子程序 wait .macro STM 0400h, AR0 RPT *AR0 基于 FIR 的语音信号滤波 第 21 页 共 34 页 NOP .endm .mmregs .global _c_int00 .sect .vectors //以下是中断向量表 RESET b _c_int00 nop nop .space 19*4*16 BRINT0 b recv nop nop BXINT0 rete nop nop nop .space 10*4*16 //以下是主程序 .text _c_int00 ld 0h,DP //设置数据页指针为第 0 页 stm 0ff00h,SP //设置堆栈指针地址为。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。