第四章 DSP软件设计及应用

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

4.1 FIR滤波器的DSP实现
4.2 IIR数字滤波器的DSP实现
4.3 FDCT运算的DSP实现
4.4 混合编程技术
4.1 FIR滤波器的DSP实现

4.1.1 线性缓冲区法 4.1.2 循环缓冲区法 4.1.3 系数对称FIR滤波器的DSP实现
a1 a0
x(n-4)
线性缓冲区实现FIR:
h[N-1]
存储器
y(n)
x COEF
h[N-1] a5
x(n+1) x(n) x(n-1)
h[1] x(n-2)
a4
a3
a2 h[1]
x(n-3)
a1 a0
AR1
x(n-4)
线性缓冲区实现FIR代码
.bss x,6 PA0 PA1 .set 0 .set 1
h[N-1] a5
AR1
x(n) x(n-1)
h[1] x(n-2)
a4
a3
a2 h[1]
x(n-3)
a1 a0
x(n-4)
线性缓冲区实现FIR:
h[N-1]
存储器
y(n)
x COEF
h[N-1] a5
AR1
x(n+1) x(n) x(n-1)
h[1] x(n-2)
a4
a3
a2 h[1]
x(n-3)
FIR滤波器的设计可以用 MATLAB 窗函数法进行。 可以改变上述指标,得到不同阶数、不同系数的 低通滤波器,然后参考实验代码实现。

2. 循环缓冲区法FIR:存储器
y xn
h[N-1]
y(n)
y xn
y(n+1) x(n) x(n-1) x(n-2) h[1] x(n-3) x(n-4) x(n-5)
.text _c_int00: SSBX STM STM LD PORTR FRCT #x+6,AR1 #5,AR0 #x+1,DP PA1, @x+1
.data
COEF .word 5*32768/10,4*32768/10 .word 3*32768/10 .word 2*32768/10,32768/10
线性缓冲区实现FIR:
存储器
x AR1
h[N-1]
y(n) COEF
x(n)
h[N-1] a5
x(n-1)
h[1] x(n-2)
a4
a3
a2 h[1]
x(n-3)
a1
a0
x(n-4)
线性缓冲区实现FIR:
存储器
x AR1
h[N-1]
y(n) COEF
x(n)
x(n-1)
h[1] x(n-2)
h[N-1] a5
返回首页
滤波器有关概念

数字滤波是 DSP 的最基本应用,利用 MAC 指令和 循环寻址可以方便地完成滤波运算。
FIR(有限冲激响应)滤波器

IIR(无限冲激响应)滤波器
设 FIR 滤波器的系数为 h(0),h(1), ...,h(N-1), X(n) 表示滤波器在 n 时刻的输入,则 n 时刻的输出 为:
主要操作:乘法累加运算,输入数据的移位、更新
x(n) h(0) Z-1 h(1) Z-1 h(2) h(N-2) Z-1 h(N-1) y(n)

图4-0 横截型FIR数字滤波器的结构图
•4.1.1 线性缓冲区法

线性缓冲区法又称延迟线法:
(1)对于N抽头FIR滤波器,在数据存储器中开辟一个 N单 元的缓冲区,存放最新的N个样本x(n); ( 2)滤波时从最老的样本开始,每读一个样本后,将此样 本向下移位, x(n-i) 变成x(n-i-1) ; ( 3)读完最后一个样本后,输入最新样本 x( n+1)至缓冲 区的顶部。

以上过程,可以用N=6的线性缓冲区示意图来说明,如图 4-1所示:
h[0] h[1] …… h[N-2]
ARx
h[N-1]
y[n]
y[nFra Baidu bibliotek1]
y[n+2]
图4-1 N=6的线性缓冲区示意图 返回本节
线性缓冲区实现FIR:
存储器
x
h[N-1]
y(n)
x(n)
COEF
h[N-1]
a5
x(n-1) x(n-2) x(n-3) x(n-4) x(n-5)
h[1]
x(n-4) x(n-5) x(n-6)
h[1]
AR2
x(n)
AR3
x(n-7)
xold
a3
系数对称FIR滤波器实现要点:
1.在数据存储器中开辟两个循环缓冲区:

New 区:存放 N/2=4 个新数据(设 N=8),AR2 指 向New 缓冲区中最新的数据;

Old区:存放4个老数据, AR3指向Old 缓冲区中 最老的数据;
{
.xn: align(8){}>DARAM PAGE 1 .b0: align(8){}>DARAM PAGE 1
}
5.产生滤波器输入信号的文件
按照通常的程序调试方法,先用Simulator逐步调 试各子程序模块,再用硬件仿真器在实际系统中 与硬件仪器联调。 使用CCS的Simulator进行滤波器特性测试时,需 要输入时间信号 x(n)。本例设计一个采样频率 Fs 为 8000Hz,输入信号频率为 1000Hz 和 2500Hz 的 合成信号,通过设计的低通滤波器将2500Hz信号 滤掉,余下1000Hz信号。
a [ x(n i) x(n N 1 i)]
i
循环缓冲区示意图:
New区 Old区 xnew COEF
a0 h[1] a1 a2
AR2 x(n+1)
x(n) x(n-3) x(n-2)
h[1]
x(n-4) x(n-5) x(n-6)
h[1]
x(n-1)
AR3
x(n-7)
xold
FIR:
STH
RPTZ
A,#5
*AR1-,COEF,A A,*AR1;保存y(n) *AR1+,PA0;输出
MACD PORTW
PORTR
B .end FIR
PA1 *AR1+0;读入
(MACD: COFF地址增加)
4.1.2 循环缓冲区法

对于N抽头FIR滤波器,在数据存储区开辟一个具 有N个单元的循环缓冲区,存放最新的N个输入数 据。 每次输入新的数据时,新数据替换滑窗中最老的数 据,其他数据则不需要移动。
h[1]
x(n-1)
x(n-7)
xold
a3
循环缓冲区示意图:
New区 Old区 COEF
a0 h[1] a1 a2
AR2
x(n) x(n-3) x(n-2)
h[1]
xnew
AR3
x(n-4) x(n-5) x(n-6)
h[1]
x(n-1)
x(n-7)
xold
a3
循环缓冲区示意图:
New区 Old区 xnew COEF
x(n)
h[N-1] a5
x(n-1) x(n-2)
AR1
a4
a3
a2 h[1] a1
x(n-3)
x(n-4)
h[1]
a0
线性缓冲区实现FIR:
存储器
x
h[N-1]
y(n) COEF
x(n) AR1
h[N-1] a5
x(n-1) x(n-2)
h[1]
a4
a3 a2
h[1] a1 a0
x(n-3)
x(n-4)
y(n) h(0)x(n) h(1)x(n 1) h( N 1)x[n ( N 1)]
h(i)x(n i)
i 0
N 1

其对应的滤波器传递函数为: H(z)

i 0
N 1
h (i)z i
如图 4-0 所示为横截型(又称直接型或卷积型) FIR数字滤波器的结构图。
循环缓冲区的长度为N/2。

2. 在程序存储器中设置系数表a0,a1,…,a N/2 。
(注意:系数长度 N为偶数时,只能实现低通、带通滤波,要 想实现高通、带阻,N应为基数,如何实现?)
3.使用 FIRS指令
FIRS Xmem,Ymem,pmad
(1) (AH)×系数ai+(B)→B,
(2) Xmem+Ymem)<<16 →A,即Xmem+Ymem在AH中。 (3) PAR+1 →PAR 实现: FIRS *AR2+0%,*AR3+0%,COEF (AH)×系数ai+(B)→B
图4-7 滤波器输出 信号频谱图
返回本节
4.1.3 系数对称FIR滤波器的DSP实现
N 1 i 0
y(n) ai x(n i) a 0 x(n) a 1 x(n 1) aN 1x[n ( N 1)]
即:ai=aN-1-i,且N为偶数
y ( n)
N / 21 i 0
STM STM STM STM LD PORTR #xn+6,AR2 #b0+6,AR3 #7,BK #-1,AR0 #xn,DP PA1 @xn
PA0
PA1 table
.set 0
.set 1 .data
.word 5*32768/10,4*32768/10 FIR: RPTZ A,#6 .word 2*32768/10,32768/10 MAC *AR2+0%, *AR3+0%,A
图4-2说明了使用循环寻址实现FIR滤波器的方法。


ARx
y(n)
y(n+1)
y(n+2
图4-2 FIR滤波器循环缓冲区存储器图
FIR滤波器设计举例

设 计 一 个 FIR 低 通 滤 波 器 , 通 带 边 界 频 率 为 1500Hz,通带波纹小于 1dB;阻带边界频率为 2 0 0 0 Hz, 阻 带 衰 减 大 于 4 0 dB; 采 样 频 率 为 8000Hz。
h[1]
a4 a3 a2
h[1] a1
AR1
a0
线性缓冲区实现FIR:
存储器
x
h[N-1]
y(n) COEF
x(n)
h[N-1] a5
x(n-1) x(n-2)
AR1
a4
a3 a2 h[1] a1 a0
x(n-3) x(n-4)
x(n-5)
h[1]
线性缓冲区实现FIR:
存储器
x
h[N-1]
y(n) COEF
x(n) x(n-3) x(n-2) AR2
h[1]
AR3
x(n-4) x(n-5) x(n-6)
h[1]
x(n-1)
x(n-7)
xold
a3
循环缓冲区示意图:
New区 Old区 xnew COEF
a0 h[1] a1 a2
AR2
x(n) x(n-3) x(n-2)
h[1]
AR3
x(n-4) x(n-5) x(n-6)


6.CCS集成开发环境下上机操作过程
(1)在CCS上建立fir工程并运行fir.out程序。
(2)观察输入信号的波形及频谱(图4-3~4-5)。 (3)观察输出信号的波形及频谱(图4-6、4-7 )。
图4-3 Graph 属性设置窗口
图4-4 输入信号的时域波形
图4-5 输入信号的频谱图
图4-6 滤波器输出信号时 域波形
a4
a3
a2 h[1]
x(n-3)
a1 a0
x(n-4)
线性缓冲区实现FIR:
存储器
AR1
h[N-1]
y(n)
x COEF
h[N-1] a5
x(n) x(n-1)
h[1] x(n-2)
a4
a3
a2 h[1]
x(n-3)
a1 a0
x(n-4)
线性缓冲区实现FIR:
h[N-1]
存储器
y(n)
x COEF
a3
循环缓冲区示意图:
New区 Old区 xnew COEF
a0 h[1] a1 a2
AR2
x(n) x(n-3) x(n-2)
h[1]
x(n-4) x(n-5) x(n-6)
h[1]
x(n-1)
AR3
x(n-7)
xold
a3
循环缓冲区示意图:
New区 Old区 xnew COEF
a0 h[1] a1 a2
h[N-1]
data
h[N-1] b0
x(n) x(n-1) x(n-2)
h[1] x(n-3) x(n-4) x(n-5)
b1
b2 b3 h[1] b4 b5
AR2
AR2
x(n-6)
x(n+1) AR3
b6
3. FIR代码
.bss y,1 xn b0 .usect “.xn”,7 .usect “.b0”,7
.text STH A,@y;保存y(n) PORTW @y,PA0;输出
_c_int00:
SSBX
STM
FRCT
#b0,AR1
PORTR PA1 ,*AR2+0%; 读入x(n+1)
B .end FIR
RPT
#6
MVPD table,*AR1+
4. CMD文件中循环缓冲区设置方法
2N R
要保证循环缓冲区低N位地址为0: SECTIONS


*(AR2)+*(AR3)→AH(累加器A的高位)
AR2-1→AR2,AR3-1→AR3 将累加器B清0,重复执行FIRS 指令N/2次 保存或输出结果(结果在BH中)。
4.修正数据指针,更新缓冲区数据

开始:将AR2和AR3分别指向New缓冲区中最新的数据和 Old 缓冲区中最老的数据。 AR2-->x(n), AR2--> x(n-7) 求出y(n)后: AR2-->x(n-1), AR3--> x(n-6)
a0 h[1] a1 a2
AR2
x(n) x(n+1) x(n-2)
h[1]
AR3
x(n-4) x(n-5) x(n-6)
h[1]
x(n-1)
x(n-3)
xold
a3
循环缓冲区示意图二:
New区 Old区 xnew COEF
a0 h[1] a1 a2
x(n+1)
x(n-3) x(n-2) x(n-1)
相关文档
最新文档