129

Click here to load reader

第 8 章 数字信号处理典型算法程序设计

Embed Size (px)

DESCRIPTION

第 8 章 数字信号处理典型算法程序设计. 本章将要讲解通信与信号处理中常见的下列几种具有代表性的算法在 C54x 芯片中的具体实现方法: 卷积 有限冲激响应 (FIR) 数字滤波器 无限冲激响应 (IIR) 数字滤波器 快速傅立叶变换 (FFT). 第 8 章 数字信号处理典型算法程序设计. 目录: 8.1 卷积运算的 DSP 实现 8.2 数字滤波器的 DSP 实现 8.3 IIR 滤波器的 DSP 实现 8.4 快速傅立叶变换的 DSP 实现. 第 8 章 数字信号处理典型算法程序设计. 8.1 卷积运算的 DSP 实现. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计 本章将要讲解通信与信号处理中常见的下列几种具有代表性的算法在 C54x 芯片中的具体实现方法:• 卷积• 有限冲激响应 (FIR) 数字滤波器• 无限冲激响应 (IIR) 数字滤波器• 快速傅立叶变换 (FFT)

Page 2: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计 目录:

8.1 卷积运算的DSP实现

8.2 数字滤波器的DSP实现

8.3 IIR滤波器的DSP实现

8.4快速傅立叶变换的DSP实现

Page 3: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.1 卷积运算的 DSP 实现

数字卷积运算通常采用两种方法:

线性卷积

圆周卷积

Page 4: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.1.1 信号的卷积

函数 f(t) 与 h(t) 的卷积积分,用符号“﹡ ”表示,即:

( ) ( ) ( ) ( ) ( )y t f t h t f h t d

读作 f(t) 与 h(t) 的卷积积分,简称卷积。

Page 5: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.1.2 离散系统的卷积分析 1. 离散时间信号的时域分解

( )k i 根据单位序列 及单位移位序列 的选择性,( )k

可将任意序列 f(k) 用单位序列及其移位序列表示,即:

( ) ( 1) ( 1) (0) ( ) (1) ( 1) ( ) ( )i

f k f k f k f k f i k i

Page 6: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2. 离散系统的卷积计算过程1( )f k 2 ( )f k 1( )f k

2 ( )f k设两个离散时间信号为 和 ,定义 与的卷积和运算为:

1 2 1 2( ) ( ) ( ) ( )k

f k f k f i f k i

与卷积积分一样,离散卷积也可通过图解法来计算,分为反折、平移、相乘、取和等过程。

Page 7: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

3. 卷积的计算在实际应用中,参与卷积运算的两个序列长度往往差距较大,比如我们要实时的对一长序列语音信号进行“过滤”处理,可以采用有限冲激响应序列与该语音信号进行卷积的方法来实现。

比如:重叠保留法

Page 8: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.1.3. 重叠保留法卷积运算在 C54x 上的实现

1. 利用 C54x 自带的 dsplib 库函数实现

TI 公司提供了以 C54x 系列芯片为基础的DSPLIB 库函数,在 CCS 开发系统内包含DSPLIB 库函数。这些库函数均为经过优化处理的符合 C 语言标准的函数。

Page 9: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

DSPLIB 库提供了一个直接进行线性卷积运算的函数,形式如下:

oflag = short convol (DATA *x, DATA *h, DATA *r, ushort nr, ushort nh)

其中 x , h 为输入数组,即进行卷积的两序列,r 为输出数组。

Page 10: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

其算法为:

0

( ) ( ) ( )nh

k

r j h k x j k

0 <=j <=nr

通常我们将分段后的待滤波数据放于 X 数组中,而将滤波器冲激响应序列放于 h 数组。按前述方法, x

长度为 L+M-1 , h 长度为 M ,则 nr 应为 L+M-1 。计算得到结果后,舍弃 r 的前 M-1 个值。

Page 11: 第 8 章 数字信号处理典型算法程序设计

12

8,

4

L

P

8 N L

Circular Convolution as Linear Convolution with Aliasing

3 1 2x n x n x n

3 1 2px n x n N x n1P

Page 12: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

其算法为: 0

( ) ( ) ( )nh

k

r j h k x j k

, 0 <=j <=nrC 程序代码为:#define Frame 240 // 输入数据长度#define FilterLength 8 // 滤波器长度for ( i = 0 ; i < (Frame-7) ; i ++ ) {  for ( j = 0 ; j <  FilterLength ; j ++ )  Acc0 = L_mac( Acc0, Filter[j], Spnt[i+j] ) ;  Spnt[i] = round( Acc0) ; // 小数 16 位精度}  注: L_mac : Acc0=Filter*Spnt, 参见 TMS320C54x-Optimizing C-C++ Compiler User’s Guide-spru103g-October 2002.pdfFilter[j] 是滤波器的时间反转信号, Spnt[i]  是输入信号。参考 : 张霖峰 , 唐阳 . TMS320C54x 数字信号处理器的软件优化

Page 13: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2. 汇编语言设计C54x 指令集内提供了单周期乘累加指令 MAC 和循环寻址方式,使每个样值的乘累加计算可以在一个周期内完成。

卷积运算就是实现两组数对应项乘积的累加和。可采用 RPTZ 和 MAC 指令,结合循环寻址方式去方便地实现这一运算:

RPTZ 累加器, N-1MAC (双访问数据),(双访问数据),累加

Page 14: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

其中, RPTZ 指令将累加器清零初始化,并将立即数 N-1 ( 16 位)装入到重复计数器,使下一条指令重复执行 N 次。

MAC 指令实现将两存储区数据的乘积累加到累加器,再通过存储区指针以循环寻址的方式指向下一个存储区。

Page 15: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

程序设计的要点简要分析如下:

为了能高效的利用 DSP流水线,待卷积的两组数据都应存放在 DARAM 中

如果使用双操作数指令,辅助寄存器只能用AR2~AR5 ,在此我们选择 AR3 和 AR4 作为双操作数寻址辅助寄存器

汇编语言的代码设计要充分考虑到资源的优化等

Page 16: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

重叠保留法卷积数据存放

Page 17: 第 8 章 数字信号处理典型算法程序设计

重叠保留法卷积运算算法程序在此经常使用一种零长度循环缓冲区,循环体对应的汇编程序如下: (修改对应书中的红色部分)

.bss x,240 .bss y,233 .bss h,8BEGIN STM # 233,BRC STM # x,AR1 STM # x,AR3 STM # h,AR4 STM # y,AR5 STM # -7, AR0 ; loop starts

RPTB next-1

Page 18: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计 LD #0, A ;LD *AR4+, 13, A ; 原先的程序是 IIR 滤波 MAC *AR4 +, *AR3+, A MAC * AR4 +, *AR3+, A MAC *AR4 +, *AR3+, A MAC *AR4 +, *AR3+, A MAC *AR4 +, *AR3+, A MAC *AR4 +, *AR3+, A MAC *AR4 +, *AR3+, A MAC *AR4 +0%, *AR3-, A ; 双操作数只有 +0% SFTA A, 2 ; 在此不需要 RND A ; 小数 16 位精度四舍五入 MVMM +AR1, AR3 STH A, * AR5+ ; 小数运算取高位字

LD #0,A ; 上面第一行有了,这里不需要了 ; loop ends next: ; 参考 : 张霖峰 , 唐阳 . TMS320C54x 数字信号处理器的软件优化 G723_1Codec.c in G711-G723.1.rar, G.723.1-Dual rate speech coder

for multimedia communications transmitting at 5.3 and 6. 3 kbit/s

Page 19: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2 数字滤波器的 DSP 实现

本节主要介绍 FIR 和 IIR 滤波器 DSP 实现方法。首先简要介绍滤波器的基本原理、结构和设计方法,然后通过实例介绍滤波器设计在 C54x

上的实现方法。

用 DSP 芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好的特点。

Page 20: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2.1 FIR 滤波器的结构与设计

1.FIR 滤波器的结构一般时域离散系统或网络的描述方式:

差分方程

单位脉冲响应

系统函数进行描述。

Page 21: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

则其系统函数,即滤波器的传递函数为:

0

1

( )1

Mk

kkN

kk

k

b zH z

a z

如果系统输入、输出服从 N阶差分方程:

0 1

( ) ( ) ( )M N

k kk k

y n b x n k a y n k

Page 22: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

ka

相应的传递函数为:

0

( ) ( )M

k

k

H z b k z

若所有的 均为零,则有:

0

( ) ( )M

kk

y n b x n k

Page 23: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

据上两式可直接画 FIR 滤波器的直接型结构:

( )x n 1z 1z 1z 1z

(0)h (1)h (2)h ( 3)h N ( 2)h N ( 1)h N

( )y n

FIR 滤波器的直接型结构又称为卷积型结构,有时也称为横截型结构。

Page 24: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

FIR 滤波器主要具有如下几个特点:

可以在幅度特性随意设计的同时,保证精确、严格的线性相位

FIR 滤波器的单位脉冲响应是有限长序列,因此 FIR 滤波器系统总是稳定的

Page 25: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

由于 FIR 滤波器一般为非递归结构,在有限精度运算中,不会出现像递归机构的滤波器那样的极限震荡等不稳定现象,误差较小

FIR 滤波器可采用 FFT 算法实现,从而提高运算效率

Page 26: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2. FIR 滤波器的设计方法

0

( ) ( )M

kk

y n b x n k

kb

kb

中,系数 (k=1~M )形成的序列

( k=1~M )。 就是单位冲激响应序列,滤波器设计的目标就是找到合适的序列

方法 1 :傅立叶级数法

( )dH

是以 s 为周期的周期函数,所以可展开为傅立叶级数,即 :

(2 / )( ) sjkd k

k

H C e

Page 27: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

/ s 这里我们用 表示归一化频率,即 ,则有 :

2( ) j kd k

k

H C e

kC可由下式求得 :

1 2

1

1( )

2j n

k dC H e d

Page 28: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

通常 ( )dH

为偶函数,这时 :

1 2

0

1( ) 0

2j n

k dC H e d k

且 。 k kC C

因为 FIR 的系数为有限个,因此需将上式中的系数进行截取,到近似的传递函数为 :

2( )Q

j ka k

k Q

H C e

式中 Q 为有限的正整数。

Page 29: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2jz e 令 , 则有:

( )Q

ka k

k Q

H z C z

上式即为所求系统的 Z 域传递函数。近似传递函数的冲激响应是由系数决定。

Page 30: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

( )dh n

( )dh n( ) 0 1h n n N

方法 2 :窗函数法设计 FIR

窗函数法的思路是寻找一有限长序列 逼近理想的滤波器脉冲响应 。 是对 做截

取处理。

用一个有限长度的窗函数序列 来截取 ,即:( )w n

( )dh n

( ) ( ) ( )dh n w n h n

Page 31: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

利用 ,就可得到一近似的传递函数 : ( )h n

( ) ( ) ( )Q

j jna d

n Q

H e w n h n e

如令 ,则有 : jz e

( ) ( ) ( )Q

na d

n Q

H z w n h n z

Page 32: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

同样,为使式 8-17 具有因果性,需延迟 Q 个样值,可得 :

( ) ( ) ( ) ( )Q

Q n Qa d

n Q

H z z H z w n h n z

令 ,n Q k 上式成为:

2

0

( ) ( ) ( )Q

kd

k

H z w n h n z

Page 33: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

( ) ( ) ( )dh k w k Q h k Q 再令 , 2N Q ,得到:

0

( ) ( )N

k

k

H z h k z

设计 FIR 滤波器时,加窗是一个重要的计算步骤。采用矩形窗函数是简单并且直接的方法。而在实际设计中,一般采用其他窗函数,比较常用的窗函数有 Hanning 、 Hamming 、 Blackman 、 Kaiser窗等。

Page 34: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

FIR 滤波器分为低通滤波、高通滤波、带通滤波和带阻滤波。

下面给出各种滤波器具体的设计方法:

1 )低通滤波器的设计

sin[2 ( / )]

2c s

n

n f fC

n

Page 35: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2 )高通滤波器的设计 高通滤波器可以由一个幅度为 1 的响应减去一个低通滤波的响应来获得。

(n) 函数的表达式为:1 0

0 0n

n

n

高通滤波器的系数可由下式计算得到:

sin[2 ( / )]( )

2c s

n

n f fC n

n

Page 36: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

3) 带通滤波器的设计 带通滤波器可以由两个截止频率不同的低通滤波器获得,其系数等于两个低通滤波器的系数之差。

2 1sin[2 ( / )] sin[2 ( / )]

2 2c s c s

n

n f f n f fC -

n n

fc1 和 fc2 为低通滤波器的截止频率, fs 为采样频率。

Page 37: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

4) 带阻滤波器的设计

带阻滤波器可由 (n) 和带通滤波器相减获得,其系数可以由一个幅度为 1 的响应减去一个带通滤波的响应来获得。

Page 38: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

3.FIR 滤波器的设计工具在 MATLAB 中,提供了两种 FIR 滤波器设计方法:

一种是标准通带滤波器的设计 FIR1

一种是多带 FIR 滤波器的设计 FIR2

Page 39: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

函数 FIR1 :只能设计标准的低通、高通、带通和带

阻线性相位 FIR 滤波器。 函数 FIR2 :还可设计加窗的 FIR 滤波器,但它针

对任意形状的分段线性频率相应,这一点在FIR1

中是受到限制的。

Page 40: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

1) fir1 函数 具体调用格式为 :

(1)b = fir1(n,Wn);

(2) b = fir1(n,Wn,'ftype'); 

(3) b = fir1(n,Wn, Window);

(4)b=fir1(n , Wn ,‘ ftype’ , Window)

Page 41: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

n :滤波器的阶数;

Wn :滤波器的截止频率;

ftype :用来决定滤波器的类型:当 ftype=high 时,可设计高通滤波器;当 ftype=stop 时,可设计带阻滤波器。

Window :用来指定滤波器采用的窗函数类型,其默认值为汉明( Hamming )窗。

Page 42: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

①设计低通 FIR 滤波器 :

使用 b=fir1(n , Wn) 可得到低通滤波。 0 Wn

1, Wn=1 相当于 0.5fs 。 格式: b=fir1(n , Wn)

②设计高通 FIR 滤波器 :

在 b=fir1(n , Wn, 'high') 中, 0 Wn 1, 。 格式: b=fir1(n , Wn, 'high')

Page 43: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

③设计带通 FIR 滤波器 :

在 b=fir1(n , Wn) 中,当Wn=[ W1 W2 ]

时,可得到带通滤波器,其通带为 W1

<w<W2 , W1 和 W2 分别为通带的下限频率和上限频率。

格式: b=fir1(n , [ W1 W2 ]) ④设计带阻 FIR 滤波器 在 b=fir1(n , Wn ,‘ ftype’) 中,当 ftype=

stop , Wn=[ W1 W2 ] 时, fir1 函数可得到带阻滤波器。

格式: b=fir1(n , [ W1 W2 ] ,‘ stop’)

Page 44: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

在上述滤波器设计中, Window 参数可采用的窗口函数有:

BoxcarHanningBartlettBlackmanKasierchebwin 等

默认的窗函数为汉明( Hamming )窗。

Page 45: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2) fir2 函数它可用来设计有任意频率响应的各种加窗 FIR 滤波器。

具体调用格式为:

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

Page 46: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

n :滤波器的阶数;

f :频率点矢量,且 f[0 , 1] , f=1 对应于0.5fs 。矢量 f 按升序排列,并且第一个元素必须为 0 ,最后一个元素必须为 1 ,并可以包含重复的频率点;

m: 参数 m 为幅度点矢量,在矢量m 中包含了与 f 相对应的期望得到的滤波器幅度;

Page 47: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

Window :用来指定所使用的窗函数类型,其默认值为汉明( Hamming )窗;

Npt :用来指定 fir2 函数对频率响应进行内插的点数;

Lap :用来指定 fir2 函数在重复频率点附近插入的区域大小。

Page 48: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

4. FIR 滤波器在 C54x 上的实现

1) 利用 C54x 自带的 dsplib 库函数实现 DSPLIB 库提供了几个与 FIR 滤波直接有关的函数,分别是 :cfir

firfirdecfirinterpfirsfirs2firlat

DSPLIB 库函数见 TI网站压缩文件TMS320C54x DSP Library- sprc099

Page 49: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2) FIR 滤波运算的汇编语言程序设计

采用汇编的方法主要有:

线性缓冲区法

循环缓冲区法

{单值更新缓存法

区域更新缓存法

Page 50: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(1) 线性缓冲区法 单值更新缓存法:

具体实现步骤如下:(1) 在数据存储器中开辟一个 N单元的缓冲区 , 用来存放最新的 N个输入样本;

(2)从最老样本开始取数,每取一个数后,样本向下移位;

(3) 读完最后一个样本后 , 输入最新样本并存入缓冲区顶部。

MACD Smem, pmad, src

Page 51: 第 8 章 数字信号处理典型算法程序设计

线性缓冲区法实现 FIR 滤波 .title " fir1.asm " .mmregs .def startX .usect “x”,8 ; 定义数据存储空

间PA0 .set 0PA1 .set 1 .dataCOEF: .word 1*32768/10 ;h6=0.1 .word 2*32768/10 ;h5=0.2 .word -4*32768/10 ;h4=-0.4 .word 3*32768/10 ;h3=0.3 .word -4*32768/10 ;h2=-0.4 .word 2*32768/10 ;h1=0.2 .word 1*32768/10 ;h0=0.1

Page 52: 第 8 章 数字信号处理典型算法程序设计

.textstart:SSBx FRCT; 小数乘法编程时,设置 FRCT( 小数方式 ) 位 STM #x+7,AR2 STM #6,AR0 LD #x+1,DP ; PORTR PA1,@x+1

This instruction loads the upper9 bits of address x into DP (in ST0)

FIR1: ;FIR 滤波运算 RPTZ A,#6 ; 累加器 A 清零 , 设置迭代次

数 MACD *AR2-,COEF,A ; 完成乘法 - 累加并

移位 STH A, *AR2 ;暂存 y(n) PORTW *AR2+ ,PA0 ; 输出 y(n) BD FIR1 循环 PORTR PA1,*AR2+0 ; 输入最新样本,并修改 AR2=AR2+AR0, 并指向缓冲区底部 .END

Page 53: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(2) 用循环缓冲区实现 FIR 滤波器

FIR 滤波器循环缓冲区存储器图

Page 54: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(2) 用循环缓冲区实现 FIR 滤波器 循环缓冲区算法的过程如下:

1) 在数据存储器中开辟一个 N个单元的缓冲区 (滑窗 ) ,用来存放最新的 N个输入样本;

2)从最新样本开始取数;

3) 读完最老样本后,输入最新样本来代替最老样本,而其他数据位置不变;

4) 用 BK寄存器对缓冲区进行间接寻址,使缓冲区地址首尾相邻。

Page 55: 第 8 章 数字信号处理典型算法程序设计

循环缓冲区法实现 FIR 滤波器 .title " fir2.asm " .mmregs .def start .bss y,1Xn .usect “xn”,7 ; 定义数据存储空

间h0 .usect “h0”,7 ; 定义数据存储空

间PA0 .set 0PA1 .set 1 .dataTable: .word 1*32768/10 ;h0=0.1 .word 2*32768/10 ;h1=0.2 .word 3*32768/10 ;h2=0.3 .word 4*32768/10 ;h3=0.4 .word 5*32768/10 ;h4=0.5 .word 6*32768/10 ;h5=0.6 .word 7*32768/10 ;h6=0.7

Page 56: 第 8 章 数字信号处理典型算法程序设计

.textstart: SSBx FRCT; 小数乘法编程时,设置 FRCT( 小数方式 )

位 STM #h0,AR1 RPT #6 MVPD table,*AR1+ STM #xn+6,AR2 STM #h0+6,AR3 STM #7,BK STM #-1,AR0 LD #xn,DP PORTR PA1,@xnFIR2: ;FIR 滤波运算 RPTZ A,#6 MAC *AR2+0%,*AR3+0%,A STH A,@y PORTW @y,PA0 BD FIR2 PORTR PA1,*AR2+0% ; 用最新样本值替代最旧的样本值 .END

乘累加从底部数据开始,便于存储单元延迟

Page 57: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2.1 FIR 滤波器的结构与设计 1.FIR 滤波器的直接型结构

复习

( )x n 1z 1z 1z 1z

(0)h (1)h (2)h ( 3)h N ( 2)h N ( 1)h N

( )y n

0

( ) ( ), ( )M

k kk

y n b x n k b h k

Page 58: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(1) 线性缓冲区法 MACD Smem, pmad, src

(2) 用循环缓冲区法

单值更新缓存法:

复习

MAC *AR2+0%,*AR3+0%,A

Page 59: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(2) 用循环缓冲区实现 FIR 滤波器 使用循环缓冲区进行滤波时程序中应注意的几个问题:① 实现 N 个循环缓冲区单元首尾相邻,须用 BK 寄

存器按模间接寻址来实现;② 缓冲区起始地址的 k 个最低有效位必须为 0 ,且

必须满足 2k > N 。③ 采用 Ti 公司的 C54x 系列进行滤波仿真,要将滤

波器系数和输入数据转化成 Q15 格式。

Page 60: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(3) 区域更新缓存法 区域更新缓存法就是每次批量输入一批( m+N-1个)新样值,然后对这一批数进行滤波处理后批量存储( m 个)结果,然后更新缓存。 采用前面卷积程序。

适合于采样与传输数据很快,而处理时间相对较慢的场合。

1

0

( ) ( )N

kk

y n b x n k

Page 61: 第 8 章 数字信号处理典型算法程序设计

系数对称 FIR 滤波器实现优点 : 乘法的次数减少了一半。

x[n-(M-1)/2]

x[n-(M+1)/2]

x[n-1] x[n-2]

x[n-M] x[n-M+1] x[n-M+2]

x[n]

Type II FIR filter

( -1)/2

0 0

- - -MM

k k

y n h k x n k h k x n k x n M k

, n 0,1,...,M h M n h n

Page 62: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(4) 系数对称FIR滤波器的实现 对称 FIR 滤波器的实现方法如图所示:

b(0)

b(1)

b(2)

b(3)

x(n-4)

x(n-5)

x(n-6)

x(n-7) AR4

x(n)

x(n-3)

x(n-2)

x(n-1)

AR3

新数据区 旧数据区 系数

对称 FIR 滤波器的实存储方式

更正

两区存储单元访问顺序递减: AR3-1AR3 , AR4-1AR4

Page 63: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

具体过程如下: (1) 在 RAM 中开辟两个 N/2 长度的循环缓冲区

New 和 Old ,分别存放 N/2 个新数据和老数据;

(2) 设置循环缓冲区指针: AR3 指向 New 区中的最新数据, AR4 指向 Old 区中的最老数据;

(3) 在程序存储器中设置系数表; (4) 进行 (AR3)+(AR4)AH 加法运算,并修改数

据指针, AR3-1AR3 , AR4-1AR4; 实现指令: STM #-1 , AR0 FIRS *AR3+0% , *AR4+ 0% , COEF

Page 64: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(5) 保存和输出结果 ;

(6)修正数据指针, AR3 指向 New 区的最老数据;

AR4 指向 Old 区的最老数据。

(7) 用 New 区的最老数据替代 Old 区的最老数据,输入新数据替代 New 区的最老数据 ;

(8) 重复执行 (4)~ (7) 。

Page 65: 第 8 章 数字信号处理典型算法程序设计

优点 : 乘法的次数减少了一半。

实现方法 : 使用专门用于系数对称 FIR 滤波器的指令。 FIRS Xmem , Ymem , Pmad

该指令的操作如下:执行: Pmad→PAR

当 (RC)≠0 (循环计数器) ((Xmem)+ (Ymem)) 16→A≪

(B)+ (A(32- 16))×PAR→B

(PAR+ 1)→PAR

(RC)- 1→RC

Page 66: 第 8 章 数字信号处理典型算法程序设计

说明: FIRS 指令在同一机器周期内,通过 C 和 D总线读两次数据存储器,同时通过 P总线读程序存储区的一个系数。注意两点:(1) 在数据存储器中开辟两个循环缓冲区,如 New 和 Old缓冲区,分别存放 N/2 个新数据和老数据,循环缓冲区的长度为N/2 。设置了循环缓冲区,就需要设置相应的循环缓冲区指针,如用 AR2 指向 New缓冲区中最新的数据, AR3 指向 Old

缓冲区中最老的数据;(2) 将系数表存放在程序缓冲区内。

Page 67: 第 8 章 数字信号处理典型算法程序设计

.mmregs

.def begin

.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, 2*32768/10

.word 3*32768/10, 4*32768/10

.text

x(n-4)

x(n-5)

x(n-6)

x(n-7) AR4

x(n)

x(n-3)

x(n-2)

x(n-1)

AR3

x_new x_old

Page 68: 第 8 章 数字信号处理典型算法程序设计

begin: LD #y , DP

SSBX FRCT

STM #x_new , AR3 ; AR3 指向新缓冲区第一个单元STM #x_old+(size-1),AR4 ; AR4 指向老缓冲区最后 1 个

单元STM #size, BK ;循环缓冲区长度STM #-1 , AR0

LD #x_new , DP

PORTR PA1,# x_new ;输入 x[n]

FIR : ADD * AR3+ 0%,* AR4+ 0%,A ;AH=x[n]+x[n-7]( 第一次 )

RPTZ B, # (size-1) ; B=0, 条指令执行 size ( 4 )次FIRS *AR3+0% , *AR4+ 0% , COEF

; B+=AH*h0, AH=x[n-1]+x[n-6],…

STH B , @y ;保存结果

x(n-4)

x(n-5)

x(n-6)

x(n-7) AR4

x(n)

x(n-3)

x(n-2)

x(n-1)

AR3

x_new x_old

12

3

45

Page 69: 第 8 章 数字信号处理典型算法程序设计

PORTW @y , PA0 ;输出结果MAR * +AR3(2)% ;修正 AR2 ,指向新缓冲区最老数

MAR * AR4+% ;修正 AR3 ,指向老缓冲区最老数

MVDD* AR3 , * AR4+0% ;新缓冲区向老缓冲区传送一个

BD FIR

PORTR PA1 , * AR3 ;输入新数据至新缓冲区

.end

x(n-4)

x(n-5)

x(n-6)

x(n-7)

AR4

x(n)

x(n-3)

x(n-2)

x(n-1)AR3

新 旧

12

3

45

x(n-3)

x(n+1)

Page 70: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2.2 FIR 滤波器在 C54x 上的实现举例 目标:设计一个 15阶 FIR低通滤波器,截止频率 0.6解题思路步骤:① 用 MATLAB 编程得出滤波器系数;② 用 CCS 编程实现 FIR 滤波;③ 用 MATLAB 产生验证数据文件,用 CCS 观察输入

输出波形。① 用 MATLAB 编程得出滤波器系数;f = [0 0.6 0.6 1]; % 书中 f = [0 0.1 0.2 1] 截止频率约0.15 m = [1 1 0 0]; b=fir2(15,f,m)freqz(b,512,1000)

Page 71: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2.2 FIR 滤波器在 C54x 上的 simulator 实现举例

目标:设计一个 15阶 FIR低通滤波器,截止频率 0.6

解题思路步骤:① 借助MATLAB求出滤波器系数;② 用 CCS 编程实现 FIR 滤波;③ 用 MATLAB产生验证数据文件,用 CCS观察输入

输出波形。

Page 72: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2.2 FIR 滤波器在 C54x 上的实现举例 目标:设计一个 15阶 FIR低通滤波器,截止频率 0.6① 用 MATLAB 编程得出滤波器系数;f = [0 0.6 0.6 1]; % 书中 f = [0 0.1 0.2 1] 截止频率约

0.15

m = [1 1 0 0];

b=fir2(15,f,m)

freqz(b,1,1000)或者用 Matlab 中的 Filter Design and Analysis Tool (FDATool) 设计滤波器

b = 0.0033 -0.0018 -0.0106 0.0226 0.0162

-0.0977 0.0601 0.5096 0.5096 0.0601

-0.0977 0.0162 0.0226 -0.0106 -0.0018

0.0033

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-1500

-1000

-500

0

Normalized Frequency ( rad/sample)

Pha

se (

degr

ees)

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-100

-50

0

Normalized Frequency ( rad/sample)

Mag

nitu

de (

dB)

Page 73: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.2.2 FIR 滤波器在 C54x 上的实现举例 目标:设计一个 15阶 FIR低通滤波器,截止频率 0.6① 用 MATLAB 编程得出滤波器系数;f = [0 0.1 0.2 1]; % 书中 f = [0 0.1 0.2 1] 截止频率约

0.15

m = [1 1 0 0];

b=fir2(15,f,m)

freqz(b,512,1000)或者用 Matlab 中的 Filter Design and Analysis Tool (FDATool) 设计滤波器

b = -0.0009 0.0005 0.0065 0.0224 0.0509

0.0879 0.1235 0.1455 0.1455 0.1235

0.0879 0.0509 0.0224 0.0065 0.0005

-0.0009

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-800

-600

-400

-200

0

Normalized Frequency ( rad/sample)

Pha

se (

degr

ees)

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-250

-200

-150

-100

-50

Normalized Frequency ( rad/sample)

Mag

nitu

de (

dB)

Page 74: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

目标:设计一个 15阶 FIR低通滤波器,截止频率 0.6

② 用 CCS 编程实现 FIR 滤波;a) 打开 CCS ,新建立一工程文件 fir.pjt 。b) 建立汇编源文件 fir.asm, 中断向量表

vectors.asm 和链接命令文件 fir.cmd ,并添加到 fir.pjt 中。

c) 在 project菜单下选择 rebuild all 选项。d) 在 file 菜单下,选择 load program 选项,将生

成的 fir.out 文件装载到 DSP 中。

Page 75: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计b) 建立汇编源文件 fir.asm, .mmregsCIR_BFFR_LENGTH .set 16 ; 滤波器系数个数 , 循环缓冲区长度 K_FIR_INDEX .set 1 ; 循环缓冲区步长 K_FRAME_SIZE .set 256 ; 循环缓冲区步FIR_COFF_START .sect "fir_coff" ; 16 个 FIR 滤波器系数 .word -9*32768/10000 .word 5*32768/10000 .word 65*32768/10000 .word 224*32768/10000 .word 509*32768/10000 .word 879*32768/10000 .word 1235*32768/10000 .word 1455*32768/10000 .word 1455*32768/10000 .word 1235*32768/10000 .word 879*32768/10000 .word 509*32768/10000 .word 224*32768/10000 .word 65*32768/10000 .word 5*32768/10000 .word -9*32768/10000FIR_COFF_END

Page 76: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

用循环缓冲区实现 FIR 滤波器

FIR 滤波器输入数据循环缓冲区存储器图数据存储器系数缓冲区

AR5

x(n)

x(n-1)

x(n-14)

x(n-15)

x(n)

x(n-1)

x(n-14)

x(n+1)

x(n)

x(n-1)

x(n+2)

x(n+1)

x(n-13)

input输入数据缓冲区( 256

个)

AR6 output输出数据缓冲区( 256

个)

AR7

AR4

Page 77: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计b) 建立汇编源文件 fir.asm (续)coff_data .usect “fir_bfr”,20 ; 数据存储器系数缓冲区d_data_buffer .usect “fir_bfr” ,40 ; 滤波运算循环缓冲区域input .usect "fir_bfr",256 ; 输入数据缓冲区output .usect "fir_bfr",256 ; 输出数据缓冲区 .def fir_init ; 初始化 FIR 滤波器 .def fir_task ; 执行 FIR 滤波;------------------------------------------------------; 下面的程序段的功能是为循环缓冲区数据和系数初始化;------------------------------------------------------ .sect ".fir_prog"fir_init: STM #input,AR6 ; 输入数据缓冲区首址装入 AR6 STM #output,AR7 ; 输出数据缓冲区首址装入 AR7 STM #coff_data,AR5 ; 系数存储器区首址装入 AR5 RPT #CIR_BFFR_LENGTH-1 MVPD #FIR_COFF_START,*AR5+ ; 将 FIR 系数从程序区移到数据区

STM #K_FIR_INDEX,AR0 STM #d_data_buffer,AR4 ; 循环缓冲区首地址装入AR4

RPTZ A, 40 STL A,*AR4+ ; 复位缓冲区 STM #(d_data_buffer+CIR_BFFR_LENGTH-1),AR4 STM #coff_data,AR5;-----------------------------------------------------; 下面的子程序的功能为使用 MAC 指令执行 FIR 滤波; 累加器 A( 滤波器输出 )=h(i)*x(n-i),i=0,1,2,3.....15 。因为;------------------------------------------------------ fir_task: NOP

NOP NOP

STM #K_FRAME_SIZE-1,BRC ; 重复 256 次,滤波256 个输入数据 RPTBD fir_filter_loop-1 STM #CIR_BFFR_LENGTH,BK ; 设置 FIR 循环缓冲区大小 LD *AR6+,A ; 加载输入数据fir_filter: STL A,*AR4-0% ;*AR4-0% 是否更正确? RPTZ A,(CIR_BFFR_LENGTH-1) MAC *AR4+0%, *AR5+0%, A ; STH A,*AR7+ ;fir_filter_loop NOP

NOP NOP

.end

Page 78: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计b) 建立汇编源文件 fir.asm (续)

RPT #CIR_BFFR_LENGTH-1 ; 将 FIR 系数从程序区 MVPD #FIR_COFF_START, *AR5+ ; 移到数据区 STM #K_FIR_INDEX, AR0 ; 循环缓冲区步长 STM #d_data_buffer,AR4 ; 循环缓冲区首地址装入 AR4

RPTZ A, 40 STL A,*AR4+ ; 复位缓冲区 STM #(d_data_buffer+CIR_BFFR_LENGTH-1), AR4 STM #coff_data, AR5;-----------------------------------------------------; 下面的子程序的功能为使用 MAC 指令执行 FIR 滤波; 累加器 A( 滤波器输出 )=h(i)*x(n-i),i=0,1,2,3.....15 。;------------------------------------------------------ fir_task: STM #K_FRAME_SIZE-1,BRC ; 重复 256 次,滤波 256 个输入数据 RPTBD fir_filter_loop-1 STM #CIR_BFFR_LENGTH,BK ; 设置 FIR 循环缓冲区大小 LD *AR6+,A ; 加载输入数据fir_filter: STL A,*AR4+% ;*AR4-0% 更好理解一些 RPTZ A,(CIR_BFFR_LENGTH-1) MAC *AR4+0%, *AR5+0%, A ; STH A,*AR7+ ;fir_filter_loop .end

Page 79: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计b) 建立汇编源文件 fir.asm (续); 下面的子程序的功能为使用 MAC 指令执行 FIR 滤波; 累加器 A( 滤波器输出 )=h(i)*x(n-i),i=0,1,2,3.....15 。;------------------------------------------------------ fir_task: STM #K_FRAME_SIZE-1,BRC ; 重复 256 次, RPTBD fir_filter_loop-1 STM #CIR_BFFR_LENGTH,BK ; 设置 FIR 循环缓冲区大小 LD *AR6+,A ; 加载输入数据fir_filter: STL A,*AR4+% ;*AR4-0% 更好理解一些 RPTZ A,(CIR_BFFR_LENGTH-1) MAC *AR4+0%, *AR5+0%, A ; 滤波器输出 =h(i)*x(n-i), STH A,*AR7+ ; 保存结果到输出数据缓冲区fir_filter_loop .end

Page 80: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

b) 建立中断向量表文件 vectors.asm (续)

.title "vectors.asm"

.ref fir_init

.sect "vectors"

RESET:

BD fir_init ; 复位时跳入 fir 滤波程序开始 fir_init

NOP

NOP

.space 124*16 ;没有使用其它中断 , 保留空间 .end

Page 81: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计b) 建立链接命令文件 fir.cmd (续)

MEMORY {PAGE 0: EPROG: org=0x1400, len=0x7C00 VECT: org=0xFF80, len=0x80PAGE 1: USERREGS: org=0x0060, len=0x1C /*没有用 */ IDATA: org=0x0080, len=0x50 IDATA1: org=0x0180, len=0x1280 EDATA: org=0x1400, len=0x8000 } SECTIONS{ .text :> EPROG PAGE 0 .fir_prog :> EPROG PAGE 0

vectors :> VECT PAGE 0 fir_coff :> EPROG PAGE 0 fir_bfr :> IDATA1 PAGE 1 fir_vars :> IDATA1 PAGE 1

STACK :> EDATA PAGE 1}

Page 82: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

目标:设计一个 15阶 FIR低通滤波器,截止频率 0.6

② 用 CCS 编程实现 FIR 滤波;a) 打开 CCS ,新建立一工程文件 fir.pjt 。b) 建立汇编源文件 fir.asm, 中断向量表

vectors.asm 和链接命令文件 fir.cmd ,并添加到 fir.pjt 中。

c) 在 project菜单下选择 rebuild all 选项。d) 在 file 菜单下,选择 load program 选项,将生

成的 fir.out 文件装载到 DSP 中。

Page 83: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

③ 用 MATLAB产生验证数据文件,用 CCS观察输入输出波形。

1 )产生验证数据文件clear allx(1:20)=0x(2:2:1000,:)=400x=x'x=x(:)fid1=fopen('rec.dat','wt')fprintf(fid1,'1651 1 0 0 0\n');% 输出文件头 a1=fprintf(fid1,'%d\n',x)fclose(fid1)

CCS支持的 .dat文件的格式文件头为:定数  数据格式  起始地址 页类型 数据块大小1651            1           3000         0             C8固定标识 :又称 MagicNumber ,是固定数 1651

数据格式: 1-十六进制 2-十进制 3-十进制长整型 4- 十进制浮点型起始地址:为装载数据在存储器的基地址 0x3000

页类型: 0- 程序存储器 1-  数据存储器长度: 装入数据的长度 0xC8(十进制数 200)

Page 84: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

③ 用 MATLAB产生验证数据文件,用 CCS观察输入输出波形。

2) 选择 File->Data->Load…打开之前 Matlab 生成的文件 rec.dat

3) 将 Address 设为input , Length 为C8 ( 200d ), Page为 data

4) 运行程序 , 点击Run 按钮。

Page 85: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计5 )可以在 view菜单下选择 graph/time

frequence ,设置好相应的参数,来观测输入和输出数据的波形。

Page 86: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计5) 可以在 view菜单下选择 graph/time frequence ,

设置好相应的参数,来观测输入和输出数据的波形。

Page 87: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计5) 可以在 view菜单下选择 graph/time frequence ,

设置好相应的参数,来观测输入和输出数据的波形。

Page 88: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计5) 可以在 view菜单下选择 graph/time frequence ,

设置好相应的参数,来观测输入和输出数据的波形。

Page 89: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.3 IIR 滤波器的 DSP 实现 IIR 滤波器的结构简单,运算量小,具有经济、灵活、高效等特点 。8.3.1 IIR 滤波器的基本原理和设计方法

1. IIR 滤波器的特点

IIR 滤波器差分方程的一般形式为:

0 1

( ) ( ) ( )M N

k kk k

y n b x n k a y n k

Page 90: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

IIR 滤波器具有无限长的单位脉冲响应,在结构上存在反馈回路,即是递归型的。

当M=N 时,在零初始条件下,对上式进行 z 变换,得到传递函数:

-10 1

-111

... -( )

... -

N N NN k

N NkN k

b z b z b z zH z C

z a z a z p

0 1

( ) ( ) ( )M N

k kk k

y n b x n k a y n k

Page 91: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

对于 IIR 滤波器,系统稳定的条件如下: 若 ,当 时, ,系统稳定;若 ,当 时, ,系统不稳定;

| | 1kp n n

( ) 0h n

( ) 0h n | | 1kp

IIR 滤波器结构具有多种形式: (1) 直接 I 型 ( 也称直接型 )(2) 直接 II 型 ( 也称标准型 )(3)级联型 (多个二阶基本节的级联 )(4) 并联型(5)格型 (lattice)

Page 92: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2. IIR 数字滤波器的结构与设计1)二阶 IIR 数字滤波器

0 1 2 1 2( ) ( ) ( -1) ( - 2) - ( -1) - ( - 2) y n b x n b x n b x n a y n a y n

二阶 IIR 数字滤波器是构成复杂 IIR 数字滤波器的基本单元,因此又称为二阶基本节。

一个二阶 IIR 滤波器,其输出可写:

Page 93: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

直接型二阶 IIR 滤波器的结构图:

22

11

22

110

1)(

zazazbzbb

zH

Page 94: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

直接 I 型的二阶 IIR 数字滤波器:

22

11

22

110

1)(

zaza

zbzbbzH

Page 95: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

直接 II 型(标准型)二阶 IIR 数字滤波器:

x(n) y(n)w(n)

- a1

- a2

b1

b2

1z

1z

b0

22

11

22

110

1)(

zaza

zbzbbzH

Page 96: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2)高阶 IIR 滤波器一个高阶 IIR 滤波器可由多个二阶基本节级联组成。

其传递函数为 :

1 2( ) ( ) ( )... ( )kH z CH z H z H z

式中 Hi(z) 为一阶或二节阶的传递函数。

Page 97: 第 8 章 数字信号处理典型算法程序设计

99

Direct Form II

N

k

kk

M

k

kk

za

zbzH

1

1

1)(

x[n] y[n]w[n] b0

b1

b2

bN-1

bN

a1

a2

aN-1

aN

z1

z1

z1

1 0

[ ] [ ] [ ]N M

k kk k

y n a y n k b x n k

Page 98: 第 8 章 数字信号处理典型算法程序设计

100

串联形式 (Cascade Form)

N

k

kk

M

k

kk

za

zbzH

1

1

1)(

21

21

1

1*11

1

1

1*11

1

)1)(1()1(

)1)(1()1()( N

kkk

N

kk

M

kkk

M

kk

zdzdzc

zhzhzgzH

1 0

[ ] [ ] [ ]N M

k kk k

y n a y n k b x n k

Page 99: 第 8 章 数字信号处理典型算法程序设计

101

Cascade Form

21

21

1

1*11

1

1

1*11

1

)1)(1()1(

)1)(1()1()( N

kkk

N

kk

M

kkk

M

kk

zdzdzc

zhzhzgzH

sN

k kk

kkk

zaza

zbzbbzH

12

21

1

22

110

1)(

2nd OrderSystem

2nd OrderSystem

2nd OrderSystem

2nd OrderSystem

2nd OrderSystem

2nd OrderSystem

Page 100: 第 8 章 数字信号处理典型算法程序设计

102

Cascade Form

sN

k kk

kkk

zaza

zbzbbzH

12

21

1

22

110

1)(

x[n] y[n]z1

z1

a11

a21

b11

b21

b01

z1

z1

a12

a22

b12

b22

b02

z1

z1

a13

a23

b13

b23

b03

1 2 3

Assume Ns=3

Page 101: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

3. IIR 数字滤波器的设计方法常用到的模拟滤波器的原型主要有以下几种:

1 )巴特沃思滤波器,其幅度响应在通带内具有最平特性;

2 )切比雪夫滤波器,在通带内具有等波纹特性 ,且阶数小于巴特沃思滤波器;

3 )椭圆滤波器,在通带和阻带内具有等波纹特性,且阶数最小。

Page 102: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

设计步骤如下:

( )H s

( )H s ( )H z

1 )根据模拟设计理论设计出满足要求的传递函数变换成数字滤波器的传递函数

2 )将

常用的变换方法有 :

脉冲响应不变法

双线性变换法

Page 103: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

实际应用中,需要设计各种类型的数字滤波器,—般有下列两种方法:

(1)把一个归一化模拟滤波器经频带变换化为所需类型的模拟滤波器,再通过双线性变换法数字化为所需类型的数字滤波器。

(2) 将模拟低通原型用双线性变换法数字化为数字低通滤波器,再变换成各种类型的数字滤波器。

Page 104: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

第一种方法设计各型数字滤波器的一般步骤: (1) 根据数字频率指标计算预畸变的模拟频率指标, 计算方法为: 2

tan( / 2)T

(2) 根据通带或阻带允许的波动,确定滤波器类型。根据阻带的衰耗要求,确定滤波器的阶数,进而求得归一化模拟低通滤波器的传递函数 Ha(s),然后用 s/ Ωc 代替滤波器 Ha(s) 中的 s 即可得到实际的模拟滤波器传递函数 H(s) 。

Page 105: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

(3) 根据双线性变换法把模拟滤波器 H(s) 变换为数字滤波器 H(z) 。 H(s) 与 H(z)之间的对应关系为:

( ) | ( ) | j Ts j z eH s H z

以上第 (2)步第 (3)步可以合并进行,即可参照下表给出的变换公式进行代换。

Page 106: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

模拟低通原型到各种数字滤波器的变换方法:

变换类型 变换方法 说明

模拟低通原型→数字低通 表示低通预畸截频

模拟低通原型→数字高通 表示高通预畸截频

21 1

1c T

zs

z

tan(2

/ )2c cT

( )

12

1c zsz

T

tan(2

/ )2c cT

Page 107: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

例 8-1 设计一个低通滤波器。要求:带宽 BW=1rad/s ,采样频率 fs=100Hz 。 解:根据给定的指标,令 c = BW=1rad/s ,

选择一个满足带宽条件的低通模拟T=1/ fs=0.01s 。滤波器,传递函数为:

1( )

s+1aH s

对进行预畸变,求 Ωc 。

2 tan( ) tan(1/ 2)

0

2/ 2 109

.01cc T

Page 108: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

用 s/ Ωc 代换原型滤波器 ( )aH s中的 s ,得 :

根据双线性 z 变换式:

1( )

+1

109

s/109 s+109H s

1 1

1 1

2200

z zs

z zT

代入上式得数字滤波器的传递函数 :

2001

1

109z+109

309z-91( ) ( ) z

sz

H z H s

Page 109: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.3.2 IIR 滤波器的 C54x 实现 1.巴特沃思型滤波器的设计1)butter 函数

函数形式为: [b,a] = butter ( n,Wn ) [b,a] =

butter ( n,Wn,‘ftype’ ) •当设计截止频率为 Wn 的 n阶低通滤波器,其中截止频率应满足 0≤Wn≤1 , Wn=1 相当于 0.5fs 。

Page 110: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

•当 ftype = high 时,可设计截止频率为 Wn 的高通滤波器;

•当 ftype = stop 时,可设计带阻滤波器,此时Wn = [ W1 W2] ,阻带为 W1< W<W2 。

•当Wn=[ W1 W2] 时, butter 函数产生一个 2n阶的数字带通滤波器,其通带为 W1 < w <W2 。

Page 111: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2)buttord 函数 函数形式为: [n , Wn] = buttord ( Wp,Ws,Rp,Rs )•当Wp > Ws 时,为高通滤波器;

•当Wp, Ws 为二元矢量时,若Wp < Ws ,则为带通或带阻滤波器,此时 Wn 也为二元矢量。

利用 buttord 函数可得到滤波器的最小阶数 n ,并使通带 (0,Wp) 内的纹波系数小于 Rp ,阻带 (Ws, 1) 内衰减系数大于 Rs 。

Page 112: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2.切比雪夫滤波器的设计分为两种类型:

ChebyshevⅠ 型:通带等波纹性能 ChebyshevⅡ 型:阻带等波纹性能

1)cheby1 函数函数形式为: [ b,a ] = cheby1 ( n,Rp,Wn ) [ b,a ] = cheby1 ( n,

Rp,Wn,‘ftype’ ) 可以设计低通、带通、高通和带阻 ChebyshevⅠ 型数字滤波器,其通带内为等波纹,阻带内为单调。

Page 113: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

2)cheb1ord 函数

函数形式为: [n , Wn] = cheb1ord ( Wp, Ws, Rp, Rs )

此函数用来选择 ChebyshevⅠ 型滤波器的阶数。

Wp 和 Ws 分别为通带和阻带滤波器的截止频率,其值为 0≤Wp(或Ws)≤1 。

Rp 和 Rs 分别是通带和阻带区的纹波系数。

Page 114: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

3) cheby2 函数函数形式为: [ b,a ] = cheby2 ( n,Rs,Wn ) [ b,a ] = cheby2 ( n,Rs,Wn,‘ftype’ ) cheby2 函数与 cheby1 函数基本相同,但是其通带内为单调的,阻带内为等波纹,由 Rs 指定阻带内波纹。 cheby2 函数可以设计 ChebyshevⅡ 型低通、带通、高通和带阻数字滤波器。

4) cheb2ord 函数函数形式为: [ n , Wn ] = cheb2ord ( Wp, Ws, Rp, Rs ) 可以利用该函数确定 ChebyshevⅡ 型数字滤波器的最小阶数 n 和截止频率Wn 。

Page 115: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

3.椭圆滤波器的设计 1)ellip 函数函数形式为: [ b , a ] = ellip ( n, Rp, Rs,

Wn ) [ b , a ] = ellip ( n, Rp, Rs,

Wn,‘ftype’ ) 此函数用来设计 Elliptic (椭圆)型滤波器。可设计 n阶低通或带通滤波器。也可设计 n阶高通或带阻滤波器。

2) ellipord 函数函数形式为: [ n , Wn ] = ellipord ( Wp, Ws, Rp, Rs ) 此函数用来选择椭圆滤波器的阶数。

Page 116: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

II 型(标准型)二阶基本节 IIR 数字滤波器: x(n) y(n)w(n)

a1

a2

b1

b2

1z

1z

b0

w(n-1)

w(n-2)

二阶 IIR 滤波器的实现方法

w(n)=x(n)+a1w(n-1) )+a2w(n-2)

y(n)=b0w(n)+b1w(n-1) )+b2w(n-2)

反馈通道差分方程 :前向通道差分方程 :

x(0)

x(1)

x(2)

:

x(n)

y(0)

y(1)

y(2)

:

y(n)

存储器

)()(

1)(

22

11

22

110

zxzy

zazazbzbb

zH

Page 117: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

IIR二阶基本节 DSP 实现的数据存储方式:

w(n+1)=x(n+1)+a1w(n) )+a2w(n-1)y(n+1)=b0w(n+1)+b1w(n) )+b2w(n-1)

反馈通道 :前向通道 :

数据存储器(DARAM)起始状态 第 n+1 时刻

数据存储器(DARAM)

COEF a1

a2

AR3→ w(n-1) AR3→ w(n-1) b0

w(n-2) w(n+1) b1

w(n) w(n) AR4→ b2

w(n)=x(n)+a1w(n-1) )+a2w(n-2)反馈通道 :

y(n)=b0w(n)+b1w(n-1) )+b2w(n-2)前向通道 :

第 n+1 时刻

循环缓冲存储WDATA

Page 118: 第 8 章 数字信号处理典型算法程序设计

二阶 IIR 滤波器的 C54x 实现程序 .dataK_SIZE .set 256 ; 执行 256 次滤波;二阶 IIR 滤波器系数 , 截止频率 2000Hz, 采样频率 20000Hziir_table .word 3695*32768/10000 ;a1=-

0.3695 .word -1958*32768/10000 ;a2=0.1958 .word 2066*32768/10000

;b0=0.2066 .word 4132*32768/10000;b1=0.4134

.word 2066*32768/10000;b2=0.2066

WDATA .usect "COEF",8 ; 中间结果 w(n) 循环缓冲区COEF .usect “COEF”,8 ; a1,a2,b0,b1,b2 系数 input .usect "COEF", 256 ; 输入缓冲区output .usect "COEF", 256 ; 输出缓冲区 .def Start

Page 119: 第 8 章 数字信号处理典型算法程序设计

二阶 IIR 滤波器的 C54x 实现程序 .textStart: SSBX FRCT STM #input, AR6 ; 输入缓冲区首址存 AR6 STM #output, AR7 ; 输出缓冲区首址存 AR7 STM #WDATA+3, AR2 ; 存 w(n) 循环缓冲区地

址 STM #COEF, AR1 ; 存 IIR 系数缓冲区首址 MVMM AR1,AR3 ; IIR 系数缓冲区首址存 AR3 RPT #4 MVPD #iir_table, *AR3+ ;IIR 系数转存 data 区 MVMM AR1, AR3 STM #3, BK ; w(n) 循环缓冲区长度 3 STM #1, AR0 ; w(n) 循环缓冲区访问步长 STM #K_SIZE-1, BRC ; 执行 256 次滤波 RPTB MAINLOOP-1

Page 120: 第 8 章 数字信号处理典型算法程序设计

二阶 IIR 滤波器的 C54x 实现程序 RPTB MAINLOOP-1 LD *AR6+, 13, A ; 输入值调整 , 适当放大,否则输入太小,可能没有输出

Feedback: MAC *AR2+0%, *AR3+, A ; A= 输入+ a1w(n-1) MAC *AR2+0%, *AR3+, A ;A= 输入+ a1w(n-1)+ a2w(n-

2) STH A, *AR2 ; 存 w(n)= 输入+ a1w(n-1)+ a2w(n-

2)Forward: MPY *AR2+0%, *AR3+, A ; A=b0w(n) MAC *AR2+0%, *AR3+, A ; A=b0w(n)+b1w(n-1) MAC *AR2+0%, *AR3+, A ; A=b0w(n+b1w(n-1+b2w(n-2) STH A, *AR7+ ; 存 y(n)=A=b0w(n+b1w(n-1+b2w(n-

2) MVMM AR1,AR3MAINLOOP: B MAINLOOP .end

Page 121: 第 8 章 数字信号处理典型算法程序设计

滤波器编程中需要注意的问题 ( 1 )高阶的 IIR 滤波器一般分解成若干个二阶基本节

相级联来实现。( 2 )当系数大于等于 1 时的定标方法,一般采用将系

数分解的方法,使各系数均为标准 Q15 小数。 例如 A1 是大于 1 并且小于 2 的数,可采用:

w(n)*A1 =w(n)*A1/2 + w(n)*A1/2 的方法来实现 。.word 5715*32768/10000 ; A1=-1.1430 ;A1/2=-1.1430/2=-0.5715

Page 122: 第 8 章 数字信号处理典型算法程序设计

四阶 IIR 滤波器的 C54x 实现程序 .dataK_SIZE .set 200; 执行 200 次滤波四阶 IIR 滤波器系数 , 截止频率 2000Hz, 采样频率 20000Hz; 第一个二阶节系数iir_table .word -4663*32768/10000 ;A2=0.4663 .word 4531*32768/10000 ;A1=-0.4531 .word 2533*32768/10000 ;B2=0.2533 .word 5066*32768/10000 ;B1=0.5066 .word 2533*32768/10000 ;B0=0.2533 ; 第二个二阶节系数 .word -646*32768/10000 ;A2=0.0646 .word 3290*32768/10000 ;A1=-0.3290 .word 1939*32768/10000 ;B2=0.1839 .word 3678*32768/10000 ;B1=0.3678 .word 1839*32768/10000 ;B0=0.1839

Page 123: 第 8 章 数字信号处理典型算法程序设计

四阶 IIR 滤波器的 C54x 实现程序

WDATA1 .usect “COEF”,7 ; 第 一 个二阶节中 间 结 果w(n) 循环缓冲区;两个二阶节不能共用

WDATA2 .usect "COEF",7 ; 第 一 个二阶节中 间 结 果w(n) 循环缓冲区

COEF1 .usect “COEF”,5 ; 第一个二阶节的系数 ;a1,a2,b0,b1,b2 系数 COEF2 .usect “COEF”,5 ; 第二个二阶节的系数 ;a1,a2,b0,b1,b2 系数 input .usect "COEF", 256 ; 输入缓冲区output .usect "COEF", 256 ; 输出缓冲区

Page 124: 第 8 章 数字信号处理典型算法程序设计

四阶 IIR 滤波器的 C54x 实现程序 .textStart: SSBX FRCT STM #input, AR6 ; 输入缓冲区首址存 AR6 STM #output, AR7 ; 输出缓冲区首址存 AR7 STM #WDATA1+3,AR2 ; 存 w(n) 循环缓冲区首址, +3 目

的是 ;确保循环缓冲区的有效地址 EFB 在 WDATA 的区域,否则可能在前面的区域 STM #WDATA2+3,AR4;同上 STM #COEF1, AR3 ; 存 IIR 系数缓冲区首址 RPT #9 MVPD #iir_table, *AR3+ ; 将两个 IIR二阶节系数从程 ; 序空间 移动到 数 据空间 data 区 ; 首地 址 分别是 COEF1 和

COEF2 STM #3, BK; w(n) 循环缓冲区长度 3; STM #1, AR0 ; w(n) 循环缓冲区访问步长

Page 125: 第 8 章 数字信号处理典型算法程序设计

四阶 IIR 滤波器的 C54x 实现程序

STM #K_SIZE-1, BRC ; 执行 200 次滤波 RPTB MAINLOOP-1

LD *AR6+, 3, A ; 输入值调整 , 适当放大 STM #COEF1, AR3 ; 存 IIR 系数缓冲区首址 CALL IIR_CIRCLE1

STM #COEF2, AR3 ; 存 IIR 系数缓冲区首址 CALL IIR_CIRCLE2

STH A, *AR7+ ; 存第二个二阶节即四阶输出 ; y(n)=b0w(n+b1w(n-1+b2w(n-2)

MAINLOOP: B MAINLOOP

Page 126: 第 8 章 数字信号处理典型算法程序设计

四阶 IIR 滤波器的 C54x 实现程序

IIR_CIRCLE1:

MAC *AR2+0%, *AR3+, A ; A= 输入+ a1w(n-1)

MAC *AR2+0%, *AR3+, A ;A= 输入+ a1w(n-1)+ a2w(n-

2)

STH A, *AR2 ; 存 w(n)= 输入+ a1w(n-1)+ a2w(n-

2)

Forward:

MPY *AR2+0%, *AR3+, A ; A=b0w(n)

MAC *AR2+0%, *AR3+, A ; A=b0w(n)+b1w(n-1)

MAC *AR2+0%, *AR3+, A ; A=b0w(n+b1w(n-1+b2w(n-2)

RET

Page 127: 第 8 章 数字信号处理典型算法程序设计

四阶 IIR 滤波器的 C54x 实现程序

IIR_CIRCLE2:

MAC *AR4+0%, *AR3+, A ; A= 输入+ a1w(n-1)

MAC *AR4+0%, *AR3+, A ;A= 输入+ a1w(n-1)+ a2w(n-

2)

STH A, *AR4 ; 存 w(n)= 输入+ a1w(n-1)+ a2w(n-

2)

Forward:

MPY *AR4+0%, *AR3+, A ; A=b0w(n)

MAC *AR4+0%, *AR3+, A ; A=b0w(n)+b1w(n-1)

MAC *AR4+0%, *AR3+, A ; A=b0w(n+b1w(n-1+b2w(n-2)

RET

Page 128: 第 8 章 数字信号处理典型算法程序设计

第 8 章 数字信号处理典型算法程序设计

8.4 快速傅立叶变换的 DSP 实现 ( 自学 )

8.4.1 FFT 算法介绍FFT 算法的基本原理是把长序列的 DFT逐次分解为较短序列的 DFT 。

按照抽取方式的不同可分为: DIT-FFT (按时间抽取)和 DIF-FFT (按频率抽取)算法。

按照蝶形运算的构成不同可分为:基 2 、基 4 、基8 以及任意因子( 2n,n为大于 1 的整数)。

Page 129: 第 8 章 数字信号处理典型算法程序设计

作业习题 8.2,8.3