2009年 7月 30日 DSP原理及应用 1
第 6章 应用 程序设计内容提要数字信号处理主要面向密集型的运算,包括乘法
-累加、数字滤波和快速傅里叶变换等。 ’ C54x具备了高速完成上述运算的能力,并具有体积小、功耗低、
功能强、软硬件资源丰富等优点,现已在通信等许多领域得到了广泛应用。
本章结合数字信号处理和通信中最常见、最具有代表性的应用,介绍通用数字信号处理算法的 DSP实现方法,主要包括:
有限冲激响应( FIR) 数字滤波器无限冲激响应( IIR) 数字滤波器快速傅里叶变换( FFT)
正弦信号发生器。
在简要介绍上述内容的基本原理、结构和算法之后,重点介绍设计方法和 DSP实现的方法。
2009年 7月 30日 DSP原理及应用 2
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现
6.2 IIR滤波器的 DSP实现
6.3快速傅里叶变换 (FFT)的 DSP实现
6.4正弦波信号发生器
2009年 7月 30日 DSP原理及应用 3
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现在数字信号处理中,滤波占有极其重要的地位。
数字滤波是语音处理、图像处理、模式识别、频谱分析等应用中的基本处理算法。用 DSP芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好等特点。
数字滤波器是 DSP的基本应用,分为有限冲激响应滤波器 FIR和无限冲激响应滤波器 IIR。
本节主要讨论 FIR滤波器的基本结构、设计方法和 DSP实现方法。
2009年 7月 30日 DSP原理及应用 4
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现
6.1.1FIR滤波器的基本结构数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。
一个线性位移不变系统的输出序列 y(n)和输入序列 x(n)之间的关系,应满足常系数线性差分方程:
0 )()()(
1
1
0

ninyainxbny
M
i
i
N
i
i
(6.1.1)
x(n),输入序列,y(n):输出序列,ai,bi,滤波器系数,
N,滤波器的阶数。
2009年 7月 30日 DSP原理及应用 5
第 6章 应用程序设计
6.1.1FIR滤波器的基本结构在式( 6.1.1)中,若所有的 ai均为 0,则得 FIR滤波器的差分方程:
(6.1.2) )()( 1
0


N
i
i inxbny
对式( 6.1.2)进行 z变换,可得 FIR滤波器的传递函数:
)( )()(
1
0


N
i
i
i zbzX
zYzH (6.1.3)
2009年 7月 30日 DSP原理及应用 6
第 6章 应用程序设计
6.1.1FIR滤波器的基本结构
FIR滤波器的结构,
z-1z-1 +x(n) y(n)
x(n-1) x(n-N+1)
b0
b1
bN-2
bN-1
z-1
2009年 7月 30日 DSP原理及应用 7
第 6章 应用程序设计
6.1.1FIR滤波器的基本结构
FIR滤波器的单位冲激响应 h(n)为有限长序列。
偶对称线性相位 FIR滤波器的差分方程:
)]1()([)(
1
2
0

N
i
i iNnxinxbny
N——偶数
(6.1.4)
若 h(n)为实数,且满足偶对称或奇对称的条件,
则 FIR滤波器具有线性相位特性。
偶对称,h(n)= h(N-1-n);
奇对称,h(n)= -h(N-1-n)。
2009年 7月 30日 DSP原理及应用 8
第 6章 应用程序设计
6.1.1FIR滤波器的基本结构在数字滤波器中,FIR滤波器具有如下几个主要特点:
① FIR滤波器无反馈回路,是一种无条件稳定系统;
② FIR滤波器可以设计成具有线性相位特性。
2009年 7月 30日 DSP原理及应用 9
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现
6.1.2FIR滤波器的设计方法设计 FIR滤波器的基本方法之一,是用有限项傅氏级数来逼近所要求的滤波器响应。
1.用傅氏级数设计 FIR滤波器
Hd(?)的傅氏级数:
)( 2?


n
nj
nd eCH

(6.1.5)
= f / fs为归一化频率,fs为采样频率,?T =2?f / fs = 2。
2009年 7月 30日 DSP原理及应用 10
第 6章 应用程序设计
6.1.2FIR滤波器的设计方法系数 Cn的选择可在最小均方误差的条件下,使传递函数 H(z)逼近 Hd(?)来决定。
1.用傅氏级数设计 FIR滤波器
(6.1.6)
且 C-n = Cn。
1 1 2 d)(21njdn eHC
设 Hd(?)为偶函数,则
10 d)2c o s ()( nHC dn
n? 0 ( 6.1.7)
2009年 7月 30日 DSP原理及应用 11
第 6章 应用程序设计理想的传递函数 Hd(?)有无限多个系数 Cn,而实际的滤波器的系数只能有有限多个。因此,可以将式
(6.1.7)中的无限项级数进行截取,得到近似的传递函数:
1,用傅氏级数设计 FIR滤波器
(6.1.8)
|? | < 1,Q为有限的正整数。
( 6.1.9)
)( 2?

Q
Qn
nj
na eCH

令 z = ej2,则有
)(?

Q
Qn
n
na zCH?
2009年 7月 30日 DSP原理及应用 12
第 6章 应用程序设计近似传递函数的冲激响应是由一系列的系数来决定,C-Q,C-Q+1,…,C-1,C0,…,CQ-1,CQ。
1.用傅氏级数设计 FIR滤波器
( 6.1.10)
为了解决这个问题,可引入 Q个采样周期的延时,
得当 n > 0时,对应的 Cnzn项代表的是一个非因果的滤波器,即输出先于输入,要得到 n时刻的输出响应需用到 n+1时刻的输出响应。
)()(


Q
Qn
Q
Qn
Qn
n
n
n
Q
a
Q zCzCzzHzzH
2009年 7月 30日 DSP原理及应用 13
第 6章 应用程序设计令 i = -(n-Q),作变量置换得
1.用傅氏级数设计 FIR滤波器
0? i? 2Q ( 6.1.11)
令 bi = CQ-i,N -1 = 2Q,则 H(z)的表达式为
)(
0
2
2
0



Qi
Q
i
i
iQ
i
iQ zCzCzH
)(
1
0

N
i
i
i zbzH
0? i? N -1 ( 6.1.12)
当 N-1=2Q时,b0= CQ,b1= CQ-1,b2= CQ-2,…,
bQ= C0,bQ+1= C1,…,
b2Q-1= C-Q+1,b2Q= C-Q。
当 N=2Q+1时,系数 bi是关于 bQ对称的,即 bi=CQ-i且 Cn=C-n
2009年 7月 30日 DSP原理及应用 14
第 6章 应用程序设计例如,当 Q = 5时,滤波器的 11个系数如下:
1,用傅氏级数设计 FIR滤波器
b0 = b10 = C5 b1 = b9 = C4
b2 = b8 = C3 b3 = b7 = C2
b4 = b6 = C1 b5 = C0
根据卷积公式得
)()(
1
0


N
i
i inxbny
( 6.1.13)
由上述公式可实现 FIR滤波器,其响应由 N项构成。
2009年 7月 30日 DSP原理及应用 15
第 6章 应用程序设计
6.1.2FIR滤波器的设计方法
FIR滤波器分为低通滤波、高通滤波、带通滤波和带阻滤波,其设计可根据给出的滤波特性,通过下式计算系数 Cn来实现。
2.滤波器的设计
10 d)2c o s ()( nHC dn
n? 0
2009年 7月 30日 DSP原理及应用 16
第 6章 应用程序设计设低通滤波器的截止频率为 fc,采样频率为 fs,
则系数表达式:
2.滤波器的设计
( 6.1.14)
(1)低通滤波器的设计
2 )]/(2s in [ n ffnC scn?
2009年 7月 30日 DSP原理及应用 17
第 6章 应用程序设计高通滤波器可以由一个幅度为 1的响应减去一个低通滤波的响应来获得,如图所示。
2.滤波器的设计
(n)响应
(2)高通滤波器的设计
1
1
fc
1
f0
0 f
0 f
fc
(n)函数的表达式:
低通滤波高通滤波
(n) =
1 n = 0
0 n?0
高通滤波器的系数:
2 )]/(2s in [)( n ffnnC scn
2009年 7月 30日 DSP原理及应用 18
第 6章 应用程序设计带通滤波器可以由两个截止频率不同的低通滤波器获得,如图所示。
2.滤波器的设计低通滤波 2
(3)带通滤波器的设计
1
1
fc1
1
f0
0 f
0 f
fc1
低通滤波 1
带通滤波带通滤波器的系数,
等于两个低通滤波器的系数之差:
fc2
fc2
2 )]/(2s i n [ 2 n ffnC scn?
n
ffn- sc
2
)]/(s i n [ 2 1
fc1和 fc2为低通滤波器的截止频率,fs为采样频率。
2009年 7月 30日 DSP原理及应用 19
第 6章 应用程序设计带阻滤波器可由?(n)和带通滤波器相减获得,如图所示。
2.滤波器的设计
(n)响应
(4)带阻滤波器的设计
1
1
fc1
1
f0
0 f
0 f
fc1
带通滤波带阻滤波带阻滤波器的系数:
fc2
fc2
n ffnnC scn 2 )]/(2s i n [)( 2
2 )]/(s i n [ 2 1 n ffn- sc
2009年 7月 30日 DSP原理及应用 20
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现
6.1.3FIR滤波器的 MATLAB设计
MATLAB是一种功能强、效率高、便于进行科学和工程计算的交互式软件包,它集数值分析、矩阵运算、信号处理和图形显示于一体,为用户提供了方便、友好的界面环境。
MATLAB中的工具箱( Toolbox) 包含了许多实用程序。它提供了多种 FIR滤波器设计方法。
下面以标准频率响应设计法 fir1和任意频率响应设计法 fir2为例说明其使用方法 。
2009年 7月 30日 DSP原理及应用 21
第 6章 应用程序设计
6.1.3FIR滤波器的 MATLAB设计用来设计标准频率响应的基于窗函数的 FIR滤波器,可实现加窗线性相位 FIR数字滤波器的设计。
1.fir1函数语法,b=fir1(n,Wn)
b=fir1(n,Wn,‘ftype’)
b=fir1(n,Wn,Window)
b=fir1(n,Wn,‘ftype’,Window)
n,滤波器的阶数; Wn,滤波器的截止频率;
ftype,用来决定滤波器的类型,
当 ftype=high时,可设计高通滤波器;
当 ftype=stop时,可设计带阻滤波器。
Window,用来指定滤波器采用的窗函数类型,
其默认值为汉明( Hamming) 窗。
2009年 7月 30日 DSP原理及应用 22
第 6章 应用程序设计使用 fir1函数 可设计标准的低通、高通、带通和带阻滤波器。
1.fir1函数
(1)采用汉明窗设计低通 FIR滤波器使用 b=fir1(n,Wn)可得到低通滤波。 0? Wn?1,
Wn=1相当于 0.5fs。
格式:
b=fir1(n,Wn)
2009年 7月 30日 DSP原理及应用 23
第 6章 应用程序设计使用 fir1函数 可设计标准的低通、高通、带通和带阻滤波器。
1.fir1函数
(2)采用汉明窗设计高通 FIR滤波器在 b=fir1(n,Wn,?ftype?)中,当 ftype=high时,可设计高通滤波器。
格式:
b=fir1(n,Wn,‘high’)
2009年 7月 30日 DSP原理及应用 24
第 6章 应用程序设计使用 fir1函数 可设计标准的低通、高通、带通和带阻滤波器。
1.fir1函数
(3)采用汉明窗设计带通 FIR滤波器在 b=fir1(n,Wn)中,当 Wn=[ W1 W2 ]时,可得到带通滤波器,其通带为 W1 <w<W2,W1和 W2分别为通带的下限频率和上限频率。
格式:
b=fir1(n,[ W1 W2 ])
2009年 7月 30日 DSP原理及应用 25
第 6章 应用程序设计使用 fir1函数 可设计标准的低通、高通、带通和带阻滤波器。
1.fir1函数
(4)采用汉明窗设计带阻 FIR滤波器在 b=fir1(n,Wn,?ftype?)中,当 ftype= stop,
Wn=[ W1 W2 ]时,fir1函数可得到带阻滤波器。
格式:
b=fir1(n,[ W1 W2 ],‘stop’)
2009年 7月 30日 DSP原理及应用 26
第 6章 应用程序设计
1.fir1函数
(5)采用其他窗口函数设计 FIR滤波器使用 Window参数,可以用其他窗口函数设计出各种加窗滤波器。
Window参数可采用的窗口函数有:
Boxcar,Hanning,Bartlett,Blackman,
Kasier和 chebwin等,其默认时为 Hamming窗。
例如,采用 Bartlett窗设计带阻滤波器,
其格式:
b=fir1(n,[ W1 W2 ],‘stop’,Bartlett(n+1))
2009年 7月 30日 DSP原理及应用 27
第 6章 应用程序设计
1.fir1函数注意,用 fir1函数设计高通和带阻滤波器时,所使用的阶数 n应为偶数,当输入的阶数 n为奇数时,
fir1函数会自动将阶数增加 1形成偶数。
【 例 6.1.1】 采用 Hamming窗设计一个 48阶 FIR带通滤波器,
通带为 0.35 < w < 0.65。
解:采用 fir1函数的程序格式:
b=fir1( 48,[ 0.35 0.65 ]);
【 例 6.1.2】 设计一个 FIR高通滤波器,使用具有 30dB波纹的
Chebyshev窗,其阶数为 34,截止频率为 0.48。
解:采用 fir1函数设计高通滤波器的程序格式为
Window = chebwin(35,30);
b=fir1( 34,0.48,‘high’,Window) ;
2009年 7月 30日 DSP原理及应用 28
第 6章 应用程序设计
6.1.3FIR滤波器的 MATLAB设计用来设计有任意频率响应的各种加窗 FIR滤波器。
2.fir2函数语法:
b=fir2( n,f,m)
b=fir2( n,f,m,Window)
b=fir2( n,f,m,npt)
b=fir2( n,f,m,npt,Window)
b=fir2( n,f,m,npt,lap)
b=fir2( n,f,m,nptt,lap,Window)
2009年 7月 30日 DSP原理及应用 29
第 6章 应用程序设计
2.fir2函数说明:
参数 n为滤波器的阶数;
参数 f为频率点矢量,且 f?[0,1],f=1对应于 0.5fs。 矢量
f按升序排列,且第一个元素必须为 0,最后一个必须为 1,并可以包含重复的频率点;
参数 m为幅度点矢量,在矢量 m中包含了与 f相对应的期望得到的滤波器幅度;
参数 Window用来指定所使用的窗函数类型,其默认值为汉明( Hamming) 窗;
参数 npt用来指定 fir2函数对频率响应进行内插的点数;
参数 lap用来指定 fir2函数在重复频率点附近插入的区域大小。
2009年 7月 30日 DSP原理及应用 30
第 6章 应用程序设计
2.fir2函数
【 例 6.1.3】 设计一个 30阶的低通 FIR滤波器,其截止频率为 0.6。
解:采用 fir2函数的程序格式:
f = [ 0 0.6 0.6 1 ];
m = [ 1 1 0 0 ];
b=fir2( 30,f,m);
在使用 MATLAB设计 FIR滤波器时,还可以使用 freqz( )
和 plot( )函数。
freqz( )函数,可求出传递函数的幅频响应和相频响应;
plot( )函数,可绘出滤波器的幅频响应和相频响应曲线。
2009年 7月 30日 DSP原理及应用 31
第 6章 应用程序设计
2.fir2函数例如,在例 6.1.1~例 6.1.3中,若希望得到滤波器的特性,可使用 freqz() 函数,其格式:
freqz(b,1,512)
得滤波器的特性如图。
2009年 7月 30日 DSP原理及应用 32
第 6章 应用程序设计
2.fir2函数例 6.1.1 带通滤波器的特性
2009年 7月 30日 DSP原理及应用 33
第 6章 应用程序设计
2.fir2函数例 6.1.2 高通滤波器的特性
2009年 7月 30日 DSP原理及应用 34
第 6章 应用程序设计
2.fir2函数例 6.1.3 低通滤波器的特性
2009年 7月 30日 DSP原理及应用 35
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现
6.1.4FIR滤波器的 DSP实现
FIR滤波器的输出表达式:
y(n)=b0x(n)+b1x(n-1)+ … +bn-1x(n-N+1) ( 6.1.18)
bi为滤波器系数,x(n)为滤波器在 n时刻的输入,y(n)为 n
时刻的输出。
基本算法,采用乘法累加运算。即 不断地输入样本 x(n),经过 z-1延时后,再进行乘法 -
累加,最后输出滤波结果 y(n)。
2009年 7月 30日 DSP原理及应用 36
第 6章 应用程序设计
6.1.4FIR滤波器的 DSP实现
1.z-1算法的实现常用的方法,线性缓冲区法循环缓冲区法。
(1)线性缓冲区法又称延迟线法。特点,① 在数据存储器中开辟一个 N单元的缓冲区
(滑窗 ),用来存放最新的 N个输入样本;
② 从最老样本开始取数,每取一个数后,样本向下移位;
③ 读完最后一个样本后,输入最新样本并存入缓冲区的顶部。
2009年 7月 30日 DSP原理及应用 37
第 6章 应用程序设计
1.z-1算法的实现
(1)线性缓冲区法缓冲区,数据存储器顶部为低地址单元,存放最新样本;缓冲区顶部 最新样本底部为高地址单元,存放最老样本;
缓冲区底部 最老样本指针 ARx指向缓冲区底部。
← ARx
2009年 7月 30日 DSP原理及应用 38
第 6章 应用程序设计
(1)线性缓冲区法最新样本数据存储器最老样本ARx→
求 y(n)的过程:
算法:
)( inxbny
i i

7
0
)(
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
x(n-7)
取数、移位和运算,
① 以 ARx为指针,按 x(n-7)…… x(n)的顺序取数,每取一次数后,数据向下移一位,
并完成一次乘法累加运算;
② 当经过 8次取数、移位和运算后,得 y(n);
③ 求得 y(n)后,输入新样本 x(n+1),存入缓冲区顶部单元;
④ 修改指针 ARx,指向缓冲区的底部。
2009年 7月 30日 DSP原理及应用 39
第 6章 应用程序设计
(1)线性缓冲区法最新样本数据存储器最老样本ARx→
求 y(n)的过程:
算法:
)( inxbny
i i

7
0
)(
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
x(n-7) x(n-7)↑
ARx→
6) y(n)=y7=b7x(n-7)+0
x(n-6)↑
ARx→
5) y(n)=y6=b6x(n-6)+y7
x(n-5)↑
ARx→
4) y(n)=y5=b5x(n-5)+y6
x(n-4)↑
ARx→
3) y(n)=y4=b4x(n-4)+y5
x(n-3)↑
ARx→
2) y(n)=y3=b3x(n-3)+y4
x(n-2)↑
ARx→
1) y(n)=y2=b2x(n-2)+y3
x(n-1)↑
ARx→
x(n) y(n)=y1=b1x(n-1)+y2
x(n) y(n)=b0x(n)+y1← PORTRx(n+1) 结果,① y(n)
2009年 7月 30日 DSP原理及应用 40
第 6章 应用程序设计
(1)线性缓冲区法求 y(n+1)的过程:
算法:
)( inxbny
i i

11 7
0
)(
数据存储器
ARx→
x(n+1)
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
结果,① y(n)
取数顺序,x(n-6)…… x(n+1)
5)
4)
3)
2)
1)
x(n)
x(n+1)
最新样本,x(n+2)
2 ② y(n+1)
③ y(n+2)
④ y(n+3)
⑤ y(n+4)
⑥ y(n+5)
⑦ y(n+6)
⑧ y(n+7)
数据存储器
x(n+8)
x(n+7)
x(n+6)
x(n+5)
x(n+4)
x(n+3)
x(n+2)
x(n+1)ARx→
2009年 7月 30日 DSP原理及应用 41
第 6章 应用程序设计
(1)线性缓冲区法
Z-1的运算是通过执行存储器延时指令来实现的。
即将数据存储器中的数据向较高地址单元移位来进行延时。
其指令,DELAY Smem ; (Smem)?Smem+1
DELAY *AR3- ; AR3指向源地址将延时指令与其他指令结合使用,可在同样的机器周期内完成这些操作。例如:
LD + DELAY → LTD
MAC + DELAY → MACD
2009年 7月 30日 DSP原理及应用 42
第 6章 应用程序设计
(1)线性缓冲区法注意,用线性缓冲区实现 z-1运算时,缓冲区的数据需要移动,这样在一个机器周期内需要一次读和一次写操作。因此,线性缓冲区只能定位在 DARAM中。
优点:
在存储器中新老数据的位置直观明了。
2009年 7月 30日 DSP原理及应用 43
第 6章 应用程序设计
1.z-1算法的实现
(2)循环缓冲区法特点,① 在数据存储器中开辟一个 N个 单元的缓冲区 (滑窗 ),用来存放最新的 N个输入样本;
② 从最新样本开始取数;
③ 读完最老样本后,输入最新样本来代替最老样本,而其他数据位置不变;
④ 用 BK寄存器对缓冲区进行间接寻址,使缓冲区地址首尾相邻。
2009年 7月 30日 DSP原理及应用 44
第 6章 应用程序设计
(2)循环缓冲区法缓冲区:
数据存储器顶层为低地址单元,存放最新样本;
x(n)
底层为高地址单元,存放最老样本;
x(n-7)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
ARx指向最新样本单元。
ARx→
算 法,)( inxbny
i i

7
0
)(
计算过程,① 以 ARx为指针,按顺序取数,并修改指针;
x(n)
ARx→ x(n-1)
ARx→ x(n-2)
ARx→ x(n-3)
ARx→ x(n-4)
ARx→ x(n-5)
ARx→ x(n-6)
ARx→ x(n-7)
ARx→
② 每取 1次数后,完成 1次乘法累加计算;
y(n)=y0=b0x(n)+0
y(n)=y1=b1x(n-1)+y0
y(n)=y2=b2x(n-2)+y1
y(n)=y3=b3x(n-3)+y2
y(n)=y4=b4x(n-4)+y3
y(n)=y5=b5x(n-5)+y4
y(n)=y6=b5x(n-6)+y5
y(n)=y7=b5x(n-7)+y6
2009年 7月 30日 DSP原理及应用 45
第 6章 应用程序设计
(2)循环缓冲区法数据存储器
x(n)
x(n-7)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
算 法,)( inxbny
i i

7
0
)(
计算过程,② 每取 1次数后,完成 1次乘法累加计算;
③ 求得 y(n)后,输入新样本替代最老样本;
x(n+1)x(n+1)
④ 修改指针 ARx,指向最新样本单元。
ARx→
① 求 y(n),取数顺序,x(n)…… x(n-7)
最新样本,x(n+1) ARx,指向 x(n+1)单元
② 求 +1),取数顺序,x(n+1)…… x(n-6)
最新样本,x(n+2) ARx,指向 x(n+2)单元数据存储器
x(n)
x(n+1)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n+2)ARx→
③ 求 y(n+2),取数顺序,x(n+2)…… x(n-5)
最新样本,x(n+3) ARx,指向 x(n+3)单元数据存储器
x(n)
x(n+1)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n+3)
x(n+2)
ARx→
2009年 7月 30日 DSP原理及应用 46
第 6章 应用程序设计
(2)循环缓冲区法循环 缓冲区的优点:
① 缓冲区数据不需要移动;
② 可以使用 SARAM存储器。
实现 N个循环缓冲区单元首尾相邻,可用 BK寄存器按模间接寻址来实现。
常用指令,… *ARx+% ;增量、按模修正 ARx
addr=ARx,ARx=circ(ARx+1)
… *ARx-% ;减量、按模修正 ARx
addr=ARx,ARx=circ(ARx-1)
… *ARx+0% ;增 AR0,按模修正 ARx
addr=ARx,ARx=circ(ARx+AR0)
… *ARx-0% ;减 AR0,按模修正 ARx
addr=ARx,ARx=circ(ARx-AR0)
… *+ARx(1K)% ;加 (1K),按模修正 ARx
addr=circ(ARx+1K),
ARx=circ(ARx+1K)
2009年 7月 30日 DSP原理及应用 47
第 6章 应用程序设计
(2)循环缓冲区法
circ是根据 BK寄存器中的缓冲区长度,对 (ARx
+1),(ARx-1),(ARx+AR0),(ARx-AR0)和 (ARx+1k)
的值进行取模,使指针 ARx指向缓冲区,实现循环缓冲区首尾相邻。
例如,(BK)=N=8,(AR1)=0060h,用 *AR1+%间接寻址。
第一次寻址后,AR1指向 0061h单元;
第二次寻址后,AR1指向 0062h单元;
…… ……
第八次寻址后,AR1指向 0068h单元;
将 BK按 8取模,AR1回到 0060h单元。
2009年 7月 30日 DSP原理及应用 48
第 6章 应用程序设计
(2)循环缓冲区法循环寻址的算法:
if 0≤index+step < BK
index=index+step
else if index+step≥BK
index=index+step-BK
else if index+step< 0
index=index+step+BK
index:存放在辅助寄存器中的地址指针;
step:步长,可正可负,|step|≤BK 。
2009年 7月 30日 DSP原理及应用 49
第 6章 应用程序设计
(2)循环缓冲区法
① 用 BK规定循环缓冲区的长度 N;
② 缓冲区起始地址的 k个最低有效位必须为
0,且满足 2k>N。
要求:
例如,N=31,k的最小值为 5,则缓冲区的起始地址:
XXXX XXXX XXX0 0000B
若 N=32,k的最小值为 6,缓冲区的起始地址:
XXXX XXXX XX00 0000B
2009年 7月 30日 DSP原理及应用 50
第 6章 应用程序设计
6.1.4FIR滤波器的 DSP实现
2.FIR滤波器的实现
C54x提供的乘法 -累加指令 MAC和循环寻址方式,可使 FIR数字滤波器在单周期内完成每个样值的乘法 -累加计算。而每个样值的乘法 -累加计算,
可采用 RPTZ和 MAC指令结合循环寻址方式来实现。
为了实现对应项乘积运算,输入的样值 x(n)和滤波系数 bi必须合理的存放,并正确初始化存储块和块指针。样值 x(n)和滤波系数 bi的存放可用线性缓冲区或循环缓冲区实现。
2009年 7月 30日 DSP原理及应用 51
第 6章 应用程序设计
2.FIR滤波器的实现
(1)用线性缓冲区实现 FIR滤波器设 N=7,FIR滤波器的算法:
y(n)=b0x(n)+b1x(n-1)+…+ b5x(n-5) +b6x(n-6)
数据存储器暂存 y(n)
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
程序存储器
b6
b5
b4
b3
b2
b1
b0
x
b
双操作数寻址指令,MACD *AR1-,b,A
功能,A=A+(AR1)× (b),AR1-1→AR1,(AR1)→(AR1+1)
A
AR1→ x(n-6)
b6 x(n-6)× +A
b6× x(n-6)+A
AR1→
5)
2009年 7月 30日 DSP原理及应用 52
第 6章 应用程序设计
(1)用线性缓冲区实现 FIR滤波器程序清单:
.title,FIR1.ASM”
.mmregs
.def start
x,usect,x”,8
PA0,set 0
PA1,set 1
.data
COEF,.word 1*32768/10
.word 2*32768/10
.word -4*32768/10
.word 3*32768/10
.word -4*32768/10
.word 2*32768/10
.word 1*32768/10; 自定义数据空间
x 数据存储器 暂存 y(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
定义系数 bi
程序存储器
COEF b6; 定义 b6=0.1; 定义 b5=0.2; 定义 b4=-0.4; 定义 b3=0.3; 定义 b2=-0.4; 定义 b1=0.2; 定义 b0=0.1
b5
b4
b3
b2
b1
b0
x(n)
2009年 7月 30日 DSP原理及应用 53
第 6章 应用程序设计
(1)用线性缓冲区实现 FIR滤波器
x 数据存储器 暂存 y(n)
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)
x(n-5)
x(n-6)
程序存储器
COEF b6
b5
b4
b3
b2
b1
b0
程序清单:
.text
start,SSBX FRCT
STM #x+7,AR2
STM #6,AR0
LD #x+1,DP
PORTR PA1,@x+1
FIR1,RPTZ A,#6
MACD *AR2-,COEF,A
STH A,*AR2
PORTW *AR2+,PA0
BD FIR1
PORTR PA1,*AR2+0
.end
A;设置小数乘法;设置 AR2
AR2→;设置复位值 AR0=6;设置缓冲区首地址
→;输入 x(n);A清 0,设置迭代次数
00 0000 0000;7次乘法累加 和移位
b6× x(n-6)
AR2→
5)
A+b5× x(n-5)
AR2→
4)
4× 4)
AR2→
3)
3× 3)
AR2→
2)
2× 2)
AR2→
1)
1× 1)
x(n)
A+b × x(n)
AR2→
AR2→
y(n-1);暂存 y(n)
y(n);输出 y(n),修改 AR2
→;循环;输入最新数据,
修改 AR2=AR2+AR0
x(n+

2009年 7月 30日 DSP原理及应用 54
第 6章 应用程序设计
2.FIR滤波器的实现
(2)用 循环缓冲区 实现 FIR滤波器设 N=7,FIR滤波器的算法:
y(n)=b0x(n)+b1x(n-1)+…+ b5x(n-5) +b6x(n-6)
DARAM
y(n)
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)

x(n-5)
x(n-6)
DARAM
b0
b1
b2
b3
b4
b5
b6
y
b0
xn
2009年 7月 30日 DSP原理及应用 55
第 6章 应用程序设计
(2)用 循环缓冲区 实现 FIR滤波器程序清单:
.title,FIR2.ASM”
.mmregs
.def start
.bss y,1
xn,usect,xn”,7
b0,usect,b0”,7
PA0,set 0
PA1,set 1
.data
table,.word 1*32768/10
.word 2*32768/10
.word 3*32768/10
.word 4*32768/10
.word 5*32768/10
.word 6*32768/10
.word 7*32768/10
DARAM
y(n-1)
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)

b0
b1
b2
b3
b4

x(n-5)
x(n-6)
b5
b6;源文件标题;定义 MMR寄存器 符号名;定义模块;给 y保留 1个空间
y;给 xn段保留 7个空间
xn;给 b0段保留 7个空间
b0;PA0赋值为 0;PA1赋值为 1;从 ROM的 table定义数据;定义 0.1;定义 0.2;定义 0.3;定义 0.4;定义 0.5;定义 0.6;定义 0.7
ROM
table 0.1
0.2
0.3
0.4
0.5
0.6
0.7
2009年 7月 30日 DSP原理及应用 56
第 6章 应用程序设计
.text
start,SSBX FRCT
STM #b0,AR1
RPT #6
MVPD table,*AR1+
STM #xn+6,AR2
STM #b0+6,AR3
STM #7,BK
STM #-1,AR0
LD #xn,DP
PORTR PA1,@xn
FIR2,RPTZ A,#6
MAC *AR2+0%,*AR3+0%,A
STH A,@y
PORTW @y,PA0
BD FIR2
PORTR PA1,*AR2+0%
.end
DARAM
y(n-1)
x(n)
x(n-1)
x(n-2)
x(n-3)
x(n-4)

b0
b1
b2
b3
b4

x(n-5)
x(n-6)
b5
b6
y
xn
b0

A;设置小数乘法;AR1指向 b0
AR1→;设置传输次数
ROM
table 0.1
0.2
0.3
0.4
0.5
0.6
0.7;系数传输至数据区
0.1
AR1→ 0.2
AR1→ 0.3
AR1→ 0.4
AR1→ 0.5
AR1→ 0.6
AR1→ 0.7
AR1→;AR2指向 x(n-6)单元
AR2→;AR3指向 b6单元
3→;设置缓冲区长度;设置双操作数增量;设置页指针;输入 x(n);A清 0,设置迭代次数
00 0000 0000;双操作数乘法累加
.7x(n-6)+0
AR2→
3→
0.6 5 A
AR2→
3→
5 4
AR2→
3→
4 3
AR2→
3→
3 2
AR2→
3→
2 1
AR2→
3→
0.1x(n)+A

→;存储 y(n)
y(n);输出 y(n);循环;输入最新 x(n+1),修正 AR2
+1)

2009年 7月 30日 DSP原理及应用 57
第 6章 应用程序设计链接命令文件:
FIR2.obj
vectors.obj
-o FIR2.out
-m FIR2.map
-e start
MEMORY
{
PAGE0:
EPROM:org=0E000h,
len=1000h
VECS,org=0FF80h,
len=0080h
PAGE1:
SPRAM:org=0060h,
len=0020h
DARAM:org=0080h,
len=1380h
};选定的目标文件;生成 FIR4的输出文件;生成 FIR4的存储器映像文件;定义源程序的入口地址;定义目标存储器空间;第 0页:程序存储器;EPROM的起始地址,E000h
长度,4K; VECS的起始地址,FF80h
长度,0080h;第 1页:数据存储器; SPRAM的起始地址,0060h
长度,0020h; DARAM的起始地址,0080h
长度,1380h
存储空间
ROM RAM
EPROM




EPROM

0E000
4k
0EFFF
VECS


VECS
0FF80
80h
0FFEF
SPRAM



SPRAM
0060
20h
007F
DARAM



DARAM


0080
1380h
13EF
2009年 7月 30日 DSP原理及应用 58
第 6章 应用程序设计链接命令文件:
SECTIONS
{
.text:>EPROM PAGE 0
.data:>EPROM PAGE 0
.bss,>SPRAM PAGE 1
xn:align(8){}>DARAM PAGE 1
b0:align(8){}>DARAM PAGE 1
.vections:VECS PAGE 0
};在存储器中定义输出段的位置;text段定位在程序存储器即源程序位于程序存储器;系数区定义在程序存储器;bss段定义在暂存器; 从 xn起 8个单元定义在 DARAM;从 b0起 8个单元定义在 DARAM;vections定义在 VECS区
2009年 7月 30日 DSP原理及应用 59
第 6章 应用程序设计
2.FIR滤波器的实现
(3)系数对称 FIR滤波器的实现系数对称 FIR滤波器具有线性相位的特性,在数字信号处理中应用十分广泛,常用于相位失真要求较高的场合。
设滤波器 N=8,若系数 bn =bN-1-n,则为对称 FIR滤波器。其输出方程:
y(n) = b0x(n)+b1x(n-1)+b2x(n-2)+b3x(n-3)
+b3x(n-4)+b2x(n-5)+b1x(n-6)+b0x(n-7)
= b0[ x(n)+x(n-7)] + b1[ x(n-1)+x(n-6) ]
+b2[ x(n-2)+x(n-5) ]+b3[ x(n-3)+x(n-4) ]
需要:
4次乘法
7次加法
2009年 7月 30日 DSP原理及应用 60
第 6章 应用程序设计
(3)系数对称 FIR滤波器的实现对称 FIR滤波器的实现方法:
① 在 RAM中开辟两个 N/2长度的循环缓冲区 New和 Old,分别存放
N/2个新数据和老数据;
New Old
x(n)
x(n-3)
x(n-2)
x(n-1)
x(n-4)
x(n-5)
x(n-6)
x(n-7)
② 设置循环缓冲区指针:
AR1指向 New区中的最新数据,
AR2指向 Old区中的最老数据; AR1→
AR2→
③ 在程序存储器中设置系数表;
系数表
b0
b1
b2
b3
COEF
④ 进行 (AR1)+(AR2)?AH加法运算,
并修改数据指针,AR1+1?AR1,
AR2-1?AR2;
AH
x(n) x(n-7)x(n) + x(n
x(n) + x(n-7)
AR1→
AR2→
2009年 7月 30日 DSP原理及应用 61
第 6章 应用程序设计
(3)系数对称 FIR滤波器的实现对称 FIR滤波器的实现方法:
系数表
b0
b1
b2
b3
COEF
New
x(n)
x(n-3)
x(n-2)
x(n-1)
AR1→
Old
x(n-4)
x(n-5)
x(n-6)
x(n-7)
AR2→
x(n) + x(n-7)
AH
⑤ 累加器 B清 0,完成块操作,
重复执行 4次;
00 0000 0000
B乘法 —累加,(AH)?bi +B?B;
PAR→b0[x(n)+x(n-7)]+0
b0[x(n)+x(n-7)]修改系数指针,PAR+1?PAR;
PAR→
加法运算,(AR1)+(AR2)?AH;
x(n-3) + x(n-6)
x(n-3) + x(n-6)
修改数据指针,AR1+1?AR1,
AR2-1?AR2; AR1→
AR2→
b1[x(n 3) + x(n 6)]+B
b1[x(n-3) + 6)]+B
PAR→
2) 5)
2) 5)
AR1→
AR2→
2[x(n 2) + 5)]+
2[x(n 2) + 5)]+ PAR→
1) 4)
1) 4)
AR1→
AR2→
3[x(n 1) + 4)]+
3[x(n 1) + 4)]+

x(n) 7)


⑥ 保存和输出结果 ;
2009年 7月 30日 DSP原理及应用 62
第 6章 应用程序设计
(3)系数对称 FIR滤波器的实现对称 FIR滤波器的实现方法,x(n) + x(n-7)
AH
B
a3[x(n-1)+x(n-4)]+B
AR2→
Old
x(n-7)
x(n-6)
x(n-5)
x(n-4)
PAR→
系数表
b0
b1
b2
b3
New
x(n)
x(n-3)
x(n-2)
x(n-1)
AR1→
⑦ 修正数据指针,
AR1指向 New区的最老数据;
AR2指向 Old区的最老数据。
AR2→
⑧ 用 New区的最老数据替代 Old
区的最老数据,输入新数据替代 New区的最老数据 ;
3)
+1)
⑨ 重复执行④ ~ ⑧。
2009年 7月 30日 DSP原理及应用 63
第 6章 应用程序设计
(3)系数对称 FIR滤波器的实现系数对称 FIR滤波器指令:
格式,FIRS Xmem,Ymem,Pmad
功能,Pmad?PAR;
当 (RC)?0,则 B+AH?(Pmem)?B,
((Xmem)+ (Ymem))16?A,
PAR+1?PAR,RC-1?RC
其中,Pmem是通过 PAR寻址。
2009年 7月 30日 DSP原理及应用 64
第 6章 应用程序设计
(3)系数对称 FIR滤波器的实现程序清单:
.title,FIR3.ASM”
.mmregs
.def start
.bss y,1
x_new,.usect,DATA1”,4
x_old,.usect,DATA2”,4
size,set 4
PA0,set 0
PA1,set 1
.data
COEF,.word 1*32768/10
.word 2*32768/10
.word 3*32768/10
.word 4*32768/10;定义 MMR寄存器 符号名;定义模块;给 y保留 1个空间;给 DATA1段保留 4个空间;给 DATA2段 保留 4个空间;给符号 size赋值;给输出口地址 PA0赋值;给输入口地址 PA1赋值;在 ROM中定义数据段;定义数据 0.1;定义数据 0.2;定义数据 0.3;定义数据 0.4
y(n)
数据存储器

x(n)
x(n-3)
x(n-2)
x(n-1)…
x(n-4)
x(n-5)
x(n-6)
x(n-7)…
y SPRAM
x_new
DATA1
x_old
DATA2
程序存储器
b0
b1
b2
b3
COEF
系数表
2009年 7月 30日 DSP原理及应用 65
第 6章 应用程序设计
(3)系数对称 FIR滤波器的实现程序清单:
.text
start,LD #x_new,DP
SSBX FRCT
STM #x_new,AR1
STM #x_old+(size-1),AR2
STM #size,BK
STM #-1,AR0
PORTR PA1,#x_new;设置页指针;设置小数乘法;AR1指向 x_new单元;AR2指向 x_old+3单元;设置循环缓冲区长度;设置双操作数增量 AR0=-1;输入数据 x(n)
2009年 7月 30日 DSP原理及应用 66
第 6章 应用程序设计程序清单:
FIR3,ADD *AR1+0%,*AR2+0%,A
RPTZ B,#(size-1)
FIRS *AR1+0%,*AR2+0%,COEF
STH B,@y
PORTW @y,PA0
MAR *+AR1(2)%
MAR *AR2+%
MVDD *AR1,*AR2+0%
BD FIR3
PORTR PA1,*AR1
.end;完成 AH=x(n)+x(n-7);B清 0,设置重复次数;乘法累加、加法操作
B=AH× bi+B
AH=(AR1)+(AR2);保存 y(n)结果;输出结果;修正 AR1,指向 New区最老数据;修正 AR2,指向 Old区最老数据;New区向 Old区传送数据;循环;输入最新数据至 New区
2009年 7月 30日 DSP原理及应用 67
第 6章 应用程序设计
6.1 FIR滤波器的 DSP实现
6.1.5FIR滤波器的设计实例设计一个 FIR低通滤波器,其设计参数:
滤波器阶数,N=40;
截止频率,wp=0.35?,
ws=0.4?。
2009年 7月 30日 DSP原理及应用 68
第 6章 应用程序设计
6.1.5FIR滤波器的设计实例根据给定的设计参数,滤波器系数可由 MATLAB
中的 fir2函数产生,函数调用格式:
1.由给定的设计参数确定滤波器的系数
f = [ 0 0.35 0.4 1 ];
m = [ 1 1 0 0 ];
b=fir2( 39,f,m )
利用 freqz函数可绘制滤波器的幅频、相频特性,
其格式:
freqz(b,512,1000)
2009年 7月 30日 DSP原理及应用 69
第 6章 应用程序设计滤波器的频率特性,
1.由给定的设计参数确定滤波器的系数
2009年 7月 30日 DSP原理及应用 70
第 6章 应用程序设计采用循环缓冲区实现 FIR滤波器的源程序如下:
2,汇编源程序
.title,FIR.ASM”
.mmregs
.bss y,1
K_FIR_BFFR,set 40
PA0,set 0
PA1,set 1
FIR_COFF_TABLE,usect,FIR_COFF”,40 ;定义数据存储空间
D_DATA_BUFFER,usect,FIR_BFR”,40 ;定义数据存储空间
.data
COFF_FIR_START,.word -7*32768/10000,3*32768/10000;b0,b1
.word 14*32768/10000,10*32768/10000 ;b2,b3
… … …
.word 3*32768/10000,-7*32768/10000 ;b38b39
2009年 7月 30日 DSP原理及应用 71
第 6章 应用程序设计
.text
.def FIR_INIT
.def FIR_TASK
FIR_INIT,SSBX FRCT ;设置小数乘法
STM #FIR_COFF,AR5 ;AR1指向 b0单元
RPT #K_FIR_BFFR-1 ;设置传输次数
MVPD #COFF_FIR_START,*AR5+ ;系数 bi传输至数据区
STM #D_DATA_BUFFER,AR4 ;D_DATA_BUFFER缓冲区清 0
RPTZ A,#K_FIR_BFFR-1
STL A,*AR4+
STM #(D_DATA_BUFFER+K_FIR_BFFR-1),AR4
STM #(FIR_COFF_TABLE+K_FIR_BFFR-1),AR5
2009年 7月 30日 DSP原理及应用 72
第 6章 应用程序设计
STM #-1,AR0 ;设置双操作数减量
LD #D_DATA_BUFFER,DP ;设置页指针
PORTR PA1,@D_DATA_BUFFER ;输入 x(n)
FIR_TASK,STM #K_FIR_BFFR,BK
RPTZ A,#K_FIR_BFFR-1 ;重复操作
MAC *AR4+0%,*AR5+0%,A ;双操作数乘法 -累加
STH A,@y ;暂存 y(n)
PORTW @y,PA0 ;输出 y(n)
BD FIR_TASK ;循环
PORTR PA1,*AR4+0% ;输入最新样本,并修正 AR3
.end
2009年 7月 30日 DSP原理及应用 73
第 6章 应用程序设计在 ’ C5402DSP硬件系统中,用户可使用的存储器资源:
3,汇编源程序的链接命令文件程序存储空间,片内 0080H~3FFFH,
片外 48000H~4FFFFH;
数据存储空间,片内 0080H~3FFFFH,
片外 4000H~7FFFH。
2009年 7月 30日 DSP原理及应用 74
第 6章 应用程序设计
FIR滤波器源程序的链接命令文件如下:
/* SOLUTION FILE FOR FIR.CMD */
vectors.obj
fir.obj
-o fir.out
-m fir.map
-e fir_init
MEMORY
{
PAGE 0,EPROM,org = 0E000H len = 1000H
VECS,org = 0FF80H len = 0080H
PAGE 1,SPRAM,org = 0060H len = 0020H
DARAM,org = 0080H len = 1380H
}
2009年 7月 30日 DSP原理及应用 75
第 6章 应用程序设计
FIR滤波器源程序的链接命令文件如下:
SECTIONS
{
.text,> EPROM PAGE 0
.vectors,> VECS PAGE 0
.data,> EPRAM PAGE 0
.bss,> SPRAM PAGE1
FIR_BFR,align(128){} > DARAM PAGE 1
FIR_COFF,align(128){} > DARAM PAGE 1
}
2009年 7月 30日 DSP原理及应用 76
第 6章 应用程序设计
6.2 IIR滤波器的 DSP实现
IIR滤波器与 FIR滤波器相比,具有相位特性差的缺点,但它的结构简单、运算量小,具有经济、高效的特点,并且可以用较少的阶数获得很高的选择性。
因此,也得到了较为广泛的应用。
6.2.1IIR滤波器的基本结构
IIR滤波器差分方程的一般表达式:
)()()(


M
1i
i
N
0i
i inyainxbny
(6.2.1)
在零初始条件下,对式 (6.2.1)进行 z变换,得到传递函数:


N
i i
i
N
1NN
N
1NN
pz
zzC
azaz
bzbzbzH
11
10)(
具有 N个零点 zi和 N个极点 pi。 若有极点位于单位圆外将导致系统不稳定。
2009年 7月 30日 DSP原理及应用 77
第 6章 应用程序设计对于 IIR滤波器,系统稳定的条件如下:
若 |pi|<1,当 n→?时,h(n)→ 0,系统稳定;
若 | pi | >1,当 n→?时,h(n)→?,系统不稳定。
6.2.1IIR滤波器的基本结构
IIR滤波器具有多种形式,主要有:
直接型 (也称直接 Ⅰ 型
标准型 (也称直接 Ⅱ 型 )
变换型
级联型
并联型
2009年 7月 30日 DSP原理及应用 78
第 6章 应用程序设计
6.2.1IIR滤波器的基本结构二阶 IIR滤波器,又称为二阶基本节,分为 直接型、标准型和变换型。
1,二阶 IIR滤波器对于一个二阶 IIR滤波器,其输出,
y(n) = b0x(n)+b1x(n-1)+b2x(n-2)
-a1y(n-1)-a2y(n-2) (6.2.6)
2009年 7月 30日 DSP原理及应用 79
第 6章 应用程序设计
(1)直接型 (直接 Ⅰ 型 )
1,二阶 IIR滤波器根据式 (6.2.6),可以得到直接 型二阶 IIR滤波器的结构图。
4个延迟单元 ( z-1)
b0
b1
b2 z
-1
-a1
-a2
x(n) y(n)
+
+ +
z-1z-1
z-1
+
2009年 7月 30日 DSP原理及应用 80
第 6章 应用程序设计
(1)直接型 (直接 Ⅰ 型 )
直接 型二阶 IIR滤波器还可用下图 的结构实现 。
+
b0
b1
b2
-a1
-a2
x(n) y(n)
w(n)
+
+
+
z-1 z-1
z-1 z-1
2009年 7月 30日 DSP原理及应用 81
第 6章 应用程序设计
(1)直接型 (直接 Ⅰ 型 )
前向通道,+
z-1
z-1
b0
b1
b2
z-1
z-1
-a1
-a2
x(n) y(n)w(n)
+
+
+

2
0
)()(
i
i inwbny
反馈通道:

2
1
)()()(
j
j jnwanxnw
输出方程:



2
0
2
1
)()()(
i j
ji jnyainxbny
2009年 7月 30日 DSP原理及应用 82
第 6章 应用程序设计
(2)标准型 (直接 Ⅱ 型 )
1,二阶 IIR滤波器这种结构所使用的延迟单元最少 (只有 2个 ),因此得到了广泛地应用,故 称之为标准型 IIR滤波器。
z-1
z-1
b0
b1
b2
-a1
-a2
x(n) y(n)w(n)
+
+
+
+
2009年 7月 30日 DSP原理及应用 83
第 6章 应用程序设计
(3)变换型
1,二阶 IIR滤波器这种结构与标准型相比,延迟单元的数目和乘法的次数不变,但只需要三次累加。
z-1
b0b1b2
-a1
-a2
x(n)
y(n)z-1++ +
2009年 7月 30日 DSP原理及应用 84
第 6章 应用程序设计
6.2.1IIR滤波器的基本结构一个高阶 IIR滤波器,可以由多个二阶基本节级联组成。其传递函数可以表示为,
2,级联型 IIR滤波器
H(z) = CH1(z) H2(z)… Hk(z) (6.2.10)
Hi(z)为 一阶或二节阶的传递函数。
级联型滤波器的结构:
x(n) y(n)··· Hk(z)H2(z)H1(z)
2009年 7月 30日 DSP原理及应用 85
第 6章 应用程序设计
2,级联型 IIR滤波器由 三 个标准二阶节级联 构 成的 六 阶 IIR滤波器,
+Z-1+++ ++ Z-1Z-1Z-1Z-1 Z-1x(n)
b0
b1
b2
a2
a1
d0
d1
d2
c2
c1
f0
f1
f2
e1
e2
y(n)
由三个二阶节级联的六阶 IIR滤波器
2009年 7月 30日 DSP原理及应用 86
第 6章 应用程序设计
6.2.1IIR滤波器的基本结构高阶 IIR滤波器可以由多个二阶基本节 并 联组成。
其传递函数,
3,并联型 IIR滤波器
H(z) = C + H1(z) + H2(z) + … + Hk(z)
2009年 7月 30日 DSP原理及应用 87
第 6章 应用程序设计
3,并联型 IIR滤波器并联型滤波器的结构:
x(n) y(n)H1(z)
H2(z)
Hk(z)
C
..
.
+
+
2009年 7月 30日 DSP原理及应用 88
第 6章 应用程序设计
6.2 IIR滤波器的 DSP实现
IIR滤波器的设计可利用模拟滤波器原型来实现。
6.2.2IIR滤波器的设计
① 根据模拟设计理论设计出满足要求的传递函数 H(s);
② 将 H(s)变换成数字滤波器的传递函数 H(z)

设计方法:
2009年 7月 30日 DSP原理及应用 89
第 6章 应用程序设计
1.模拟滤波器的原型
6.2.2IIR滤波器的设计
① 巴特沃思滤波器,其幅度响应在通带内具有最平特性;
② 切比雪夫滤波器,在通带内具有等波纹特性,
且阶数小于巴特沃思滤波器;
③ 椭圆滤波器,在通带和阻带内具有等波纹特性,且阶数最小。
设计 IIR滤波器的基础是设计模拟滤波器的原型,
这些原型滤波器主要有:
2009年 7月 30日 DSP原理及应用 90
第 6章 应用程序设计
2.双线性变换
6.2.2IIR滤波器的设计转换关系:
将模拟滤波器转换为数字滤波器常用的方法是双线性变换,其作用是完成从 s平面到 z平面的映射。
1
1

z
zs
s
sz

1
1
2009年 7月 30日 DSP原理及应用 91
第 6章 应用程序设计
2.双线性变换双线性变换的基本性质,
① s平面上的 j?轴映射到 z平面的单位圆上;
② s平面的左半平面映射到 z平面的单位圆内;
③ s平面的右半平面映射到 z平面的单位圆外。
模拟频率?A与数字频率?D之间的映射关系:
(6.2.17)
H(s)与 H(z)之间的对应关系:
(6.2.18)
2t a n
TD
A

H(s)|s=j?A=H(z)|z=ej?DT
2009年 7月 30日 DSP原理及应用 92
第 6章 应用程序设计
2.双线性变换双线性变换的 设计步骤:
① 选择一个合适的模拟传递函数 H(s);
② 对截止频率或预定的数字频率?D进行预畸变,
由 式 (6.2.17)求得相应的模拟频率?A;
③ 用?A对 H(s)中的频率进行换算,即 H(s)|s=j?A;
④ 用式 (6.2.12)计算 H(z)。
1
1)(



z
zs
A
sHzH
(6.2.20)
2009年 7月 30日 DSP原理及应用 93
第 6章 应用程序设计
2.双线性变换
【例 6.2.1】 设计一个低通滤波器。
要求,带宽 BW=1rad/s,采样频率 fs=10Hz。
解,根据给定的指标,令?D= BW=1rad/s,T=1/ fs=0.1s。
① 选择一个满足带宽条件的低通模拟滤波器,
其传递函数:
1
1)(
ssH
② 根据 式 (6.2.17)对?D进行预畸变,求?A。
20
1
2
1.01t a n
2t a n?
TD
A

2009年 7月 30日 DSP原理及应用 94
第 6章 应用程序设计
2.双线性变换
【例 6.2.1】 设计一个低通滤波器。
要求,带宽 BW=1rad/s,采样频率 fs=10Hz。
③ 由?A对 H(s)进行校正。
④ 根据 式 (6.2.20),求期望的数字滤波器的传递函数 H(z)。
120
1
1
1)(
20/

sssH ssss A?
1
1
1
1 120
1)(






z
zs
z
zs
A s
sHzH
1921
1
11 )1(20
1


zz
z
z
2009年 7月 30日 DSP原理及应用 95
第 6章 应用程序设计
6.2 IIR滤波器的 DSP实现
IIR滤波器还可利用 MATLAB软件来设计,
主要有:
6.2.3IIR滤波器的 MATLAB设计巴特沃思滤波器的设计切比雪夫滤波器的设计椭圆滤波器的设计
2009年 7月 30日 DSP原理及应用 96
第 6章 应用程序设计
6.2.3IIR滤波器的 MATLAB设计
1.巴特沃思滤波器的设计
(1)butter函数功能,用于设计 Butterworth( 巴特沃思)滤波器。
语法,[b,a] = butter( n,Wn)
[b,a]= butter( n,Wn,?ftype?)
说明,可设计低通、带通、高通和带阻滤波器 。
特性,使通带内的幅度响应最大限度地平坦,
但 通带外的 幅度响应衰减较慢。
2009年 7月 30日 DSP原理及应用 97
第 6章 应用程序设计
1.巴特沃思滤波器的设计
(1)butter函数
[ b,a] = butter(n,Wn)
可以设计截止频率为 Wn的 n阶低通滤波器,其中截止频率应满足 0≤ Wn≤1,Wn=1相当于 0.5fs。
当 Wn=[W1 W2]时,butter函数产生一个 2n阶的数字带通滤波器,其通带为 W1< w <W2。
2009年 7月 30日 DSP原理及应用 98
第 6章 应用程序设计
1.巴特沃思滤波器的设计
(1)butter函数
[ b,a] = butter(n,Wn,?ftype?)
可以设计高通或带阻滤波器。
当 ftype= high时,可设计截止频率为 Wn的高通滤波器;
当 ftype= stop时,可设计带阻滤波器,此时
Wn = [ W1 W2],阻带为 W1< w <W2。
butter函数主要用于设计通带平坦的滤波器。
2009年 7月 30日 DSP原理及应用 99
第 6章 应用程序设计
1.巴特沃思滤波器的设计
(2)buttord函数功能,用来选择巴特沃思滤波器的阶数。
语法,[n,Wn] = buttord( Wp,Ws,Rp,Rs)
说明,可以在给定滤波器性能的情况下,选择滤波器的最小阶数,其中 Wp和 Ws分别是通带和阻带的截止频率
,其值为 0≤Wp(或 Ws)≤1,当该值为 1时表示 0.5fs。
Rp和 Rs分别是通带和阻带区的波纹系数和衰减系数。
2009年 7月 30日 DSP原理及应用 100
第 6章 应用程序设计
1.巴特沃思滤波器的设计
(2)buttord函数
[n,Wn] = buttord( Wp,Ws,Rp,Rs) 可以得到高通、带通和带阻滤波器的最小阶数 n。
当 Wp > Ws时,为高通滤波器;
当 Wp,Ws为二元矢量时,若 Wp < Ws,则为带通或带阻滤波器,此时 Wn也为二元矢量。
利用 buttord函数可得到滤波器的最小阶数 n,
并使通带 (0,Wp)内的纹波系数小于 Rp,阻带 (Ws,1)
内衰减系数大于 Rs。
2009年 7月 30日 DSP原理及应用 101
第 6章 应用程序设计
(2)buttord函数
【 例 6.2.2】 设计一个带通 IIR滤波器,通带范围为 100~250Hz,
带通的波纹系数小于 3dB,带外 50Hz处的衰减 30dB
解,根据给出的滤波器的性能,首先利用 buttord函数确定最小阶数 n,然后利用 butter函数来实现。
程序如下:
Wp = [100 250]/500;
Ws = [50 300]/500;
[n,Wn] = buttord( Wp,Ws,3,30) ;
[ b,a ] = butter( n,Wn) ;
freqz( b,a,512,1000)
2009年 7月 30日 DSP原理及应用 102
第 6章 应用程序设计
【 例 6.2.2】 设计一个带通 IIR滤波器,通带范围为 100~250Hz,
带通的波纹系数小于 3dB,带外 50Hz处的衰减 30dB
带通滤波器的频率特性:
2009年 7月 30日 DSP原理及应用 103
第 6章 应用程序设计
6.2.3IIR滤波器的 MATLAB设计
2.切比雪夫滤波器的设计切比雪夫滤波器可分为两种类型,ChebyshevⅠ
型和 ChebyshevⅡ 型,分别具有通带等波纹和阻带等波纹性能。
(1)cheby1函数功能,用来设计 ChebyshevⅠ 型滤波器 (通带等波纹 )
语法,[b,a] = cheby1( n,Rp,Wn)
[b,a] = cheby1( n,Rp,Wn,?ftype?)
说明,可以设计低通、带通、高通和带阻 ChebyshevⅠ 型 数字滤波器,其通带内为等波纹,阻带内为单调。
2009年 7月 30日 DSP原理及应用 104
第 6章 应用程序设计
2.切比雪夫滤波器的设计
(1)cheby1函数
[ b,a] = cheby1( n,Rp,Wn)
[ b,a] = cheby1( n,Rp,Wn,?ftype?)
可用来设计 n阶高通或带阻滤波器。
可以设计 n阶低通 ChebyshevⅠ 型 数字滤波器,
其中 Rp用来 确定 通带内的纹波,Wn为 该滤波器的截止频率。
当 Wn = [ W1 W2]时,cheby1函数可产生一个 2n阶的数字带通滤波器,其通带为 W1<w<W2。
2009年 7月 30日 DSP原理及应用 105
第 6章 应用程序设计
2.切比雪夫滤波器的设计
(2)cheb1ord函数功能,用来选择 ChebyshevⅠ 型滤波器的阶数。
语法,[n,Wn] = cheb1ord( Wp,Ws,Rp,Rs)
说明,可以在给定滤波器性能的情况下,选择 ChebyshevⅠ
型 高通、带通和带阻滤波器的最小阶数 。
Wp和 Ws分别为 通带和阻带 滤波器 的截止频率,其值为 0≤ Wp(或 Ws)≤1 。
Rp和 Rs分别是通带和阻带区的纹波系数。
2009年 7月 30日 DSP原理及应用 106
第 6章 应用程序设计
(2)cheb1ord函数
【 例 6.2.3】 设计一个低通 ChebyshevⅠ 型滤波器,通带范围
0~100Hz,通带波纹 3dB,阻带衰减 -30dB,数据采样频率为 1000Hz。
解,利用 cheb1ord函数和 cheby1函数设计滤波器 。
程序如下:
Wp = 100/500;
Ws = 200/500;
[n,Wn] = cheb1ord( Wp,Ws,3,30) ;
[ b,a ] = cheby1( n,3,Wn) ;
freqz( b,a,512,1000)
2009年 7月 30日 DSP原理及应用 107
第 6章 应用程序设计
【 例 6.2.3】 设计一个低通 ChebyshevⅠ 型滤波器,通带范围
0~100Hz,通带波纹 3dB,阻带衰减 -30dB,数据采样频率为 1000Hz。
带通滤波器的频率特性:
2009年 7月 30日 DSP原理及应用 108
第 6章 应用程序设计
2.切比雪夫滤波器的设计
(3)cheby2函数功能,用来设计 ChebyshevⅡ 滤波器 (阻带等波纹 )。
语法,[b,a] = cheby2( n,Rs,Wn)
[b,a] = cheby2( n,Rs,Wn,?ftype?)
说明,cheby2函数与 cheby1函数基本相同,只是用 cheby2函数所设计的滤波器,其通带内为单调的,阻带内为等波纹,由 Rs指定阻带内的波纹。
cheby2函数可以设计 ChebyshevⅡ 型 低通、带通、高通和带阻数字滤波器。
2009年 7月 30日 DSP原理及应用 109
第 6章 应用程序设计
2.切比雪夫滤波器的设计
(4)cheb2ord函数功能,用来选择 ChebyshevⅡ 型滤波器的阶数。
语法,[n,Wn] = cheb2ord( Wp,Ws,Rp,Rs)
说明,cheb2ord函数与 cheb2ord函数类似,可以利用该函数确定 ChebyshevⅡ 型 数字滤波器的最小阶数 n和截止频率 Wn。
cheb2ord函数与 cheby2函数配合使用,可设计出最低阶数的 ChebyshevⅡ 型 数字滤波器。
2009年 7月 30日 DSP原理及应用 110
第 6章 应用程序设计
(4)cheb2ord函数
【 例 6.2.4】 设计一个 ChebyshevⅡ 型带通滤波器,通带范围
100~250Hz,通带波纹 3dB,阻带衰减 -30dB,数据采样频率为 1000Hz。
解,先利用 cheb2ord函数找出最小阶数,然后由 cheby2
函数设计滤波器,
程序如下:
Wp = [100 250]/500;
Ws = [50 300]/500;
[n,Wn] = cheb2ord( Wp,Ws,3,30) ;
[ b,a ] = cheby2( n,3,Wn)
2009年 7月 30日 DSP原理及应用 111
第 6章 应用程序设计
6.2.3IIR滤波器的 MATLAB设计
3.椭圆滤波器的设计
(1)ellip函数功能,用来设计 Elliptic( 椭圆) 型滤波器。
语法,[b,a] = ellip( n,Rp,Rs,Wn)
[b,a] = ellip( n,Rp,Rs,Wn,?ftype?)
说明,可以设计低通、高通、带通和带阻 数字滤波器 。
参数 Rp和 Rs分别用来指定通带波纹和阻带波纹,
Wn指定滤波器的截止频率,n为 滤波器的阶数。
2009年 7月 30日 DSP原理及应用 112
第 6章 应用程序设计
(1)ellip函数
● [ b,a] = ellip( n,Rp,Rs,Wn)
● [ b,a] = ellip( n,Rp,Rs,Wn,?ftype?)
可设计 n阶高通或带阻滤波器。
当 ftype= high时,可设计截止频率为 Wn的高通滤波器;
当 ftype= stop,且 Wn=[W1 W2]时,可设计带阻滤波器,阻带为 W1< w <W2。
可设计 n阶低通或带通滤波器 。
当 Wn=[ W1 W2]时,可设计带通滤波器。
2009年 7月 30日 DSP原理及应用 113
第 6章 应用程序设计
3.椭圆滤波器的设计
(2)ellipord函数功能,用来选择椭圆滤波器的阶数。
语法,[n,Wn] = ellipord( Wp,Ws,Rp,Rs)
说明,用于选择指定性能时的椭圆 滤波器的最小阶数 n和截止频率 Wn,并与 ellip函数配合可设计出最低阶数的椭圆滤波器。
2009年 7月 30日 DSP原理及应用 114
第 6章 应用程序设计
(2)ellipord函数
【 例 6.2.5】 设计椭圆带通滤波器,通带范围 100~250Hz,通带波纹 3dB,阻带衰减 -30dB,数据采样频率为
1000Hz。
解,利用 ellipord和 ellip函数设计最小阶数椭圆滤波器程序如下:
Wp = [100 250]/500;
Ws = [50 300]/500;
[n,Wn] = ellipord( Wp,Ws,3,30) ;
[ b,a ] = ellip( n,3,Wn) ;
2009年 7月 30日 DSP原理及应用 115
第 6章 应用程序设计
6.2 IIR滤波器的 DSP实现
6.2.4IIR滤波器的 DSP实现
IIR滤波器的优点:
① 可用较少的阶数获得较高的选择特性;
② 所用存储单元少,运算次数少;
③ 成本低、效率高。
IIR滤波器的缺点:
① 在有限精度的运算中,容易出现不稳定现象;
② 选择性越好,相位的非线性越严重。
2009年 7月 30日 DSP原理及应用 116
第 6章 应用程序设计
6.2.4IIR滤波器的 DSP实现
1.二阶 IIR滤波器的实现方法一个高阶 IIR滤波器可由多个二阶 IIR滤波器组成。
+Z-1+++ ++ Z-1Z-1Z-1Z-1 Z-1x(n)
b0
b1
b2
a2
a1
d0
d1
d2
c2
c1
f0
f1
f2
e1
e2
y(n)
由三个二阶节级联的六阶 IIR滤波器
2009年 7月 30日 DSP原理及应用 117
第 6章 应用程序设计
1.二阶 IIR滤波器的实现方法
(1)标准型二阶 IIR滤波器的实现二阶 IIR滤波器的标准形式:
z-1
z-1
b0
b1
b2
a1
a2
x(n) y(n)w(n)
+
+
+
+
w(n-1)
w(n-2)
前向通道反馈通道
2009年 7月 30日 DSP原理及应用 118
第 6章 应用程序设计
(1)标准型二阶 IIR滤波器的实现反馈通道和前向通道的差分方程,
反馈通道,w(n) = x(n) + a1 w(n-1)+ a2 w(n-2)
前向通道,y(n) = b0 w(n) + b1 w(n-1)+ b2 w(n-2)
算 法,① 计算反馈通道;
② 计算前向通道;
③ 输出结果 y(n);
④ 重复循环。
特 点,先增益、后衰减。
2009年 7月 30日 DSP原理及应用 119
第 6章 应用程序设计
(1)标准型二阶 IIR滤波器的实现乘法累加运算采用双操作数指令来完成。
如,MAC *ARx,*ARy,A
功能,A = A + ARx* ARy
DARAM
w(n-2)
w(n-1)
w(n)
DARAM
b2
b1
b0
a2
a1
数据区 系数表
2009年 7月 30日 DSP原理及应用 120
第 6章 应用程序设计
SSBX FRCT
STM #w,AR2
STM #COEF+4,AR3
MVMM AR3,AR1
STM #3,BK
STM #-1,AR0
IIR,PORTR PA1,*AR2
LD *AR2+0%,16,A
MAC *AR2+0%,*AR3-,A
MAC *AR2+0%,*AR3-,A
STH A,*AR2
MPY *AR2+0%,*AR3-,A
MAC *AR2+0%,*AR3-,A
MAC *AR2,*AR3-,A
STH A,*AR2
MVMM AR1,AR3
BD IIR
PORTW *AR2,PA0;设置小数乘法;AR2指向 w;AR3指向 a1单元
DARAM
w(n-2)
w(n-1)
w(n)

b2
b1
b0
a2
a1
COEF
wAR2→
AR3→;保存 a1地址;设置缓冲区长度;设置变址寻址步长;输入数据 x(n) x(n)
计算反馈通道;x(n)送入 AH,修改指针
A
AR2→;第 1次乘法累加a1× w(n-1)+x(n)→A
AR2→
AR3→;第 2次乘法累加
a2× w(n-2)+A→A
AR3→;保存 (n)
w(n)
计算前向通道;乘法运算
b0× w(n)+A→A AR3→;第 1次乘法累加
b1× w(n-1)+A→A
AR3→;第 2次乘法累加
b2× w(n-2)+A→A;保存 y );指针 AR3回位;循环;输出数据 y(n)
2)
w(n-1)
y(n)
x(n)a1*w(n-1)+x(n)a2*w(n-2)+Ab0*w(n)+Ab1 (n 1)+AB2
2009年 7月 30日 DSP原理及应用 121
第 6章 应用程序设计
1.二阶 IIR滤波器的实现方法
(2)直接型二阶 IIR滤波器的实现二阶 IIR滤波器可以用直接型结构来实现。
传递函数:
2
2
1
1
2
2
1
10
1)(



zaza
zbzbbzH
差分方程,y(n)=b0x(n)+b1x(n-1)+b2x(n-2)
+a1y(n-1)+a2y(n-2)
特点,先衰减后增益,系统动态范围和鲁棒性较好。
2009年 7月 30日 DSP原理及应用 122
第 6章 应用程序设计
(2)直接型二阶 IIR滤波器的实现直接型二阶 IIR滤波器的结构:
+ +
Z-1
Z-1
+
Z-1
Z-1
+
x(n) b0
b1
b2
y(n)
a1
a2
2009年 7月 30日 DSP原理及应用 123
第 6章 应用程序设计
(2)直接型二阶 IIR滤波器的实现采用循环缓冲区方式寻址,在 DARAM中开辟 4个缓冲区,用来存放变量和系数。
DARAM DARAM DARAM DARAM
DX x(n-2)
x(n-1)
x(n)AR2→
DY y(n-2)
y(n-1)
y(n)
AR3→
DB b2
b1
b0AR4→
DA a2
a1AR5→
2009年 7月 30日 DSP原理及应用 124
第 6章 应用程序设计
.title,IIR.ASM”
.mmregs
.def start
DX,usect,DX”,3
DY,usect,DY”,3
DB,usect,DB”,3
DA,usect,DA”,3
PA0,set 0
PA1,set 1
.data
table,.word 0
.word 0
.word 0
.word 0
.word 1*32768/10
.word 2*32768/10
.word 3*32768/10
.word 5*32768/10
.word -4*32768/10;源文件标题;定义 MMR符号;定义程序模块;给 DX段保留 3个空间;给 DY段保留 3个空间;给 DB段保留 3个空间;给 DA段保留 3个空间
DARAM
DX
DX段
x(n-2)
x(n-1)
x(n)

DY
DY段
y(n-2)
y(n-1)
y(n)

DB
DB段
b2
b1
b0

DA
DA段
a2
a1;PA0赋值为 0;PA1赋值为 1;从 table定义数据;x(n-2);x(n-1);y(n-2);y(n-1);b2;b1;b0;a2;a1
ROM
table 0
0
0
0
0.1
0.2
0.3
0.5
-0.4
2009年 7月 30日 DSP原理及应用 125
第 6章 应用程序设计
DARAM
x(n-2)
x(n-1)
x(n)

y(n-2)
y(n-1)
y(n)
b2
b1

b0

a2
a1
DX
DY
DB
DA
ROM
0
0
0
0
0.1
0.2
0.3
0.5
-0.4
table
.text
start,SSBX FRCT
STM #DX,AR1
RPT #1
MVPD #table,*AR1+
STM #DY,AR1
RPT #1
MVPD #table+2,*AR1+
STM #DB,AR1
RPT #2
MVPD #table+4,*AR1+
STM #DA,AR1
RPT #1
MVPD #table+7,*AR1+
STM #DX+2,AR2
STM #DY+1,AR3
STM #DB+2,AR4
STM #DA+1,AR5;设置小数乘法;AR1指向 DX AR1→;传送初始化数据
x(n-2),x(n-1)
0
AR1→ 0; AR1指向 DY
AR1→;传送初始化数据y(n-2),y(n-1) 0
AR1→ 0; AR1指向 DB
AR1→;传送系数 b2,b1,b0
0.1
AR1→ 0.2
AR1→ 0.3; AR1指向 DA
AR1→;传送系数 a2,a1
0.5
AR1→ -0.4; 设定 DX段指针 AR2
AR2→; 设定 DY段指针 AR3
AR3→; 设定 DB段指针 AR4
AR4→; 设定 DA段指针 AR5
AR5→
2009年 7月 30日 DSP原理及应用 126
第 6章 应用程序设计
DARAM
x(n-2)
x(n-1)
x(n)

y(n-2)
y(n-1)
y(n)
0.1
0.2

0.3

0.5
-0.4
AR2→
AR5→
AR3→
AR4→
STM #3,BK
STM #-1,AR0
IIR,PORTP PA1,*AR2
MPY *AR2+0%,*AR4+0%,A
MAC *AR2+0%,*AR4+0%,A
MAC *AR2,*AR4+0%,A
MAC *AR3+0%,*AR5+0%,A
MAC *AR3+0%,*AR5+0%,A
MAR *AR5+0%
STH A,*AR3
BD IIR
PORTW *AR3,PA0
.end
计算前向通道计算反馈通道;设定缓冲区长度;设置双操作数增量;输入 x(n);乘法运算,A=b0× x(n)
A b0*x(n)
AR2→
AR4→;第 1次乘法累加
A=b1x(n-1)+b0x(n)
b1*x(n-1)+A
AR2→
AR4→;第 2次乘法累加
A=b2x(n-2)+b1x(n-1)+b0x(n)
b2 2)+
AR4→;第 3次乘法累加
A=a1y(n-1)+b2x(n-2)
+b1x(n-1)+b0x(n)
a1 y
AR3→
AR5→;第 4次乘法累加
A=a2y 2)+a1y(n-1)
+b2x(n-2)+b1x(n-1)
+b0x(n)
a2
AR3→
AR5→;修正 AR5
AR5→;保持 y(n);循环;输出 y(n)
2009年 7月 30日 DSP原理及应用 127
第 6章 应用程序设计连接命令文件:/? SOLUTION FILE FOR IIR.CMD?/
iir.obj vectors.obj
-o iir.out
-m iir.map
-e start
MEMORY{
PAGE0:
EPROM:org=0E000h,
len=1000h
VECS,org=0FF80h,len=0080h
PAGE1:
SPRAM:org=0060h,
len=0020h
DARAM:org=0080h,len=1380h
};选定的目标文件;生成 IIR的输出文件;生成 IIR的存储器映像文件;定义源程序的入口地址;定义目标存储器空间;第 0页:程序存储器;EPROM的起始地址,E000h
长度,4K; VECS的起始地址,FF80h
长度,0080h;第 1页:数据存储器; SPRAM的起始地址,0060h
长度,0020h; DARAM的起始地址,0080h
长度,1380h
存储空间
ROM RAM
EPROM




EPROM

0E000
4k
0EFFF
VECS


VECS
0FF80
80h
0FFEF
SPRAM



SPRAM
0060
20h
007F
DARAM



DARAM


0080
1380h
13EF
2009年 7月 30日 DSP原理及应用 128
第 6章 应用程序设计连接命令文件:
SECTIONS
{
.text,> EPROM PAGE 0
.data,> EPROM PAGE 0
DX,align(4){} > DARAM PAGE 1
DY,align(4){} > DARAM PAGE 1
DB,align(4){} > DARAM PAGE 1
DA,align(4){} > DARAM PAGE 1
.vections,> VECS PAGE 0
};在存储器中定义输出段的位置;text段定位在程序存储器即源程序位于程序存储器;系数区定义在程序存储器;从 DX起 4个单元定义在 DARAM;从 DY起 4个单元定义在 DARAM;从 DB起 4个单元定义在 DARAM;从 DA起 4个单元定义在 DARAM;vections定义在 VECS区
2009年 7月 30日 DSP原理及应用 129
第 6章 应用程序设计
6.2.4IIR滤波器的 DSP实现
2,高阶 IIR滤波器的实现一个高阶 IIR滤波器可以由若干个二阶基本节相级联或并联构成。由于调整每个二阶基本节的系数,
只涉及这个二阶基本节的一对极点和零点,不影响其他极、零点,因此用二阶基本节构成的 IIR滤波器便于系统的性能调整,受量化噪声影响小,因而得到了广泛的应用。
方法,将 高阶 IIR滤波器分解成若干个二阶基本节,
然后进行级联来实现。
特点,各基本节的极、零点独立,便于系统性能的调整。
2009年 7月 30日 DSP原理及应用 130
第 6章 应用程序设计
2,高阶 IIR滤波器的实现以四阶 椭圆 低通 IIR滤波器为例,介绍高阶滤波器的实现方法:
● 先求出四阶椭圆低通滤波器的传递函数 H(z);
● 再分解成两个级联的二阶基本节,分别求出系数,保存在 iir_coff中;
● 循环执行两次二阶基本节 IIR滤波,得到一个滤波后的值;
● 处理的采样点数由 K_FRAME_SIZE决定。
2009年 7月 30日 DSP原理及应用 131
第 6章 应用程序设计
2,高阶 IIR滤波器的实现二阶基本节,采用标准型二阶 IIR滤波器。
结构图,
z-1
z-1
b0
b1
b2
a1
a2
x(n) y(n)w(n)
+
+
+
+
w(n-1)
w(n-2)
反馈通道,w(n) = x(n) + a1 w(n-1) + a2 w(n-2)
前向通道,y(n) = b0 w(n) + b1 w(n-1)+ b2 w(n-2)
2009年 7月 30日 DSP原理及应用 132
第 6章 应用程序设计
2,高阶 IIR滤波器的实现程序清单:
.mmregs
.include,main.inc”
iir_table_star,sect,iir_coff”
.word -26778
.word 29529
.word 19381
.word -23184
.word 19381
.word -30497
.word 31131
.word 11363
.word -20735
.word 11363
iir_table_end
定义第一个二阶基本节系数定义第二个二阶基本节系数; a2; a1/2,对大于 1的系数定标; b2; b1; b0; a2; a1/2,对大于 1的系数定标; b2; b1; b0
2009年 7月 30日 DSP原理及应用 133
第 6章 应用程序设计
2,高阶 IIR滤波器的实现程序清单:
iir_coff_table,usect,coff_iir”,16
irr_d,usect,iir_vars”,3﹡ 2
irr_y,usect,iir_vars”,1
.def iir_init
.def iir_task
.sect,iir”
iir_init,STM #iir_coff_table,AR1
RPT #K_IIR_SIZE-1
MVPD #iir_table_start,*AR1+
STM #iir_d,AR2
RPTZ A,#5
STL A,*AR2+
RET; 初始化 数据和系数缓冲区; AR1指向 irr_coff_table; 将系数移到数据存储器; AR2指向 iir_d; 数据初始化; 使 w(n),w(n-1),w(n-2)为 0
2009年 7月 30日 DSP原理及应用 134
第 6章 应用程序设计
2,高阶 IIR滤波器的实现程序清单:
.sect,iir”
iir_task,STM #in_buf,AR3
STM #out_buf,AR4
STM #K_FRAME_SIZE-1,BRC
RPTB iir_filter_loop-1
LD *AR3+,8,A
iir_filter,STM #iir_d+5,AR2
STM #iir_coff_table,AR1
STM #K_BIQUD-1,AR0; AR3指向采样数据入口; AR4指向数据输出口; 设置采样点的个数; 由采样点的个数进行滤波; 装载输入数据 x(n); AR2指向 w(n),w(n-1),w(n-2); AR1指向 a2,a1/2,b2,b1,b0; 设定二阶基本节的个数
2009年 7月 30日 DSP原理及应用 135
第 6章 应用程序设计
2,高阶 IIR滤波器的实现程序清单:
feedback_path,MAC *AR1+,*AR2-,A
MAC *AR1,*AR2,A
MAC *AR1+,*AR2-,A
STH A,*AR2+
MAR *AR2+
forward_path,MPY *AR1+,*AR2-,A
MAC *AR1+,*AR2,A
DELAY *AR2-; A=x(n)+a2?w(n-2); A=x(n)+a2?w(n-2)+a1?w(n-1)/2; A=x(n)+a2?w(n-2)+a1?w(n-1); w(n)=x(n)+a2?w(n-2)+a1?w(n-1); A=b2?w(n-2); A=b2?w(n-2)+b1?w(n-1); w(n-2)=w(n-1)
2009年 7月 30日 DSP原理及应用 136
第 6章 应用程序设计
2,高阶 IIR滤波器的实现程序清单:
eloop,BANZD feedback_path,*AR0-
MAC *AR1+,*AR2,A
DELAY *AR2-
STH A,iir_y
LD iir_y,2,A
STL A,*AR4+
iir_filter_loop,RET
.end;二阶基本节未计算完,则循环; A=b2?w(n-2)+b1?w(n-1)+b0?w(n); w(n-1)=w(n); 定标输出数据;存储滤波结果 y(n)
2009年 7月 30日 DSP原理及应用 137
第 6章 应用程序设计
2,高阶 IIR滤波器的实现程序说明:
AR1——指向滤波器系数;
AR2——指向输入数据缓冲;
AR3——指向采样数据入口;
AR4——指向输出数据口。
注意,要合理安排各二阶基本节的前后顺序,使系统的精度得到优化。
2009年 7月 30日 DSP原理及应用 138
第 6章 应用程序设计
6.2.4IIR滤波器的 DSP实现
3,IIR滤波器实现中的几个问题
系数 ≥1时的定标方法在设计 IIR滤波器时,若出现系数大于 1时,需对系数进行定标。
方法,① 用大系数定标,即用大系数除所有系数。
② 大系数分解,即将大系数分解多个小于 1系数。
例如,b0=1,2,则
b0x(n)= 0,5b0x(n)+0,5b0x(n)
= 0,6x(n)+0,6x(n)
2009年 7月 30日 DSP原理及应用 139
第 6章 应用程序设计
3,IIR滤波器实现中的几个问题
对输入数据定标从外设输入数据加载到累加器 A,可用一下指令:
PORTR P0,@Xin
LD @Xin,16,A
若在运算中,出现输出值大于 1时,可将输入值缩小若干倍。
PORTR P0,@Xin
LD @Xin,16-3,A ;输入数据除 8,使输出数据 <1。
2009年 7月 30日 DSP原理及应用 140
第 6章 应用程序设计
6.3 快速傅里叶变换 (FFT)的 DSP实现傅里叶变换是将信号从时域变换到频域的一种变换形式,是信号处理领域中一种重要的分析工具。
离散傅里叶变换( DFT) 是连续傅里叶变换在离散系统中的表现形式。
快速傅里叶变换 (FFT)是快速计算 DFT的一种高效方法,可以明显地降低运算量,大大地提高 DFT的运算速度,从而使 DFT得到了广泛的应用。
DSP芯片的出现使 FFT的实现变得更加方便。由于多数的 DSP芯片都能在单指令周期内完成乘法 —累加运算,而且还提供了专门的 FFT指令使得 FFT算法在
DSP芯片上实现的速度更快。
2009年 7月 30日 DSP原理及应用 141
第 6章 应用程序设计
6.3 快速傅里叶变换 (FFT)的 DSP实现快速傅里叶变换( FFT) 是一种高效实现离散傅里叶变换( DFT) 的快速算法,是数字信号处理中最为重要的工具之一,它在声学、语音、电信和信号处理等领域有着广泛的应用。
6.3.1FFT算法的简介
1,离散傅氏变换 DFT
对于长度为 N的有限长序列 x(n),它的离散傅里叶变换为:

1
0
)()( N
n
nk
NWnxkX
k = 0,1,…,N-1 (6.3.1)
WN = e-j2?/N,称为旋转因子,或蝶形因子。
在 x(n)为复数序列的情况下,计算 X(k):
对某个 k值,需要 N次复数乘法,(N-1)次复数加法;
对所有 N个 k值,需要 N2次复数乘法和 N(N-1)次复数加法。
2009年 7月 30日 DSP原理及应用 142
第 6章 应用程序设计
6.3.1FFT算法的简介
2,快速傅氏变换 FFT
旋转因子 WN的特性:
对称性,WkN = -WNk+N/2;
周期性,WkN =WNk+N。
FFT的算法,将长序列的 DFT分解成短序列的 DFT。
例如:当 N为偶数时,其算法:
将 N点的 DFT分解为两个 N/2点的 DFT,使复数乘法减少一半;
将每个 N/2点的 DFT分解成 N/4点的 DFT,使复数乘法又减少一半,继续进行分解可以大大减少计算量。
最小变换的点数称为基数。
例如:对于基数为 2的 FFT算法,它的最小变换是
2点 DFT。
2009年 7月 30日 DSP原理及应用 143
第 6章 应用程序设计
2,快速傅氏变换 FFT
FFT算法
DIT FFT算法,是在时域内将每一级输入序列依次按奇 /偶分成 2个短序列进行计算。
按时间抽取的 FFT——DIT FFT
按频率抽取的 FFT——DIF FFT
DIF FFT算法,是在频域内将每一级输入序列依次按奇 /偶分成 2个短序列进行计算。
区别,旋转因子出现的位置不同。
DIT FFT算法 ——输入端,DIF FFT——输出端。
2009年 7月 30日 DSP原理及应用 144
第 6章 应用程序设计
2,快速傅氏变换 FFT
假定序列 x(n)的点数 N是 2的幂,按照 DIT FFT算法可分解为:
偶序列,x(0),x(2),x(4),…,x(N -2)
即 x1(r) = x(2r),r = 0,1,…,
奇序列,x(1),x(3),x(5),…,x(N -1)
即 x1(r) = x(2r+1),r = 0,1,…,
1?2N
1?2N
2009年 7月 30日 DSP原理及应用 145
第 6章 应用程序设计
2,快速傅氏变换 FFT
按照奇偶序列,x(n)的 DFT表示为:


1
0
1
0
)()()(
N
n
nk
N
N
n
nk
N
nn
WnxWnxkX
为奇数为偶数


12/
0
)12(
12/
0
2 )12()2(
N
r
kr
N
N
r
rk
N WrxWrx


12/
0
2
2
12/
0
2
1 )()(
N
r
rk
N
k
N
N
r
rk
N WrxWWrx
(6.3.2)
2009年 7月 30日 DSP原理及应用 146
第 6章 应用程序设计
2,快速傅氏变换 FFT
由于 WN2=[e-j(2?/N)]2=[e-j2?/(N/2)]=WN/2,则有:


12/
0
2/2
12/
0
2/1 )()()(
N
r
rk
N
k
N
N
r
rk
N WrxWWrxkX
)()( 21 kXWkX kN k = 0,1,…,N/2-1 (6.3.3)
X1(k)和 X2(k)分别为 x1(n)和 x2(n)的 N/2点的 DFT。由于对称性,WNk+N/2 = -WNk,
则 X(k+N/2)=X1(k) - WNkX2(k)。
N点 X(k)可分为两部分:
前半部分,X(k)=X1(k) + WNkX2(k) k=0,1,… N/2-1 (6.3.4)
后半部分,X(k+N/2)=X1(k)-WNkX2(k) k=0,1,… N/2-1 (6.3.5)
2009年 7月 30日 DSP原理及应用 147
第 6章 应用程序设计
2,快速傅氏变换 FFT
基 2 DIT FFT的蝶形运算:
WNk
-1
xm-1(p)
xm-1(q)
xm(p)
xm(q)
蝶形算法:
xm(p)= xm-1(p)+ xm-1(q)WNk (6.3.6)
xm(q)= xm-1(p)- xm-1(q)WNk (6.3.7)
2009年 7月 30日 DSP原理及应用 148
第 6章 应用程序设计
2,快速傅氏变换 FFT
在基数为 2的 FFT中,设 N=2M,共有 M级运算,每级有 N/2个 2点 FFT蝶形运算,因此,N点 FFT总共有
(N/2)log2N个蝶形运算。
例如:在 N点 FFT中,当 N=8时,共需要 3级,12
个基 2 DIT FFT的蝶形运算。
2009年 7月 30日 DSP原理及应用 149
第 6章 应用程序设计
2,快速傅氏变换 FFT
信号流程如图:
x(0)
x(4)
x(2)
x(6)
x(1)
x(5)
x(3)
x(7)
WN0
x(7)
x(6)
x(5)
x(4)
x(3)
x(2)
x(1)
x(0)
-1
-1
-1
WN0
WN0
WN0
-1
-1
WN0
WN2
WN0
WN2
-1
-1
-1
WN0
WN1
WN2
WN3 -1
-1
-1
-1
2009年 7月 30日 DSP原理及应用 150
第 6章 应用程序设计
2,快速傅氏变换 FFT
输入是经过比特反转的倒位序列 ——位码倒置。
排列顺序,x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7)
输出是按自然顺序排列。
排列顺序,x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7)
2009年 7月 30日 DSP原理及应用 151
第 6章 应用程序设计
6.3 快速傅里叶变换 (FFT)的 DSP实现下面以 8~1024复数点 FFT算法为例,介绍用 DSP芯片实现的方法。
6.3.2FFT算法 的 DSP实现
1,FFT运算序列的存储分配
FFT运算时间是衡量 DSP芯片性能的一个重要指标,
在用 DSP芯片实现 FFT算法时,合理地安排好所使用的存储空间是十分重要的。
2009年 7月 30日 DSP原理及应用 152
第 6章 应用程序设计
1,FFT运算序列的存储分配
(1)程序空间的分配程序存储器

sine1
E000

E1FF
正弦系数表
cosine1
E200

E3FF
余弦系数表
fft_prg
E400

E4A2
程序代码

.vectors
FF80

FFFF
复位向量和中断向量表
E000h~E1FFh,正弦系数表
E200h~E3FFh,余弦系数表
E400h~E4A2h,程序代码
FF80h~FFFFh,复位向量和中断向量表
2009年 7月 30日 DSP原理及应用 153
第 6章 应用程序设计
1,FFT运算序列的存储分配
(2)数据空间的分配数据存储器
0000

005F
存储映像寄存器
.bss
0060
0061
0062
暂存单元
stack
0063

006C
堆 栈

sine
0400

05FF
正弦系数表数据存储器

cosine
0800

09FF
余弦系数表

d_input
8000

87FF
输入数据

fft_data
8800

8FFF
FFT结果
(实部、虚部 )
fft_out
9000

93FF
FFT结果
(功率谱)
2009年 7月 30日 DSP原理及应用 154
第 6章 应用程序设计
1,FFT运算序列的存储分配
(3)I/O空间的配置
PA0——输出口;
PA1——输入口。
2009年 7月 30日 DSP原理及应用 155
第 6章 应用程序设计
2,FFT运算的实现用汇编程序实现 FFT算法主要分为四步:
(1)实现输入数据的比特反转
(2)实现 N点复数 FFT
(3)功率谱的计算
(4)输出 FFT结果
2009年 7月 30日 DSP原理及应用 156
第 6章 应用程序设计
2,FFT运算的实现
(1)实现输入数据的比特反转输入数据的比特反转是将输入数据进行位码倒置,以便在整个运算后的输出序列是一个自然序列。
在用汇编指令进行位码倒置时,使用位码倒置寻址可以大大提高程序执行速度和使用存储器的效率。
在这种寻址方式下,AR0存放的整数 N是 FFT点的一半,用一个辅助寄存器指向一个数据存放的单元。
当 AR0加到辅助寄存器时,地址将以位码倒置的方式产生。
2009年 7月 30日 DSP原理及应用 157
第 6章 应用程序设计
2,FFT运算的实现
(2)实现 N点复数 FFT
N点复数 FFT算法的实现可分为三个功能块,
第一级蝶形运算
第二级蝶形运算
第三级至 log2N级蝶形运算对于任何一个 2的整数幂 N= 2M,N点复数 FFT算法总可以通过 M次分解成为 2点的 DFT计算。通过这样的 M次分解,可构成 M(即 log2N)级迭代计算,每级由
N/2个碟形运算组成。
2009年 7月 30日 DSP原理及应用 158
第 6章 应用程序设计
(2)实现 N点复数 FFT
每个蝶形运算可由基本迭代运算完成。
设蝶形的输入为 xm-1(p)和 xm-1(q),输出为 xm(p)
和 xm(q),则有
xm(p) = xm-1(p)+xm-1(q)WNk
xm(q) = xm-1(p)-xm-1(q)WNk (6.3.8)
m为第 m列迭代,p和 q为数据所在的行数 。
为了避免运算结果的溢出,对每个蝶形的运算结果右移一位。
2009年 7月 30日 DSP原理及应用 159
第 6章 应用程序设计
(2)实现 N点复数 FFT
FFT运算中的旋转因子 WN是一个复数,可表示:
为了实现旋转因子 WN的运算,在存储空间分别建立正弦表和余弦表,每个表对应从 0度到 180度,
采用循环寻址来对正弦表和余弦表进行寻址。
N
kj
N
keW Nkjk
N
2s i n2c o s/2
2009年 7月 30日 DSP原理及应用 160
第 6章 应用程序设计
2,FFT运算的实现
(3)功率谱的计算用 FFT计算 x(n)的频谱,即计算:
X(k)是由实部 XR(k)和虚部 X I(k)组成的复数:
X(k)=XR(k)+jX I(k)
计算功率谱时只需将 FFT变换好的数据,按照实部 XR(k)和虚部 X I(k)求它们的平方和,然后对平方和进行开平方运算。

1
0
)()(
N
n
nk
NWnxkX
2009年 7月 30日 DSP原理及应用 161
第 6章 应用程序设计
3,汇编语言程序程序主体由 四个子程序组成,
● rfft_task,主调用子程序,用来调用其他子程序,实现统一的接口。
● bit_rev,位码倒置子程序,用来实现输入数据的比特反转。
● fft,FFT算法子程序,用来完成 N点 FFT运算。分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至 log2N级蝶形运算。
● power,功率谱计算子程序。
2009年 7月 30日 DSP原理及应用 162
第 6章 应用程序设计
4,正弦系数表和余弦系数表正弦和余弦系数表可以由数据文件 coeff.inc给出,主程序通过,copy汇编命令将正弦和余弦系数表与程序代码汇编在一起。
数据文件 coeff.inc给出 1024复数点 FFT的正弦、
余弦系数各 512个。利用此系数表可完成 8~1024点 FFT
的运算。
2009年 7月 30日 DSP原理及应用 163
第 6章 应用程序设计
6.4正弦波信号发生器正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。
通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。
查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。
泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。
本节主要介绍用泰勒级数展开法来实现正弦波信号。
2009年 7月 30日 DSP原理及应用 164
第 6章 应用程序设计
6.4正弦波信号发生器
6.4.1 产生正弦波的算法正弦函数和余弦函数可以展开成泰勒级数,其表达式:
!9!7!5!3)s in (
9753 xxxx
xx
!8!6!4!21)c o s (
8642 xxxx
x
2009年 7月 30日 DSP原理及应用 165
第 6章 应用程序设计
6.4.1 产生正弦波的算法取泰勒级数的前 5项,得近似计算式:
))))((((
98
1
76
1
54
1
32
1
!9!7!5!3
)s in (
2222
9753


xxxx
x
xxxx
xx
) ) )(((
87
1
65
1
43
1
2
1
!8!6!4!2
1)c o s (
2222
8642


xxxx
xxxx
x
(6.4.3)
(6.4.4)
2009年 7月 30日 DSP原理及应用 166
第 6章 应用程序设计
6.4.1 产生正弦波的算法递推公式:
(6.4.3)
(6.4.4)
sin(nx) = 2cos(x)sin[(n-1)x]-sin[(n-2)x]
cos(nx) = 2cos(x)sin[(n-1)x]-cos[(n-2)x]
由递推公式可以看出,在计算正弦和余弦值时,
需要已知 cos(x),sin(n-1)x,sin(n-2)x和 cos(n-2)x。
2009年 7月 30日 DSP原理及应用 167
第 6章 应用程序设计计算一个角度 x的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现。
在调用前先在数据存储器 d_xs单元中存放 x的弧度值,计算结果存放在 d_sinx单元中。
1,计算一个角度的正弦值程序中要用到一些存储单元存放数据和变量,
存储单元的分配如下:
d_xs,x; d_squr_xs,x2
d_temp_s:暂存; d_sinx:计算结果 sinx
c_1_s,7FFFh (数值 1); d_coef_s,泰勒系数
2009年 7月 30日 DSP原理及应用 168
第 6章 应用程序设计存储单元分配图:
1,计算一个角度的正弦值数据存储器
d_xs x
d_squr_xs x2
d_temp_s
d_sinx sinx
c_1_s 7FFFH
d_coef_s c1=01C7H
c2=030BH
c3=0666H
c4=1556H
程序存储器
table_s c1=1/(8*9)
c2=1/(6*7)
c3=1/(4*5)
c4=1/(2*3)
2009年 7月 30日 DSP原理及应用 169
第 6章 应用程序设计程序清单 sinx.asm:
.title,sinx.asm”
.mmregs
.def start
.ref sin_start,d_xs,d_sinx
STACK,.usect,STACK”,10
start,STM #STACK+10,SP
LD #d_xs,DP
ST #6487H,d_xs
CALL sin_start
end,B end
1,计算一个角度的正弦值; 定义符号; 定义符号; 建立堆栈; 设置堆栈指针; 设置页指针; x→d_xs; 调用子程序
2009年 7月 30日 DSP原理及应用 170
第 6章 应用程序设计程序清单 sinx.asm:
1,计算一个角度的正弦值
sin_start:
.def sin_start
d_coef_s,usect,coef_s”,4
.data
table_s,.word 01C7H
.word 030BH
.word 0666H
.word 1556H
d_xs,usect,sin_vars”,1
d_squr_xs,usect,sin_vars”,1
d_temp_s,usect,sin_vars”,1
d_sinx,usect,sin_vars”,1
c_1_s,usect,sin_vars”,1;子程序; 定义符号; 定义数据空间存放系数;定义程序空间存放系数; c1=1/(8?9); c2=1/(6?7); c3=1/(4?5); c4=1/(2?3); 定义 1个数据空间存放 x; 定义 1个数据空间存放 x2; 定义 1个暂存单元; 定义数据空间存放结果; 定义数据空间存放数值 1
2009年 7月 30日 DSP原理及应用 171
第 6章 应用程序设计程序清单 sinx.asm:
.text
SSBX FRCT
STM #d_coef_s,AR4
RPT #3
MVPD #table_s,*AR4+
STM #d_coef_s,AR2
STM #d_xs,AR3
STM #c_1_s,AR5
ST #7FFFH,c_1_s
SQUR *AR3+,A
ST A,*AR3
|| LD *AR5,B
MASR *AR3+,*AR2+,B,A
MPYA A; 设置小数运算; 设置系数表首地址; 设置重复操作次数; 向系数表传送泰勒系数; 系数表首地址送 AR2; x单元地址送 AR3; 数值 1地址送 AR5; 将数值 1送 c_l_s单元; 求 x的平方值; x2值存入 d_squr_xs单元; B=1; A=1-x2/72,T=x2; A=T?A=x2(1-x2/72)
2009年 7月 30日 DSP原理及应用 172
第 6章 应用程序设计
STH A,*AR3
MASR *AR3-,*AR2+,B,A
MPYA *AR3+
ST B,*AR3
|| LD *AR5,B
MASR *AR3-,*AR2,B,A
MPYA *AR3+
ST B,*AR3
|| LD *AR5,B
MASR *AR3-,*AR2,B,A
MPYA d_xs
STH B,d_sinx
RET
.end; (d_temp_s)=x2(1-x2/72); A=1-x2/42(1-x2/72); T= x2(1-x2/72); B=x2(1-x2/42(1-x2/72)); (d_temp_s)=x2(1-x2/42(1-x2/72)); B=1; A=1-x2/20(1-x2/42(1-x2/72)); B=x2(1-x2/20(1-x2/42(1-
x2/72))); (d_temp_s)=B=…; B=1; A=1-x2/6(1-x2/20(1-x2/42(1-x2/72))); B=x(1-x2/6(1-x2/20(1-x2/42(1-x2/72)))); 计算 sinx结果存入 d_sinx单元; 子程序返回
2009年 7月 30日 DSP原理及应用 173
第 6章 应用程序设计计算余弦值与计算正弦值相同。
存储单元分配图:
2,计算一个角度的余弦值数据存储器
d_xc x
d_squr_xc x2
d_temp_c
d_cosx cosx
c_1_c 7FFFH
d_coef_c c1=0249H
c2=0444H
c3=0AABH
c4=4000hH
程序存储器
table_c c1=1/(7?8)
c2=1/(5?6)
c3=1/(3?4)
c4=1/2
2009年 7月 30日 DSP原理及应用 174
第 6章 应用程序设计实现步骤如下:
3,正弦波的实现第一步:利用 sin_start和 cos_start子程序,计算
0?~45?(间隔为 0.5?)的正弦和余弦值;
第二步:利用 sin(2x)=2sin(x)cos(x)公式,计算
0?~90?的正弦值(间隔为 1?);
第三步:通过复制,获得 0?~359?的正弦值;
第四步:将 0?~359?的正弦值重复从 PA口输出,便可得到正弦波。
2009年 7月 30日 DSP原理及应用 175
第 6章 应用程序设计正弦波源程序清单 sin.asm
3,正弦波的实现
.title,sinx.asm”
.mmregs
.def start
.ref d_xs,sinx,d_sinx,d_xc,cosx,d_cosx
sin_x,.usect,sin_x”,360
STACK,.usect,STACK”,10
k_theta,set 286 ; theta=pi/360(0.5deg)
PA0,set 0
2009年 7月 30日 DSP原理及应用 176
第 6章 应用程序设计正弦波源程序清单 sin.asm
start,.text
STM #STACK+10,SP
STM #0,AR0
STM k_theta,AR1
STM #sin_x,AR7
STM #90,BRC
RPTB loop1-1
LDM AR0,A
LD #d_xs,DP
STL A,@d_xs
STL A,@d_xc; 主程序; 设置堆栈; AR0=x=0; 设置增量; AR7指向 sin_x; 设置重复次数,计算 sin0至 sin90; 取 x值; 设置页指针; 将 x值送入 d_xs单元; 将 x值送入 d_xc单元
2009年 7月 30日 DSP原理及应用 177
第 6章 应用程序设计正弦波源程序清单 sin.asm
CALL sin_start
CALL cos_start
LD #d_sinx,DP
LD @d_sinx,16,A
MPYA @d_cosx
STH B,1,*AR7+
MAR *AR0+0; 调用 sinx子程序,计算 x的正弦值; 调用 cos子程序,计算 x的余弦值; 切换到正弦指数据区; 求得正弦值 sin(x)加载累加器 A; 完成 sin(x)?cos(x)运算,将结果存入 B; 完成 2?sin(x)?cos(x)运算,;结果存入 AR7指定单元;修改 AR0
2009年 7月 30日 DSP原理及应用 178
第 6章 应用程序设计正弦波源程序清单 sin.asm
loop1,STM #sin_x+89,AR6
STM #88,BRC
RPTB loop2-1
LD *AR6-,A
STL A,*AR7+
loop2,STM #179,BRC
STM #sin_x,AR6
RPTB loop3-1
LD *AR6+,A
NEG A
STL A,*AR7+; AR6指向 sin_x+89单元; 设置重复次数,计算 sin91至 sin179; 设置重复次数,计算 sin180至 sin359; AR6指向 sin_x单元
2009年 7月 30日 DSP原理及应用 179
第 6章 应用程序设计正弦波源程序清单 sin.asm
loop3,STM #sin_x,AR7
STM #1,AR1
STM #360,BK
loop4,PORTW *AR7+0%,PA0
B loop4
.end; AR7指向 sin_x单元; 设置缓冲区长度; 输出正弦值; 循环输出,产生正弦波
2009年 7月 30日 DSP原理及应用 180
第 6章 应用程序设计产生正弦波链接命令文件 sin.cmd
vectors.obj
sin.obj
-o sin.out
-m sin.map
-e start
MEMORY
{
PAGE0,EPROM,org = 0E000H,len=1000H
VECS,org = 0FF80H,len=0080H
PAGE1,SPRAM,org = 0060H,len=0020H
DARAM1,org = 0080H,len=0010H
DARAM2,org = 0090H,len=0010H
DARAM3,org = 0200H,len=0200H
}
2009年 7月 30日 DSP原理及应用 181
第 6章 应用程序设计产生正弦波链接命令文件 sin.cmd
SECTIONS
{
.text,> EPROM PAGE0
.data,> EPROM PAGE0
STACK,> SPRAM PAGE1
sin_vars,> DARAM1 PAGE1
coef_s,> DARAM1 PAGE1
cos_vars,> DARAM1 PAGE1
coef_c,> DARAM2 PAGE1
sin_x,align (512){}> DARAM3 PAGE1
.vectors,> VECS PAGE0
}