滤波器的性能指标及MATLAB仿真

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FIR 数字滤波器的DSP 实现

TMS320C5402 在指令集和硬件结构上对滤波器算法的实现有专门的考虑。首先是在指令中设置了MACD 指令, 他的功能是将数据区的两个数相乘以后, 再与累加器中的值累加, 运算结果仍保留于累加器中, 而为下一次操作准备; 其次, 在硬件上设计了间接寻址时的循环寻址功能, 即将滤波器系数保存于一个可循环寻址的数据缓冲区, 寻址指针由低地址自动增长, 当达到缓冲区顶部时, 自动返回低地址重新寻址, 这样, 配合单指令重复指令RPT , 就可以快速实现卷积操作。

在FIR 数字滤波器的设计中, 一个必须注意的问题是计算的精度和结果溢出问题。由于在滤波器设计时, 滤波器的系数都是小数, 为了获得较高的精度和整数化系数,一般都要对求出来的系数乘一个较大的数, 然后再调整。这样导致在计算中有可能累加器溢出; 另一个问题是计算后累加器中的结果数值为32 位, 而物理的存储器位数是16 位, 在存储处理结果时, 通常的做法是将低16 位结果直接丢弃不用, 只取高16位作为计算结果, 但这样做带来的后果是精度降低。因而在考虑滤波器设计时, 必须综合考虑输入信号的幅度, 并仔细分析中间值的大小, 调整滤波器的系数, 在不影响计算速度的情况下, 提高计算精度。

TMS320C5402在指令集和硬件结构上对滤波器算法的实现有专门的考虑。首先是在指令中设置了MACD 指令, 他的功能是将数据区的两个数相乘以后, 再与累加器中的值累加, 运算结果仍保留于累加器中, 而为下一次操作准备; 其次, 在硬件上设计了间接寻址时的循环寻址功能, 即将滤波器系数保存于一个可循环寻址的数据缓冲区, 寻址指针由低地址自动增长, 当达到缓冲区顶部时, 自动返回低地址重新寻址, 这样, 配合单指令重复指令RPT , 就可以快速实现卷积操作。

在FIR 数字滤波器的设计中, 一个必须注意的问题是计算的精度和结果溢出问题。由于在滤波器设计时, 滤波器的系数都是小数, 为了获得较高的精度和整数化系数,一般都要对求出来的系数乘一个较大的数, 然后再调整。这样导致在计算中有可能累加器溢出; 另一个问题是计算后累加器中的结果数值为32 位, 而物理的存储器位数是16 位, 在存储处理结果时, 通常的做法是将低16 位结果直接丢弃不用, 只取高16 位作为计算结果, 但这样做带来的后果是精度降低。因而在考虑滤波器设计时, 必须综合考虑输入信号的幅度, 并仔细分析中间值的大小, 调整滤波器的系数, 在不影响计算速度的情况下, 提高计算精度。

利用数字信号处理器处理语音时, 除了在语音输入端加上硬件滤波电路外, 还需进行数字滤波。因为硬件滤波电路的阻带衰减不好, 在滤波时无用的频率成分不可能滤干净。该数字滤波器的技术指标为:通带截止频率0.2p ωπ=,阻带截止频率为0.3s ωπ=,实际通带波动0.25p R dB =,最小阻带衰减50s A dB =,抽样频率10000s F Hz =,窗函数的选用用凯塞窗可以满足设计需求。

上述FIR 数字滤波器的源程序如下:

.mm regs

.global begin

k_fir_index.set1

k_fir_bffr.set82 ;FIR数字滤波器的阶数

k_frame_size.set256

.data

output.space k_frame_size*16 ;输出数据缓冲区的大小

input.copy firinput ;输入信号(c语言编程生成的文件)

coff_fir_start .copy coff_fir

;FIR滤波器的系数

fir_dp .usect“fir_vars”,0

d_filin .usect “fir_vars”,1

d_filout .usect “fir_vars”,1

fir_coff_table .usect “fir_vars”,20

d_data_buffer .usect “fir_bfr”,40

bo s .usect “stack”,0fh

to s .usect “stack”,1

.text

.def inilite_dsp

.def fir_init

.def fir_task

.asg ar0,fir_index_p

.asg ar4,fir_data_p

.asg ar5,fir_coff_p

inilite_dsp: ;初始化DSP

LD #0.DP

STM #0X4007,058H

;SET C5402DSP CLOCK TO 50MHz STM #0X2000,028H ;SWWSR=28H STM #0X0000,29H ;BSCR=29H

STM #0X1800,06H ;ST0=06H

STM #0X2900,07H ;ST1=07H

STM #0Xffc0,1DH ;PMST=1DH

STM #0X0010,26H ;TCR=26H

STM #0X0010,32H ;TCR1=32H

.fir_init ;

stm #fir_coff_table,fir_coff_p

rpt #k_fir_bffr- 1

;将FIR系数从程序存储器移动到数据存储器mvpd #coff_fir_start,*fir_coff_p+

stm #k_fir_index,fir_index_p

stm #d_data_buffer,fir_data_p

;装载最新的采样地址

rptz a,#k_fir_bffr

st1 a,*fir_data_p+ ;使缓冲器复位

stm #(d_data_buffer+ k_fir_bffr- 1),fir_data_p

相关文档
最新文档