Download presentation
Presentation is loading. Please wait.
Published byWillis Neal Modified 6年之前
1
第6章 应用程序设计 内容提要 数字信号处理主要面向密集型的运算,包括乘法-累加、数字滤波和快速傅里叶变换等。’C54x具备了高速完成上述运算的能力,并具有体积小、功耗低、功能强、软硬件资源丰富等优点,现已在通信等许多领域得到了广泛应用。 本章结合数字信号处理和通信中最常见、最具有代表性的应用,介绍通用数字信号处理算法的DSP实现方法,主要包括: 有限冲激响应(FIR)数字滤波器 无限冲激响应(IIR)数字滤波器 快速傅里叶变换(FFT) 正弦信号发生器。 在简要介绍上述内容的基本原理、结构和算法之后,重点介绍设计方法和DSP实现的方法。 2018年12月1日 DSP原理及应用
2
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.2 IIR滤波器的DSP实现 6.3 快速傅里叶变换(FFT)的DSP实现
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.2 IIR滤波器的DSP实现 6.3 快速傅里叶变换(FFT)的DSP实现 6.4 正弦波信号发生器 2018年12月1日 DSP原理及应用
3
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 在数字信号处理中,滤波占有极其重要的地位。数字滤波是语音处理、图像处理、模式识别、频谱分析等应用中的基本处理算法。用DSP芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好等特点。 数字滤波器是DSP的基本应用,分为有限冲激响应滤波器FIR和无限冲激响应滤波器IIR。 本节主要讨论FIR滤波器的基本结构、设计方法和DSP实现方法。 2018年12月1日 DSP原理及应用
4
6.1 FIR滤波器的DSP实现 6.1.1 FIR滤波器的基本结构
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.1.1 FIR滤波器的基本结构 数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。 一个线性位移不变系统的输出序列y(n)和输入序列x(n)之间的关系,应满足常系数线性差分方程: (6.1.1) x(n): 输入序列,y(n): 输出序列,ai、bi : 滤波器系数, N: 滤波器的阶数。 2018年12月1日 DSP原理及应用
5
6.1.1 FIR滤波器的基本结构 在式(6.1.1)中,若所有的ai均为0,则得FIR滤波器的差分方程: (6.1.2)
第6章 应用程序设计 6.1.1 FIR滤波器的基本结构 在式(6.1.1)中,若所有的ai均为0,则得FIR滤波器的差分方程: (6.1.2) 对式(6.1.2)进行z变换,可得FIR滤波器的传递函数: (6.1.3) 2018年12月1日 DSP原理及应用
6
6.1.1 FIR滤波器的基本结构 FIR滤波器的结构 : 第6章 应用程序设计 x(n-N+1) x(n-1) x(n) z-1 y(n)
第6章 应用程序设计 6.1.1 FIR滤波器的基本结构 FIR滤波器的结构 : z-1 + x(n) y(n) x(n-1) x(n-N+1) b0 b1 bN-2 bN-1 2018年12月1日 DSP原理及应用
7
6.1.1 FIR滤波器的基本结构 FIR滤波器的单位冲激响应h(n)为有限长序列。
第6章 应用程序设计 6.1.1 FIR滤波器的基本结构 FIR滤波器的单位冲激响应h(n)为有限长序列。 若h(n)为实数,且满足偶对称或奇对称的条件,则FIR滤波器具有线性相位特性。 偶对称:h(n)= h(N-1-n); 奇对称:h(n)= -h(N-1-n)。 偶对称线性相位FIR滤波器的差分方程: (6.1.4) N——偶数 2018年12月1日 DSP原理及应用
8
6.1.1 FIR滤波器的基本结构 在数字滤波器中,FIR滤波器具有如下几个主要特点: ① FIR滤波器无反馈回路,是一种无条件稳定系统;
第6章 应用程序设计 6.1.1 FIR滤波器的基本结构 在数字滤波器中,FIR滤波器具有如下几个主要特点: ① FIR滤波器无反馈回路,是一种无条件稳定系统; ② FIR滤波器可以设计成具有线性相位特性。 2018年12月1日 DSP原理及应用
9
6.1 FIR滤波器的DSP实现 6.1.2 FIR滤波器的设计方法
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.1.2 FIR滤波器的设计方法 设计FIR滤波器的基本方法之一,是用有限项傅氏级数来逼近所要求的滤波器响应。 1. 用傅氏级数设计FIR滤波器 Hd()的傅氏级数: (6.1.5) = f / fs为归一化频率,fs为采样频率,T =2f / fs = 2。 2018年12月1日 DSP原理及应用
10
6.1.2 FIR滤波器的设计方法 1. 用傅氏级数设计FIR滤波器
第6章 应用程序设计 6.1.2 FIR滤波器的设计方法 1. 用傅氏级数设计FIR滤波器 系数Cn的选择可在最小均方误差的条件下,使传递函数H(z)逼近Hd()来决定。 (6.1.6) 设Hd()为偶函数, 则 n 0 (6.1.7) 且C-n = Cn。 2018年12月1日 DSP原理及应用
11
第6章 应用程序设计 1. 用傅氏级数设计FIR滤波器 理想的传递函数Hd()有无限多个系数Cn,而实际的滤波器的系数只能有有限多个。因此,可以将式(6.1.7)中的无限项级数进行截取,得到近似的传递函数: (6.1.8) | | < 1,Q为有限的正整数。 令z = ej2,则有 (6.1.9) 2018年12月1日 DSP原理及应用
12
近似传递函数的冲激响应是由一系列的系数来决定:C-Q、C-Q+1、…、C-1、C0、…、CQ-1、CQ。
第6章 应用程序设计 1. 用傅氏级数设计FIR滤波器 近似传递函数的冲激响应是由一系列的系数来决定:C-Q、C-Q+1、…、C-1、C0、…、CQ-1、CQ。 当n > 0时,对应的Cnzn项代表的是一个非因果的滤波器,即输出先于输入,要得到n时刻的输出响应需用到n+1时刻的输出响应。 为了解决这个问题,可引入Q个采样周期的延时,得 (6.1.10) 2018年12月1日 DSP原理及应用
13
令bi = CQ-i,N -1 = 2Q,则H(z)的表达式为
第6章 应用程序设计 1. 用傅氏级数设计FIR滤波器 令i = -(n-Q),作变量置换得 0 i 2Q (6.1.11) 令bi = CQ-i,N -1 = 2Q,则H(z)的表达式为 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 2018年12月1日 DSP原理及应用
14
由上述公式可实现FIR滤波器,其响应由N项构成。
第6章 应用程序设计 1. 用傅氏级数设计FIR滤波器 例如,当Q = 5时,滤波器的11个系数如下: b0 = b10 = C b1 = b9 = C4 b2 = b8 = C b3 = b7 = C2 b4 = b6 = C b5 = C0 根据卷积公式得 (6.1.13) 由上述公式可实现FIR滤波器,其响应由N项构成。 2018年12月1日 DSP原理及应用
15
第6章 应用程序设计 6.1.2 FIR滤波器的设计方法 2. 滤波器的设计 FIR滤波器分为低通滤波、高通滤波、带通滤波和带阻滤波,其设计可根据给出的滤波特性,通过下式计算系数Cn来实现。 n 0 2018年12月1日 DSP原理及应用
16
设低通滤波器的截止频率为fc,采样频率为fs,则系数表达式:
第6章 应用程序设计 2. 滤波器的设计 (1) 低通滤波器的设计 设低通滤波器的截止频率为fc,采样频率为fs,则系数表达式: (6.1.14) 2018年12月1日 DSP原理及应用
17
高通滤波器可以由一个幅度为1的响应减去一个低通滤波的响应来获得,如图所示。
第6章 应用程序设计 2. 滤波器的设计 (2) 高通滤波器的设计 高通滤波器可以由一个幅度为1的响应减去一个低通滤波的响应来获得,如图所示。 (n)响应 f (n)函数的表达式: 1 1 n = 0 0 n 0 (n) = 低通滤波 f 1 高通滤波器的系数: fc 高通滤波 f 1 fc 2018年12月1日 DSP原理及应用
18
带通滤波器可以由两个截止频率不同的低通滤波器获得,如图所示。
第6章 应用程序设计 2. 滤波器的设计 (3) 带通滤波器的设计 带通滤波器可以由两个截止频率不同的低通滤波器获得,如图所示。 带通滤波器的系数,等于两个低通滤波器的系数之差: 低通滤波2 f 1 fc2 低通滤波1 f 1 fc1 带通滤波 f 1 fc1和fc2为低通滤波器的截止频率,fs为采样频率。 fc1 fc2 2018年12月1日 DSP原理及应用
19
带阻滤波器可由(n)和带通滤波器相减获得,如图所示。
第6章 应用程序设计 2. 滤波器的设计 (4) 带阻滤波器的设计 带阻滤波器可由(n)和带通滤波器相减获得,如图所示。 带阻滤波器的系数: (n)响应 f 1 带通滤波 f 1 fc1 fc2 带阻滤波 f 1 fc1 fc2 2018年12月1日 DSP原理及应用
20
6.1 FIR滤波器的DSP实现 6.1.3 FIR滤波器的MATLAB设计
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.1.3 FIR滤波器的MATLAB设计 MATLAB是一种功能强、效率高、便于进行科学和工程计算的交互式软件包,它集数值分析、矩阵运算、信号处理和图形显示于一体,为用户提供了方便、友好的界面环境。 MATLAB中的工具箱(Toolbox)包含了许多实用程序。它提供了多种FIR滤波器设计方法。 下面以标准频率响应设计法fir1和任意频率响应设计法fir2为例说明其使用方法。 2018年12月1日 DSP原理及应用
21
6.1.3 FIR滤波器的MATLAB设计 1. fir1函数 语法: b=fir1(n,Wn) b=fir1(n,Wn,‘ftype’)
第6章 应用程序设计 6.1.3 FIR滤波器的MATLAB设计 1. fir1函数 语法: b=fir1(n,Wn) b=fir1(n,Wn,‘ftype’) b=fir1(n,Wn,Window) b=fir1(n,Wn,‘ftype’,Window) 用来设计标准频率响应的基于窗函数的FIR滤波器,可实现加窗线性相位FIR数字滤波器的设计。 n:滤波器的阶数;Wn:滤波器的截止频率; ftype:用来决定滤波器的类型, 当ftype=high时,可设计高通滤波器; 当ftype=stop时,可设计带阻滤波器。 Window:用来指定滤波器采用的窗函数类型, 其默认值为汉明(Hamming)窗。 2018年12月1日 DSP原理及应用
22
使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。
第6章 应用程序设计 1. fir1函数 使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。 (1) 采用汉明窗设计低通FIR滤波器 使用b=fir1(n,Wn)可得到低通滤波。0 Wn 1, Wn=1相当于0.5fs。 格式: b=fir1(n,Wn) 2018年12月1日 DSP原理及应用
23
使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。
第6章 应用程序设计 1. fir1函数 使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。 (2) 采用汉明窗设计高通FIR滤波器 在b=fir1(n,Wn,‘ftype’)中,当ftype=high时,可设计高通滤波器。 格式: b=fir1(n,Wn,‘high’) 2018年12月1日 DSP原理及应用
24
使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。
第6章 应用程序设计 1. fir1函数 使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。 (3) 采用汉明窗设计带通FIR滤波器 在b=fir1(n,Wn)中,当Wn=[ W1 W2 ]时,可得到带通滤波器,其通带为W1 <w<W2,W1和W2分别为通带的下限频率和上限频率。 格式: b=fir1(n,[ W1 W2 ]) 2018年12月1日 DSP原理及应用
25
使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。
第6章 应用程序设计 1. fir1函数 使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。 (4) 采用汉明窗设计带阻FIR滤波器 在b=fir1(n,Wn,‘ftype’)中,当ftype= stop,Wn=[ W1 W2 ]时,fir1函数可得到带阻滤波器。 格式: b=fir1(n,[ W1 W2 ],‘stop’) 2018年12月1日 DSP原理及应用
26
使用Window参数,可以用其他窗口函数设计出各种加窗滤波器。 Window参数可采用的窗口函数有:
第6章 应用程序设计 1. fir1函数 (5) 采用其他窗口函数设计FIR滤波器 使用Window参数,可以用其他窗口函数设计出各种加窗滤波器。 Window参数可采用的窗口函数有: Boxcar,Hanning,Bartlett,Blackman,Kasier和chebwin等,其默认时为Hamming窗。 例如,采用Bartlett窗设计带阻滤波器, 其格式: b=fir1(n,[ W1 W2 ],‘stop’,Bartlett(n+1)) 2018年12月1日 DSP原理及应用
27
注意:用fir1函数设计高通和带阻滤波器时,所使用的阶数n应为偶数,当输入的阶数n为奇数时,fir1函数会自动将阶数增加1形成偶数。
第6章 应用程序设计 1. fir1函数 【例6.1.1】 采用Hamming窗设计一个48阶FIR带通滤波器,通带为0.35 < w < 0.65。 注意:用fir1函数设计高通和带阻滤波器时,所使用的阶数n应为偶数,当输入的阶数n为奇数时,fir1函数会自动将阶数增加1形成偶数。 解:采用fir1函数的程序格式: b=fir1( 48,[ ]); 【例6.1.2】设计一个FIR高通滤波器,使用具有30dB波纹的Chebyshev窗,其阶数为34,截止频率为0.48。 解:采用fir1函数设计高通滤波器的程序格式为 Window = chebwin(35,30); b=fir1( 34,0.48,‘high’,Window) ; 2018年12月1日 DSP原理及应用
28
6.1.3 FIR滤波器的MATLAB设计 2. fir2函数 用来设计有任意频率响应的各种加窗FIR滤波器。 语法:
第6章 应用程序设计 6.1.3 FIR滤波器的MATLAB设计 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) 2018年12月1日 DSP原理及应用
29
2. fir2函数 第6章 应用程序设计 说明: 参数n为滤波器的阶数;
第6章 应用程序设计 2. fir2函数 说明: 参数n为滤波器的阶数; 参数f为频率点矢量,且f[0,1],f=1对应于0.5fs。矢量f按升序排列,且第一个元素必须为0,最后一个必须为1,并可以包含重复的频率点; 参数m为幅度点矢量,在矢量m中包含了与f相对应的期望得到的滤波器幅度; 参数Window用来指定所使用的窗函数类型,其默认值为汉明(Hamming)窗; 参数npt用来指定fir2函数对频率响应进行内插的点数; 参数lap用来指定fir2函数在重复频率点附近插入的区域大小。 2018年12月1日 DSP原理及应用
30
2. fir2函数 第6章 应用程序设计 【例6.1.3】 设计一个30阶的低通FIR滤波器,其截止频率为0.6。
第6章 应用程序设计 2. fir2函数 【例6.1.3】 设计一个30阶的低通FIR滤波器,其截止频率为0.6。 解:采用fir2函数的程序格式: f = [ ]; m = [ ]; b=fir2(30,f,m); 在使用MATLAB设计FIR滤波器时,还可以使用freqz( )和plot( )函数。 freqz( )函数:可求出传递函数的幅频响应和相频响应; plot( )函数:可绘出滤波器的幅频响应和相频响应曲线。 2018年12月1日 DSP原理及应用
31
例如,在例6.1.1~例6.1.3中,若希望得到滤波器的特性,可使用freqz()函数,其格式:
第6章 应用程序设计 2. fir2函数 例如,在例6.1.1~例6.1.3中,若希望得到滤波器的特性,可使用freqz()函数,其格式: freqz(b,1,512) 得滤波器的特性如图。 2018年12月1日 DSP原理及应用
32
第6章 应用程序设计 2. fir2函数 例6.1.1 带通滤波器的特性 2018年12月1日 DSP原理及应用
33
第6章 应用程序设计 2. fir2函数 例6.1.2 高通滤波器的特性 2018年12月1日 DSP原理及应用
34
第6章 应用程序设计 2. fir2函数 例6.1.3 低通滤波器的特性 2018年12月1日 DSP原理及应用
35
6.1 FIR滤波器的DSP实现 6.1.4 FIR滤波器的DSP实现 FIR滤波器的输出表达式:
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.1.4 FIR滤波器的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)。 2018年12月1日 DSP原理及应用
36
6.1.4 FIR滤波器的DSP实现 1. z-1算法的实现 线性缓冲区法 循环缓冲区法。 常用的方法: (1) 线性缓冲区法
第6章 应用程序设计 6.1.4 FIR滤波器的DSP实现 1. z-1算法的实现 线性缓冲区法 循环缓冲区法。 常用的方法: (1) 线性缓冲区法 ① 在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本; 特点: 又称延迟线法。 ② 从最老样本开始取数,每取一个数后,样本向下移位; ③ 读完最后一个样本后,输入最新样本并存入缓冲区的顶部。 2018年12月1日 DSP原理及应用
37
1. z-1算法的实现 (1) 线性缓冲区法 缓冲区: 顶部为低地址单元,存放最新样本; 底部为高地址单元,存放最老样本;
第6章 应用程序设计 1. z-1算法的实现 (1) 线性缓冲区法 缓冲区: 数据存储器 最新样本 顶部为低地址单元,存放最新样本; 缓冲区顶部 底部为高地址单元,存放最老样本; 指针ARx指向缓冲区底部。 最老样本 ←ARx 缓冲区底部 2018年12月1日 DSP原理及应用
38
(1) 线性缓冲区法 第6章 应用程序设计 求y(n)的过程: 算法: 取数、移位和运算:
第6章 应用程序设计 (1) 线性缓冲区法 求y(n)的过程: 算法: 取数、移位和运算: 最新样本 数据存储器 最老样本 ARx→ 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,指向缓冲区的底部。 2018年12月1日 DSP原理及应用
39
(1) 线性缓冲区法 第6章 应用程序设计 求y(n)的过程: 算法: 结果: ① y(n) ←PORTR 最新样本 数据存储器 最老样本
第6章 应用程序设计 (1) 线性缓冲区法 求y(n)的过程: 算法: 最新样本 数据存储器 最老样本 ARx→ 结果: ① y(n) ARx→ x(n+1) x(n) x(n-1) x(n-2) x(n-3) x(n-4) x(n-5) x(n-6) x(n-7) ←PORTR x(n) y(n)=b0x(n)+y1 ↑ ARx→ x(n) x(n-1) y(n)=y1=b1x(n-1)+y2 ↑ ARx→ x(n-1) x(n-2) y(n)=y2=b2x(n-2)+y3 ↑ ARx→ x(n-2) x(n-3) y(n)=y3=b3x(n-3)+y4 ↑ ARx→ x(n-3) x(n-4) y(n)=y4=b4x(n-4)+y5 ↑ ARx→ x(n-4) x(n-5) y(n)=y5=b5x(n-5)+y6 ↑ ARx→ x(n-5) x(n-6) y(n)=y6=b6x(n-6)+y7 ↑ ARx→ ARx→ x(n-6) x(n-7) y(n)=y7=b7x(n-7)+0 2018年12月1日 DSP原理及应用
40
(1) 线性缓冲区法 第6章 应用程序设计 求y(n+1)的过程: 算法: 取数顺序: x(n-6)……x(n+1) 最新样本:
第6章 应用程序设计 (1) 线性缓冲区法 求y(n+1)的过程: 算法: 取数顺序: x(n-6)……x(n+1) 最新样本: x(n+2) 数据存储器 ARx→ x(n+1) x(n) x(n-1) x(n-2) x(n-3) x(n-4) x(n-5) x(n-6) 数据存储器 x(n+8) x(n+7) x(n+6) x(n+5) x(n+4) x(n+3) x(n+2) x(n+1) 结果: ① y(n) x(n+2) ② y(n+1) x(n+1) ③ y(n+2) x(n) ④ y(n+3) x(n-1) ⑤ y(n+4) x(n-2) ⑥ y(n+5) x(n-3) ⑦ y(n+6) x(n-4) ⑧ y(n+7) x(n-5) ARx→ 2018年12月1日 DSP原理及应用
41
Z-1的运算是通过执行存储器延时指令来实现的。即将数据存储器中的数据向较高地址单元移位来进行延时。
第6章 应用程序设计 (1) 线性缓冲区法 Z-1的运算是通过执行存储器延时指令来实现的。即将数据存储器中的数据向较高地址单元移位来进行延时。 其指令: DELAY Smem ;(Smem) Smem+1 DELAY *AR ;AR3指向源地址 将延时指令与其他指令结合使用,可在同样的机器周期内完成这些操作。例如: LD + DELAY → LTD MAC + DELAY → MACD 2018年12月1日 DSP原理及应用
42
第6章 应用程序设计 (1) 线性缓冲区法 注意:用线性缓冲区实现z-1运算时,缓冲区的数据需要移动,这样在一个机器周期内需要一次读和一次写操作。因此,线性缓冲区只能定位在DARAM中。 优点: 在存储器中新老数据的位置直观明了。 2018年12月1日 DSP原理及应用
43
① 在数据存储器中开辟一个N个单元的缓冲区(滑窗),用来存放最新的N个输入样本; ② 从最新样本开始取数;
第6章 应用程序设计 1. z-1算法的实现 (2)循环缓冲区法 ① 在数据存储器中开辟一个N个单元的缓冲区(滑窗),用来存放最新的N个输入样本; ② 从最新样本开始取数; ③ 读完最老样本后,输入最新样本来代替最老样本,而其他数据位置不变; ④ 用BK寄存器对缓冲区进行间接寻址,使缓冲区地址首尾相邻。 特点: 2018年12月1日 DSP原理及应用
44
① 以ARx为指针,按顺序取数,并修改指针; ② 每取1次数后,完成1次乘法累加计算; ARx指向最新样本单元。
第6章 应用程序设计 (2)循环缓冲区法 顶层为低地址单元,存放最新样本; 算 法: 缓冲区: 底层为高地址单元,存放最老样本; 计算过程: ① 以ARx为指针,按顺序取数,并修改指针; ② 每取1次数后,完成1次乘法累加计算; ARx指向最新样本单元。 数据存储器 ARx→ x(n) x(n) y(n)=y0=b0x(n)+0 ARx→ x(n-1) x(n-1) y(n)=y1=b1x(n-1)+y0 ARx→ x(n-2) x(n-2) y(n)=y2=b2x(n-2)+y1 ARx→ x(n-3) x(n-3) y(n)=y3=b3x(n-3)+y2 ARx→ x(n-4) x(n-4) y(n)=y4=b4x(n-4)+y3 ARx→ x(n-5) x(n-5) y(n)=y5=b5x(n-5)+y4 ARx→ x(n-6) x(n-6) y(n)=y6=b5x(n-6)+y5 ARx→ x(n-7) x(n-7) y(n)=y7=b5x(n-7)+y6 ARx→ 2018年12月1日 DSP原理及应用
45
③ 求得y(n)后,输入新样本替代最老样本;
第6章 应用程序设计 (2)循环缓冲区法 ② 求y(n+1): 取数顺序:x(n+1)……x(n-6) 取数顺序:x(n)……x(n-7) ① 求y(n): 算 法: ③ 求y(n+2): 取数顺序:x(n+2)……x(n-5) 计算过程: ARx:指向x(n+2)单元 最新样本:x(n+2) 最新样本:x(n+3) ARx:指向x(n+3)单元 ARx:指向x(n+1)单元 最新样本:x(n+1) ② 每取1次数后,完成1次乘法累加计算; ④ 修改指针ARx,指向最新样本单元。 ③ 求得y(n)后,输入新样本替代最老样本; 数据存储器 x(n) x(n-7) x(n-1) x(n-2) x(n-3) x(n-4) x(n-5) x(n-6) 数据存储器 x(n) x(n+1) x(n-1) x(n-2) x(n-3) x(n-4) x(n-5) x(n+2) ARx→ 数据存储器 x(n) x(n+1) x(n-1) x(n-2) x(n-3) x(n-4) x(n+3) x(n+2) ARx→ ARx→ x(n+1) x(n+1) 2018年12月1日 DSP原理及应用
46
实现N个循环缓冲区单元首尾相邻,可用BK寄存器按模间接寻址来实现。 常用指令: … *ARx+% 循环缓冲区的优点:
第6章 应用程序设计 (2)循环缓冲区法 实现N个循环缓冲区单元首尾相邻,可用BK寄存器按模间接寻址来实现。 常用指令: … *ARx+% ;增量、按模修正ARx addr=ARx,ARx=circ(ARx+1) 循环缓冲区的优点: ① 缓冲区数据不需要移动; ② 可以使用SARAM存储器。 … *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) 2018年12月1日 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单元。 2018年12月1日 DSP原理及应用
48
else if index+step < 0 index=index+step+BK
第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。 2018年12月1日 DSP原理及应用
49
② 缓冲区起始地址的k个最低有效位必须为0,且满足2k>N。
第6章 应用程序设计 (2)循环缓冲区法 要求: ① 用BK规定循环缓冲区的长度N; ② 缓冲区起始地址的k个最低有效位必须为0,且满足2k>N。 例如:N=31,k的最小值为5,则缓冲区的起始地址:XXXX XXXX XXX0 0000B 若N=32,k的最小值为6,缓冲区的起始地址:XXXX XXXX XX B 2018年12月1日 DSP原理及应用
50
6.1.4 FIR滤波器的DSP实现 2. FIR滤波器的实现
第6章 应用程序设计 6.1.4 FIR滤波器的DSP实现 2. FIR滤波器的实现 ’C54x提供的乘法-累加指令MAC和循环寻址方式,可使FIR数字滤波器在单周期内完成每个样值的乘法 -累加计算。而每个样值的乘法-累加计算,可采用RPTZ和MAC指令结合循环寻址方式来实现。 为了实现对应项乘积运算,输入的样值x(n)和滤波系数bi必须合理的存放,并正确初始化存储块和块指针。样值x(n)和滤波系数bi的存放可用线性缓冲区或循环缓冲区实现。 2018年12月1日 DSP原理及应用
51
y(n)=b0x(n)+b1x(n-1)+…+b5x(n-5) +b6x(n-6)
第6章 应用程序设计 2. FIR滤波器的实现 (1) 用线性缓冲区实现FIR滤波器 设N=7,FIR滤波器的算法: 双操作数寻址指令:MACD *AR1-,b,A y(n)=b0x(n)+b1x(n-1)+…+b5x(n-5) +b6x(n-6) 功能:A=A+(AR1)×(b), AR1-1→AR1,(AR1)→(AR1+1) A b6×x(n-6)+A 数据存储器 暂存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 b b6 b6×x(n-6) x(n-6) +A x AR1→ x(n-5) x(n-6) 2018年12月1日 AR1→ DSP原理及应用
52
(1) 用线性缓冲区实现FIR滤波器 第6章 应用程序设计 程序清单: x .title “FIR1.ASM” .mmregs
第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 1*32768/10 x 暂存y(n) x(n) x(n-1) x(n-2) ;自定义数据空间 x(n-3) x(n-4) x(n-5) x(n-6) ;定义b6=0.1 程序存储器 ;定义b5=0.2 ;定义b4=-0.4 ;定义b3=0.3 ;定义b2=-0.4 ;定义b1=0.2 ;定义b0=0.1 COEF b6 b5 定义系数bi b4 b3 b2 b1 b0 2018年12月1日 DSP原理及应用
53
(1) 用线性缓冲区实现FIR滤波器 第6章 应用程序设计 程序清单: x .text start: SSBX FRCT
第6章 应用程序设计 (1) 用线性缓冲区实现FIR滤波器 A A+b4×x(n-4) A+b5×x(n-5) A+b0×x(n) A+b2×x(n-2) A+b1×x(n-1) b6×x(n-6) A+b3×x(n-3) x 数据存储器 暂存y(n) x(n) x(n-1) x(n-2) x(n-3) x(n-4) x(n-5) x(n-6) 程序清单: .text start: SSBX FRCT STM #x+7,AR2 STM #6,AR0 LD #x+1,DP PORTR FIR1: RPTZ A,#6 MACD *AR2-,COEF,A STH A,*AR2 PORTW *AR2+,PA0 BD FIR1 PORTR PA1,*AR2+0 .end AR2→ y(n) AR2→ AR2→ → x(n) x(n+1) y(n-1) ;设置小数乘法 AR2→ x(n) ;设置AR2 AR2→ x(n-1) AR2→ x(n-2) ;设置复位值AR0=6 AR2→ x(n-3) ;设置缓冲区首地址 AR2→ x(n-4) ;输入x(n) AR2→ AR2→ x(n-5) ;A清0,设置迭代次数 程序存储器 COEF b6 b5 b4 b3 b2 b1 b0 ;7次乘法累加和移位 ;暂存y(n) ;输出y(n),修改AR2 ;循环 ;输入最新数据, 修改AR2=AR2+AR0 2018年12月1日 DSP原理及应用
54
y(n)=b0x(n)+b1x(n-1)+…+b5x(n-5) +b6x(n-6)
第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) y DARAM b0 b1 b2 b3 b4 b5 b6 b0 xn 2018年12月1日 DSP原理及应用
55
(2) 用循环缓冲区实现FIR滤波器 第6章 应用程序设计 程序清单: .title “FIR2.ASM” .mmregs
第6章 应用程序设计 (2) 用循环缓冲区实现FIR滤波器 ROM table 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 0.1 y 程序清单: .title “FIR2.ASM” .mmregs .def start .bss y,1 xn .usect “xn”,7 b 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 0.2 ;源文件标题 0.3 ;定义MMR寄存器符号名 xn 0.4 ;定义模块 0.5 ;给y保留1个空间 0.6 ;给xn段保留7个空间 0.7 ;给b0段保留7个空间 ;PA0赋值为0 ;PA1赋值为1 ;从ROM的table定义数据 ;定义0.1 b0 ;定义0.2 ;定义0.3 ;定义0.4 ;定义0.5 ;定义0.6 ;定义0.7 2018年12月1日 DSP原理及应用
56
第6章 应用程序设计 .text start: SSBX FRCT STM #b0,AR1 RPT #6 MVPD table,*AR1+
第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 FIR2: RPTZ A,#6 MAC *AR2+0%,*AR3+0%,A STH BD FIR2 PORTR PA1,*AR2+0% .end A 0.5x(n-4)+A 0.6x(n-5)+A 0.4x(n-3)+A 0.3x(n-2)+A 0.7x(n-6)+0 0.2x(n-1)+A 0.1x(n)+A 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 ;设置小数乘法 y(n) ;AR1指向b0 ;设置传输次数 AR2→ x(n) x(n) ;系数传输至数据区 AR2→ x(n-1) ;AR2指向x(n-6)单元 AR2→ x(n-2) ;AR3指向b6单元 AR2→ x(n-3) ;设置缓冲区长度 AR2→ x(n-4) ;设置双操作数增量 AR2→ AR2→ x(n-5) ;设置页指针 AR2→ AR2→ x(n-6) x(n+1) ;输入x(n) ROM table 0.1 0.2 0.3 0.4 0.5 0.6 0.7 ;A清0,设置迭代次数 AR1→ AR3→ 0.1 0.1 0.1 ;双操作数乘法累加 AR3→ AR1→ 0.2 0.2 0.2 ;存储y(n) 0.3 AR1→ AR3→ 0.3 0.3 ;输出y(n) 0.4 AR3→ AR1→ 0.4 0.4 ;循环 0.5 AR3→ AR1→ 0.5 0.5 ;输入最新x(n+1),修正AR2 0.6 AR3→ AR1→ 0.6 0.6 0.7 AR3→ AR3→ AR1→ 0.7 0.7 2018年12月1日 DSP原理及应用 AR1→
57
第6章 应用程序设计 链接命令文件: FIR2.obj 存储空间 vectors.obj -o FIR2.out -m FIR2.map
第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 0E000 EPROM … 0060 SPRAM … 20h 4k 007F 0080 DARAM … 0EFFF 0FF80 VECS … 1380h 80h 0FFEF 13EF 2018年12月1日 DSP原理及应用
58
xn:align(8){}>DARAM PAGE 1 b0:align(8){}>DARAM PAGE 1
第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区 2018年12月1日 DSP原理及应用
59
系数对称FIR滤波器具有线性相位的特性,在数字信号处理中应用十分广泛,常用于相位失真要求较高的场合。
第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次加法 2018年12月1日 DSP原理及应用
60
(3) 系数对称FIR滤波器的实现 对称FIR滤波器的实现方法: 第6章 应用程序设计
第6章 应用程序设计 (3) 系数对称FIR滤波器的实现 AH 对称FIR滤波器的实现方法: x(n) + x(n-7) 系数表 ① 在RAM中开辟两个N/2长度的循环缓冲区New和Old ,分别存放N/2个新数据和老数据; COEF b0 x(n) x(n) + x(n-7) x(n-7) b1 b2 b3 ② 设置循环缓冲区指针: AR1指向New区中的最新数据, AR2指向Old区中的最老数据; New Old x(n) x(n) x(n-4) AR1→ ③ 在程序存储器中设置系数表; x(n-3) x(n-5) AR1→ x(n-2) x(n-6) AR2→ ④ 进行(AR1)+(AR2)AH加法运算,并修改数据指针,AR1+1AR1,AR2-1AR2; x(n-1) x(n-7) x(n-7) AR2→ 2018年12月1日 DSP原理及应用
61
(3) 系数对称FIR滤波器的实现 对称FIR滤波器的实现方法: 第6章 应用程序设计 ⑤ 累加器B清0,完成块操作,重复执行4次;
第6章 应用程序设计 (3) 系数对称FIR滤波器的实现 x(n) + x(n-7) AH 对称FIR滤波器的实现方法: x(n-1) + x(n-4) x(n) + x(n-7) x(n-3) + x(n-6) x(n-3) + x(n-6) x(n-2) + x(n-5) x(n-2) + x(n-5) x(n-1) + x(n-4) x(n) + x(n-7) 系数表 b0 b1 b2 b3 COEF ⑤ 累加器B清0,完成块操作,重复执行4次; PAR→ PAR→ b0 b0[x(n)+x(n-7)]+0 x(n-2) + x(n-5) x(n-1) + x(n-4) b3[x(n-1) + x(n-4)]+B b2[x(n-2) + x(n-5)]+B b1[x(n-3) + x(n-6)]+B x(n-3) + x(n-6) x(n) + x(n-7) PAR→ b1 乘法—累加:(AH)bi +BB; PAR→ b2 B b3 修改系数指针:PAR+1PAR; b2[x(n-2) + x(n-5)]+B b1[x(n-3) + x(n-6)]+B b1[x(n-3) + x(n-6)]+B b3[x(n-1) + x(n-4)]+B b2[x(n-2) + x(n-5)]+B b0[x(n)+x(n-7)] b0[x(n)+x(n-7)] PAR→ 加法运算:(AR1)+(AR2)AH; 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→ AR1→ AR2→ x(n-4) 修改数据指针:AR1+1AR1, AR1→ x(n-3) AR2→ x(n-5) AR2-1AR2; AR1→ x(n-2) AR2→ x(n-6) AR1→ x(n-1) AR2→ ⑥ 保存和输出结果; 2018年12月1日 DSP原理及应用
62
(3) 系数对称FIR滤波器的实现 对称FIR滤波器的实现方法: 第6章 应用程序设计 ⑦ 修正数据指针, AR1指向New区的最老数据;
第6章 应用程序设计 (3) 系数对称FIR滤波器的实现 x(n) + x(n-7) AH 对称FIR滤波器的实现方法: PAR→ 系数表 b0 b1 b2 b3 ⑦ 修正数据指针, AR1指向New区的最老数据; B a3[x(n-1)+x(n-4)]+B AR2指向Old区的最老数据。 ⑧ 用New区的最老数据替代Old区的最老数据,输入新数据替代New区的最老数据 ; New x(n) x(n-3) x(n-2) x(n-1) AR1→ AR2→ Old x(n-7) x(n-6) x(n-5) x(n-4) x(n+1) ⑨ 重复执行④~ ⑧。 AR2→ x(n-3) 2018年12月1日 DSP原理及应用
63
格式: FIRS Xmem,Ymem,Pmad
第6章 应用程序设计 (3) 系数对称FIR滤波器的实现 系数对称FIR滤波器指令: 格式: FIRS Xmem,Ymem,Pmad 功能: PmadPAR; 当(RC)0,则B+AH(Pmem)B, ((Xmem)+ (Ymem))16A, PAR+1PAR,RC-1 RC 其中, Pmem是通过PAR寻址。 2018年12月1日 DSP原理及应用
64
(3) 系数对称FIR滤波器的实现 第6章 应用程序设计 … 程序清单: .title “FIR3.ASM” .mmregs
第6章 应用程序设计 (3) 系数对称FIR滤波器的实现 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 .title “FIR3.ASM” .mmregs .def start .bss y,1 x_new: .usect “DATA1”,4 x_old: .usect “DATA2”,4 size .set 4 PA set 0 PA set 1 .data COEF: .word 1*32768/10 .word 2*32768/10 .word 3*32768/10 .word 4*32768/10 x_new DATA1 ;定义MMR寄存器符号名 ;定义模块 ;给y保留1个空间 ;给DATA1段保留4个空间 ;给DATA2段保留4个空间 ;给符号size赋值 ;给输出口地址PA0赋值 ;给输入口地址PA1赋值 ;在ROM中定义数据段 ;定义数据0.1 ;定义数据0.2 ;定义数据0.3 ;定义数据0.4 x_old DATA2 程序存储器 b0 b1 b2 b3 COEF 系数表 2018年12月1日 DSP原理及应用
65
(3) 系数对称FIR滤波器的实现 第6章 应用程序设计 程序清单: .text start: LD #x_new,DP SSBX FRCT
第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) 2018年12月1日 DSP原理及应用
66
第6章 应用程序设计 程序清单: FIR3: ADD *AR1+0%,*AR2+0%,A RPTZ B,#(size-1)
第6章 应用程序设计 程序清单: FIR3: ADD *AR1+0%,*AR2+0%,A RPTZ B,#(size-1) FIRS *AR1+0%,*AR2+0%,COEF STH 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区 2018年12月1日 DSP原理及应用
67
6.1 FIR滤波器的DSP实现 6.1.5 FIR滤波器的设计实例 设计一个FIR低通滤波器,其设计参数: 滤波器阶数:N=40;
第6章 应用程序设计 6.1 FIR滤波器的DSP实现 6.1.5 FIR滤波器的设计实例 设计一个FIR低通滤波器,其设计参数: 滤波器阶数:N=40; 截止频率:wp=0.35, ws=0.4。 2018年12月1日 DSP原理及应用
68
6.1.5 FIR滤波器的设计实例 1.由给定的设计参数确定滤波器的系数
第6章 应用程序设计 6.1.5 FIR滤波器的设计实例 1.由给定的设计参数确定滤波器的系数 根据给定的设计参数,滤波器系数可由MATLAB中的fir2函数产生,函数调用格式: f = [ ]; m = [ ]; b=fir2( 39, f, m ) 利用freqz函数可绘制滤波器的幅频、相频特性,其格式: freqz(b, 512, 1000) 2018年12月1日 DSP原理及应用
69
第6章 应用程序设计 1.由给定的设计参数确定滤波器的系数 滤波器的频率特性: 2018年12月1日 DSP原理及应用
70
2.汇编源程序 第6章 应用程序设计 采用循环缓冲区实现FIR滤波器的源程序如下: .title “FIR.ASM” .mmregs
第6章 应用程序设计 2.汇编源程序 采用循环缓冲区实现FIR滤波器的源程序如下: .title “FIR.ASM” .mmregs .bss y,1 K_FIR_BFFR set 40 PA set 0 PA 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/ ;b2,b3 … … … .word 3*32768/10000,-7*32768/ ;b38b39 2018年12月1日 DSP原理及应用
71
FIR_INIT:SSBX FRCT ;设置小数乘法 STM #FIR_COFF,AR5 ;AR1指向b0单元
第6章 应用程序设计 .text .def FIR_INIT .def FIR_TASK FIR_INIT:SSBX FRCT ;设置小数乘法 STM #FIR_COFF,AR ;AR1指向b0单元 RPT #K_FIR_BFFR ;设置传输次数 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 2018年12月1日 DSP原理及应用
72
LD #D_DATA_BUFFER,DP ;设置页指针 PORTR PA1,@D_DATA_BUFFER ;输入x(n)
第6章 应用程序设计 STM #-1,AR ;设置双操作数减量 LD #D_DATA_BUFFER,DP ;设置页指针 PORTR ;输入x(n) FIR_TASK:STM #K_FIR_BFFR,BK RPTZ A,#K_FIR_BFFR-1 ;重复操作 MAC *AR4+0%,*AR5+0%,A ;双操作数乘法-累加 STH ;暂存y(n) ;输出y(n) BD FIR_TASK ;循环 PORTR PA1,*AR4+0% ;输入最新样本,并修正AR3 .end 2018年12月1日 DSP原理及应用
73
3.汇编源程序的链接命令文件 片外48000H~4FFFFH; 数据存储空间:片内0080H~3FFFFH, 片外4000H~7FFFH。
第6章 应用程序设计 3.汇编源程序的链接命令文件 在’C5402DSP硬件系统中,用户可使用的存储器资源: 程序存储空间:片内0080H~3FFFH, 片外48000H~4FFFFH; 数据存储空间:片内0080H~3FFFFH, 片外4000H~7FFFH。 2018年12月1日 DSP原理及应用
74
/* SOLUTION FILE FOR FIR.CMD */ vectors.obj fir.obj -o fir.out
第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 } 2018年12月1日 DSP原理及应用
75
.vectors:> VECS PAGE 0 .data: > EPRAM PAGE 0
第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 } 2018年12月1日 DSP原理及应用
76
6.2 IIR滤波器的DSP实现 6.2.1 IIR滤波器的基本结构
第6章 应用程序设计 6.2 IIR滤波器的DSP实现 IIR滤波器与FIR滤波器相比,具有相位特性差的缺点,但它的结构简单、运算量小,具有经济、高效的特点,并且可以用较少的阶数获得很高的选择性。因此,也得到了较为广泛的应用。 6.2.1 IIR滤波器的基本结构 IIR滤波器差分方程的一般表达式: (6.2.1) 在零初始条件下,对式(6.2.1)进行z变换,得到传递函数: 具有N个零点zi和N个极点pi。若有极点位于单位圆外将导致系统不稳定。 2018年12月1日 DSP原理及应用
77
6.2.1 IIR滤波器的基本结构 对于IIR滤波器,系统稳定的条件如下: 若|pi|<1,当n→时,h(n)→0,系统稳定;
第6章 应用程序设计 6.2.1 IIR滤波器的基本结构 对于IIR滤波器,系统稳定的条件如下: 若|pi|<1,当n→时,h(n)→0,系统稳定; 若| pi | >1,当n→时,h(n)→,系统不稳定。 IIR滤波器具有多种形式,主要有: 直接型(也称直接Ⅰ型 标准型(也称直接Ⅱ型) 变换型 级联型 并联型 2018年12月1日 DSP原理及应用
78
6.2.1 IIR滤波器的基本结构 1.二阶IIR滤波器 二阶IIR滤波器,又称为二阶基本节,分为直接型、标准型和变换型。
第6章 应用程序设计 6.2.1 IIR滤波器的基本结构 1.二阶IIR滤波器 二阶IIR滤波器,又称为二阶基本节,分为直接型、标准型和变换型。 对于一个二阶IIR滤波器,其输出: y(n) = b0x(n)+b1x(n-1)+b2x(n-2) -a1y(n-1)-a2y(n-2) (6.2.6) 2018年12月1日 DSP原理及应用
79
根据式(6.2.6),可以得到直接型二阶IIR滤波器的结构图。
第6章 应用程序设计 1.二阶IIR滤波器 (1)直接型(直接Ⅰ型) 根据式(6.2.6),可以得到直接型二阶IIR滤波器的结构图。 b0 b1 b2 z-1 -a1 -a2 x(n) y(n) + 4个延迟单元( z-1) 2018年12月1日 DSP原理及应用
80
直接型二阶IIR滤波器还可用下图的结构实现。
第6章 应用程序设计 (1)直接型(直接Ⅰ型) 直接型二阶IIR滤波器还可用下图的结构实现。 + b0 b1 b2 -a1 -a2 x(n) y(n) w(n) z-1 2018年12月1日 DSP原理及应用
81
(1)直接型(直接Ⅰ型) 前向通道: 反馈通道: 输出方程: 第6章 应用程序设计 + z-1 b0 b1 b2 -a1 -a2 x(n)
第6章 应用程序设计 (1)直接型(直接Ⅰ型) + z-1 b0 b1 b2 -a1 -a2 x(n) y(n) w(n) 前向通道: 反馈通道: 输出方程: 2018年12月1日 DSP原理及应用
82
这种结构所使用的延迟单元最少(只有2个),因此得到了广泛地应用,故称之为标准型IIR滤波器。
第6章 应用程序设计 1.二阶IIR滤波器 (2) 标准型(直接Ⅱ型) 这种结构所使用的延迟单元最少(只有2个),因此得到了广泛地应用,故称之为标准型IIR滤波器。 z-1 b0 b1 b2 -a1 -a2 x(n) y(n) w(n) + 2018年12月1日 DSP原理及应用
83
这种结构与标准型相比,延迟单元的数目和乘法的次数不变,但只需要三次累加。
第6章 应用程序设计 1.二阶IIR滤波器 (3) 变换型 这种结构与标准型相比,延迟单元的数目和乘法的次数不变,但只需要三次累加。 z-1 b0 b1 b2 -a1 -a2 x(n) y(n) + 2018年12月1日 DSP原理及应用
84
6.2.1 IIR滤波器的基本结构 2.级联型IIR滤波器 一个高阶IIR滤波器,可以由多个二阶基本节级联组成。其传递函数可以表示为:
第6章 应用程序设计 6.2.1 IIR滤波器的基本结构 2.级联型IIR滤波器 一个高阶IIR滤波器,可以由多个二阶基本节级联组成。其传递函数可以表示为: H(z) = CH1(z) H2(z)… Hk(z) (6.2.10) Hi(z)为一阶或二节阶的传递函数。 级联型滤波器的结构: x(n) H1(z) H2(z) Hk(z) · · · y(n) 2018年12月1日 DSP原理及应用
85
由三个标准二阶节级联构成的六阶IIR滤波器:
第6章 应用程序设计 2.级联型IIR滤波器 由三个标准二阶节级联构成的六阶IIR滤波器: + Z-1 x(n) b0 b1 b2 a2 a1 d0 d1 d2 c2 c1 f0 f1 f2 e1 e2 y(n) 由三个二阶节级联的六阶IIR滤波器 2018年12月1日 DSP原理及应用
86
6.2.1 IIR滤波器的基本结构 3.并联型IIR滤波器 高阶IIR滤波器可以由多个二阶基本节并联组成。其传递函数:
第6章 应用程序设计 6.2.1 IIR滤波器的基本结构 3.并联型IIR滤波器 高阶IIR滤波器可以由多个二阶基本节并联组成。其传递函数: H(z) = C + H1(z) + H2(z) + … + Hk(z) 2018年12月1日 DSP原理及应用
87
3.并联型IIR滤波器 并联型滤波器的结构: 第6章 应用程序设计 . C x(n) y(n) + H1(z) H2(z) Hk(z)
第6章 应用程序设计 3.并联型IIR滤波器 并联型滤波器的结构: x(n) y(n) H1(z) H2(z) Hk(z) C . + 2018年12月1日 DSP原理及应用
88
6.2 IIR滤波器的DSP实现 6.2.2 IIR滤波器的设计 IIR滤波器的设计可利用模拟滤波器原型来实现。 设计方法:
第6章 应用程序设计 6.2 IIR滤波器的DSP实现 6.2.2 IIR滤波器的设计 IIR滤波器的设计可利用模拟滤波器原型来实现。 设计方法: ① 根据模拟设计理论设计出满足要求的传递函数H(s); ② 将H(s)变换成数字滤波器的传递函数H(z)。 2018年12月1日 DSP原理及应用
89
6.2.2 IIR滤波器的设计 1. 模拟滤波器的原型 设计IIR滤波器的基础是设计模拟滤波器的原型,这些原型滤波器主要有:
第6章 应用程序设计 6.2.2 IIR滤波器的设计 1. 模拟滤波器的原型 设计IIR滤波器的基础是设计模拟滤波器的原型,这些原型滤波器主要有: ① 巴特沃思滤波器,其幅度响应在通带内具有最平特性; ② 切比雪夫滤波器,在通带内具有等波纹特性,且阶数小于巴特沃思滤波器; ③ 椭圆滤波器,在通带和阻带内具有等波纹特性,且阶数最小。 2018年12月1日 DSP原理及应用
90
6.2.2 IIR滤波器的设计 2. 双线性变换 将模拟滤波器转换为数字滤波器常用的方法是双线性变换,其作用是完成从s平面到z平面的映射。
第6章 应用程序设计 6.2.2 IIR滤波器的设计 2. 双线性变换 将模拟滤波器转换为数字滤波器常用的方法是双线性变换,其作用是完成从s平面到z平面的映射。 转换关系: 2018年12月1日 DSP原理及应用
91
① s平面上的j 轴映射到z平面的单位圆上; ② s平面的左半平面映射到z平面的单位圆内; ③ s平面的右半平面映射到z平面的单位圆外。
第6章 应用程序设计 2. 双线性变换 双线性变换的基本性质: ① s平面上的j 轴映射到z平面的单位圆上; ② s平面的左半平面映射到z平面的单位圆内; ③ s平面的右半平面映射到z平面的单位圆外。 模拟频率A与数字频率D之间的映射关系: (6.2.17) H(s)与H(z)之间的对应关系: H(s)|s=jA= H(z)|z=ejDT (6.2.18) 2018年12月1日 DSP原理及应用
92
② 对截止频率或预定的数字频率D进行预畸变,由式(6.2.17)求得相应的模拟频率A;
第6章 应用程序设计 2. 双线性变换 双线性变换的设计步骤: ① 选择一个合适的模拟传递函数H(s); ② 对截止频率或预定的数字频率D进行预畸变,由式(6.2.17)求得相应的模拟频率A; ③ 用A对H(s)中的频率进行换算,即H(s)|s=jA; ④ 用式(6.2.12)计算H(z)。 (6.2.20) 2018年12月1日 DSP原理及应用
93
2. 双线性变换 第6章 应用程序设计 【例6.2.1】设计一个低通滤波器。 要求:带宽BW=1rad/s,采样频率fs=10Hz。
第6章 应用程序设计 2. 双线性变换 【例6.2.1】设计一个低通滤波器。 要求:带宽BW=1rad/s,采样频率fs=10Hz。 解:根据给定的指标,令D= BW=1rad/s,T=1/ fs=0.1s。 ① 选择一个满足带宽条件的低通模拟滤波器, 其传递函数: ② 根据式(6.2.17)对D进行预畸变,求A。 2018年12月1日 DSP原理及应用
94
2. 双线性变换 第6章 应用程序设计 【例6.2.1】设计一个低通滤波器。 要求:带宽BW=1rad/s,采样频率fs=10Hz。
第6章 应用程序设计 2. 双线性变换 【例6.2.1】设计一个低通滤波器。 要求:带宽BW=1rad/s,采样频率fs=10Hz。 ③ 由A对H(s)进行校正。 ④ 根据式(6.2.20),求期望的数字滤波器的传递函数H(z)。 2018年12月1日 DSP原理及应用
95
6.2 IIR滤波器的DSP实现 6.2.3 IIR滤波器的MATLAB设计 IIR滤波器还可利用MATLAB软件来设计, 主要有:
第6章 应用程序设计 6.2 IIR滤波器的DSP实现 6.2.3 IIR滤波器的MATLAB设计 IIR滤波器还可利用MATLAB软件来设计, 主要有: 巴特沃思滤波器的设计 切比雪夫滤波器的设计 椭圆滤波器的设计 2018年12月1日 DSP原理及应用
96
6.2.3 IIR滤波器的MATLAB设计 1. 巴特沃思滤波器的设计 (1) butter函数
第6章 应用程序设计 6.2.3 IIR滤波器的MATLAB设计 1. 巴特沃思滤波器的设计 (1) butter函数 功能:用于设计Butterworth(巴特沃思)滤波器。 语法: [b,a] = butter(n,Wn) [b,a] = butter(n,Wn,‘ftype’) 说明:可设计低通、带通、高通和带阻滤波器。 特性:使通带内的幅度响应最大限度地平坦, 但通带外的幅度响应衰减较慢。 2018年12月1日 DSP原理及应用
97
可以设计截止频率为Wn的n阶低通滤波器,其中截止频率应满足0≤Wn≤1,Wn=1相当于0.5fs。
第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。 2018年12月1日 DSP原理及应用
98
[ b,a ] = butter(n,Wn,‘ftype’) 可以设计高通或带阻滤波器。
第6章 应用程序设计 1. 巴特沃思滤波器的设计 (1) butter函数 [ b,a ] = butter(n,Wn,‘ftype’) 可以设计高通或带阻滤波器。 当ftype = high时,可设计截止频率为Wn的高通滤波器; 当ftype = stop时,可设计带阻滤波器,此时Wn = [ W1 W2],阻带为W1< w <W2。 butter函数主要用于设计通带平坦的滤波器。 2018年12月1日 DSP原理及应用
99
语法: [n,Wn] = buttord(Wp,Ws,Rp,Rs)
第6章 应用程序设计 1. 巴特沃思滤波器的设计 (2) buttord函数 功能:用来选择巴特沃思滤波器的阶数。 语法: [n,Wn] = buttord(Wp,Ws,Rp,Rs) 说明:可以在给定滤波器性能的情况下,选择滤波器的最小阶数,其中Wp和Ws分别是通带和阻带的截止频率,其值为0≤Wp(或Ws)≤1,当该值为1时表示0.5fs。 Rp和Rs分别是通带和阻带区的波纹系数和衰减系数。 2018年12月1日 DSP原理及应用
100
[n,Wn] = buttord(Wp,Ws,Rp,Rs)可以得到高通、带通和带阻滤波器的最小阶数n。
第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。 2018年12月1日 DSP原理及应用
101
第6章 应用程序设计 (2) buttord函数 【例6.2.2】设计一个带通IIR滤波器,通带范围为100~250Hz,带通的波纹系数小于3dB,带外50Hz处的衰减30dB 解:根据给出的滤波器的性能,首先利用buttord函数确定最小阶数n,然后利用butter函数来实现。 程序如下: Wp = [ ]/500; Ws = [50 300]/500; [n,Wn] = buttord(Wp, Ws, 3,30); [ b,a ] = butter(n, Wn); freqz(b, a, 512, 1000) 2018年12月1日 DSP原理及应用
102
【例6.2.2】设计一个带通IIR滤波器,通带范围为100~250Hz,带通的波纹系数小于3dB,带外50Hz处的衰减30dB
第6章 应用程序设计 【例6.2.2】设计一个带通IIR滤波器,通带范围为100~250Hz,带通的波纹系数小于3dB,带外50Hz处的衰减30dB 带通滤波器的频率特性: 2018年12月1日 DSP原理及应用
103
6.2.3 IIR滤波器的MATLAB设计 2. 切比雪夫滤波器的设计 (1) cheby1函数
第6章 应用程序设计 6.2.3 IIR滤波器的MATLAB设计 2. 切比雪夫滤波器的设计 切比雪夫滤波器可分为两种类型:ChebyshevⅠ型和ChebyshevⅡ型,分别具有通带等波纹和阻带等波纹性能。 (1) cheby1函数 功能:用来设计ChebyshevⅠ型滤波器(通带等波纹) 语法: [ b,a ] = cheby1(n,Rp,Wn) [ b,a ] = cheby1(n, Rp,Wn,‘ftype’) 说明:可以设计低通、带通、高通和带阻ChebyshevⅠ型数字滤波器,其通带内为等波纹,阻带内为单调。 2018年12月1日 DSP原理及应用
104
可以设计n阶低通ChebyshevⅠ型数字滤波器,其中Rp用来确定通带内的纹波,Wn为该滤波器的截止频率。
第6章 应用程序设计 2. 切比雪夫滤波器的设计 (1) cheby1函数 [ b,a ] = cheby1(n,Rp,Wn) 可以设计n阶低通ChebyshevⅠ型数字滤波器,其中Rp用来确定通带内的纹波,Wn为该滤波器的截止频率。 当Wn = [ W1 W2 ]时,cheby1函数可产生一个2n阶的数字带通滤波器,其通带为W1<w<W2。 [ b,a ] = cheby1(n,Rp,Wn,‘ftype’) 可用来设计n阶高通或带阻滤波器。 2018年12月1日 DSP原理及应用
105
功能:用来选择ChebyshevⅠ型滤波器的阶数。 语法: [n,Wn] = cheb1ord(Wp, Ws, Rp, Rs)
第6章 应用程序设计 2. 切比雪夫滤波器的设计 (2) cheb1ord函数 功能:用来选择ChebyshevⅠ型滤波器的阶数。 语法: [n,Wn] = cheb1ord(Wp, Ws, Rp, Rs) 说明:可以在给定滤波器性能的情况下,选择ChebyshevⅠ型高通、带通和带阻滤波器的最小阶数。 Wp和Ws分别为通带和阻带滤波器的截止频率,其值为0≤Wp(或Ws)≤1。 Rp和Rs分别是通带和阻带区的纹波系数。 2018年12月1日 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) 2018年12月1日 DSP原理及应用
107
第6章 应用程序设计 【例6.2.3】设计一个低通ChebyshevⅠ型滤波器,通带范围0~100Hz,通带波纹3dB,阻带衰减-30dB,数据采样频率为1000Hz。 带通滤波器的频率特性: 2018年12月1日 DSP原理及应用
108
功能:用来设计ChebyshevⅡ滤波器(阻带等波纹)。 语法: [ b,a ] = cheby2(n,Rs,Wn)
第6章 应用程序设计 2. 切比雪夫滤波器的设计 (3) cheby2函数 功能:用来设计ChebyshevⅡ滤波器(阻带等波纹)。 语法: [ b,a ] = cheby2(n,Rs,Wn) [ b,a ] = cheby2(n,Rs,Wn,‘ftype’) 说明:cheby2函数与cheby1函数基本相同,只是用cheby2函数所设计的滤波器,其通带内为单调的,阻带内为等波纹,由Rs指定阻带内的波纹。 cheby2函数可以设计ChebyshevⅡ型低通、带通、高通和带阻数字滤波器。 2018年12月1日 DSP原理及应用
109
功能:用来选择ChebyshevⅡ型滤波器的阶数。 语法: [ n,Wn ] = cheb2ord(Wp, Ws, Rp, Rs)
第6章 应用程序设计 2. 切比雪夫滤波器的设计 (4) cheb2ord函数 功能:用来选择ChebyshevⅡ型滤波器的阶数。 语法: [ n,Wn ] = cheb2ord(Wp, Ws, Rp, Rs) 说明:cheb2ord函数与cheb2ord函数类似,可以利用该函数确定ChebyshevⅡ型数字滤波器的最小阶数n和截止频率Wn。 cheb2ord函数与cheby2函数配合使用,可设计出最低阶数的ChebyshevⅡ型数字滤波器。 2018年12月1日 DSP原理及应用
110
第6章 应用程序设计 (4) cheb2ord函数 【例6.2.4】设计一个ChebyshevⅡ型带通滤波器,通带范围100~250Hz,通带波纹3dB,阻带衰减-30dB,数据采样频率为1000Hz。 解:先利用cheb2ord函数找出最小阶数,然后由cheby2函数设计滤波器, 程序如下: Wp = [ ]/500; Ws = [50 300]/500; [n,Wn] = cheb2ord(Wp, Ws, 3,30); [ b,a ] = cheby2(n,3,Wn) 2018年12月1日 DSP原理及应用
111
6.2.3 IIR滤波器的MATLAB设计 3. 椭圆滤波器的设计 (1) ellip函数 功能:用来设计Elliptic(椭圆)型滤波器。
第6章 应用程序设计 6.2.3 IIR滤波器的MATLAB设计 3. 椭圆滤波器的设计 (1) ellip函数 功能:用来设计Elliptic(椭圆)型滤波器。 语法: [ b,a ] = ellip(n, Rp, Rs, Wn) [ b,a ] = ellip(n, Rp, Rs, Wn,‘ftype’) 说明:可以设计低通、高通、带通和带阻数字滤波器。 参数Rp和Rs分别用来指定通带波纹和阻带波纹, Wn指定滤波器的截止频率,n为滤波器的阶数。 2018年12月1日 DSP原理及应用
112
● [ b,a ] = ellip(n, Rp, Rs, Wn)
第6章 应用程序设计 (1) ellip函数 ● [ b,a ] = ellip(n, Rp, Rs, Wn) 可设计n阶低通或带通滤波器。 当Wn=[ W1 W2]时,可设计带通滤波器。 ● [ b,a ] = ellip(n, Rp, Rs, Wn,‘ftype’) 可设计n阶高通或带阻滤波器。 当ftype = high时,可设计截止频率为Wn的高通滤波器; 当ftype = stop,且Wn=[ W1 W2]时,可设计带阻滤波器,阻带为W1< w <W2。 2018年12月1日 DSP原理及应用
113
语法: [ n,Wn ] = ellipord(Wp, Ws, Rp, Rs)
第6章 应用程序设计 3. 椭圆滤波器的设计 (2) ellipord函数 功能:用来选择椭圆滤波器的阶数。 语法: [ n,Wn ] = ellipord(Wp, Ws, Rp, Rs) 说明:用于选择指定性能时的椭圆滤波器的最小阶数n和截止频率Wn,并与ellip函数配合可设计出最低阶数的椭圆滤波器。 2018年12月1日 DSP原理及应用
114
(2) ellipord函数 第6章 应用程序设计
第6章 应用程序设计 (2) ellipord函数 【例6.2.5】设计椭圆带通滤波器,通带范围100~250Hz,通带波纹3dB,阻带衰减-30dB,数据采样频率为1000Hz。 解:利用ellipord和ellip函数设计最小阶数椭圆滤波器 程序如下: Wp = [ ]/500; Ws = [50 300]/500; [n,Wn] = ellipord(Wp, Ws, 3,30); [ b,a ] = ellip(n,3,Wn); 2018年12月1日 DSP原理及应用
115
6.2 IIR滤波器的DSP实现 6.2.4 IIR滤波器的DSP实现 IIR滤波器的优点: ① 可用较少的阶数获得较高的选择特性;
第6章 应用程序设计 6.2 IIR滤波器的DSP实现 6.2.4 IIR滤波器的DSP实现 IIR滤波器的优点: ① 可用较少的阶数获得较高的选择特性; ② 所用存储单元少,运算次数少; ③ 成本低、效率高。 IIR滤波器的缺点: ① 在有限精度的运算中,容易出现不稳定现象; ② 选择性越好,相位的非线性越严重。 2018年12月1日 DSP原理及应用
116
6.2.4 IIR滤波器的DSP实现 1. 二阶IIR滤波器的实现方法 一个高阶IIR滤波器可由多个二阶IIR滤波器组成。
第6章 应用程序设计 6.2.4 IIR滤波器的DSP实现 1. 二阶IIR滤波器的实现方法 一个高阶IIR滤波器可由多个二阶IIR滤波器组成。 + Z-1 x(n) b0 b1 b2 a2 a1 d0 d1 d2 c2 c1 f0 f1 f2 e1 e2 y(n) 由三个二阶节级联的六阶IIR滤波器 2018年12月1日 DSP原理及应用
117
1. 二阶IIR滤波器的实现方法 (1) 标准型二阶IIR滤波器的实现 二阶IIR滤波器的标准形式: 第6章 应用程序设计 z-1 z-1
第6章 应用程序设计 1. 二阶IIR滤波器的实现方法 (1) 标准型二阶IIR滤波器的实现 二阶IIR滤波器的标准形式: w(n) b0 x(n) + + y(n) z-1 a1 w(n-1) b1 + + 反馈通道 z-1 前向通道 a2 b2 w(n-2) 2018年12月1日 DSP原理及应用
118
反馈通道: w(n) = x(n) + a1 w(n-1) + a2 w(n-2)
第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); ④ 重复循环。 特 点:先增益、后衰减。 2018年12月1日 DSP原理及应用
119
(1) 标准型二阶IIR滤波器的实现 乘法累加运算采用双操作数指令来完成。 如:MAC *ARx, *ARy, A
第6章 应用程序设计 (1) 标准型二阶IIR滤波器的实现 乘法累加运算采用双操作数指令来完成。 如:MAC *ARx, *ARy, A 功能: A = A + ARx * ARy DARAM b2 b1 b0 a2 a1 DARAM w(n-2) w(n-1) w(n) 数据区 系数表 2018年12月1日 DSP原理及应用
120
第6章 应用程序设计 SSBX FRCT STM #w,AR2 STM #COEF+4,AR3 MVMM AR3,AR1 STM #3,BK
第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 STH A,*AR2 MPY *AR2+0%,*AR3-,A MAC *AR2,*AR3-,A MVMM AR1,AR3 BD IIR PORTW *AR2,PA0 ;设置小数乘法 ;AR2指向w ;AR3指向a1单元 A x(n) a1*w(n-1)+x(n) b1*w(n-1)+A b0*w(n)+A a2*w(n-2)+A B2*w(n-2)+A ;保存a1地址 ;设置缓冲区长度 ;设置变址寻址步长 DARAM w(n-2) w(n-1) w(n) … b2 b1 b0 a2 a1 COEF w ;输入数据x(n) w(n) x(n) AR2→ AR2→ ;x(n)送入AH,修改指针 w(n-2) y(n) AR2→ AR2→ ;第1次乘法累加 a1×w(n-1)+x(n)→A 计算反馈通道 w(n-1) AR2→ AR2→ ;第2次乘法累加 a2×w(n-2)+A→A ;保存w(n) ;乘法运算 b0×w(n)+A→A AR3→ ;第1次乘法累加 b1×w(n-1)+A→A AR3→ 计算前向通道 ;第2次乘法累加 b2×w(n-2)+A→A AR3→ ;保存y(n) AR3→ ;指针AR3回位 ;循环 AR3→ AR3→ ;输出数据y(n) 2018年12月1日 DSP原理及应用
121
二阶IIR滤波器可以用直接型结构来实现。
第6章 应用程序设计 1. 二阶IIR滤波器的实现方法 (2) 直接型二阶IIR滤波器的实现 二阶IIR滤波器可以用直接型结构来实现。 传递函数: 差分方程: y(n)=b0x(n)+b1x(n-1)+b2x(n-2) +a1y(n-1)+a2y(n-2) 特点:先衰减后增益,系统动态范围和鲁棒性较好。 2018年12月1日 DSP原理及应用
122
(2) 直接型二阶IIR滤波器的实现 直接型二阶IIR滤波器的结构: 第6章 应用程序设计 + + Z-1 Z-1 + + Z-1 Z-1
第6章 应用程序设计 (2) 直接型二阶IIR滤波器的实现 直接型二阶IIR滤波器的结构: x(n) b0 y(n) + + Z-1 Z-1 b1 a1 + + Z-1 Z-1 b2 a2 2018年12月1日 DSP原理及应用
123
采用循环缓冲区方式寻址,在DARAM中开辟4个缓冲区,用来存放变量和系数。
第6章 应用程序设计 (2) 直接型二阶IIR滤波器的实现 采用循环缓冲区方式寻址,在DARAM中开辟4个缓冲区,用来存放变量和系数。 DARAM DARAM DARAM DARAM x(n-2) y(n-2) b2 a2 DX DY DB DA x(n-1) y(n-1) b1 a1 AR3→ AR5→ x(n) y(n) b0 AR2→ AR4→ 2018年12月1日 DSP原理及应用
124
第6章 应用程序设计 .title “IIR.ASM” .mmregs .def start DX .usect “DX”,3
第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 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 x(n-2) x(n-1) DX段 x(n) … DY y(n-2) ;PA0赋值为0 ;PA1赋值为1 y(n-1) DY段 y(n) ;从table定义数据 ;x(n-2) ;x(n-1) ;y(n-2) ;y(n-1) ;b2 ;b1 ;b0 ;a2 ;a1 … ROM DB b2 table DB段 b1 b0 … 0.1 DA a2 0.2 DA段 a1 0.3 0.5 2018年12月1日 DSP原理及应用 -0.4
125
第6章 应用程序设计 .text start: SSBX FRCT STM #DX,AR1 RPT #1 ;设置小数乘法
第6章 应用程序设计 .text start: SSBX FRCT STM #DX,AR1 RPT #1 MVPD #table,*AR1+ STM #DY,AR1 MVPD #table+2,*AR1+ STM #DB,AR1 RPT #2 MVPD #table+4,*AR1+ STM #DA,AR1 MVPD #table+7,*AR1+ STM #DX+2,AR2 STM #DY+1,AR3 STM #DB+2,AR4 STM #DA+1,AR5 ;设置小数乘法 ;AR1指向DX 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 AR1→ ;传送初始化数据 x(n-2),x(n-1) AR1→ AR2→ ; AR1指向DY ;传送初始化数据 y(n-2),y(n-1) AR1→ AR3→ AR1→ ; AR1指向DB ;传送系数b2,b1,b0 ROM 0.1 0.2 0.3 0.5 -0.4 table 0.1 AR1→ ; AR1指向DA 0.2 AR1→ AR4→ 0.3 AR1→ ;传送系数a2,a1 ; 设定DX段指针AR2 0.1 0.5 AR1→ ; 设定DY段指针AR3 0.2 0.3 AR5→ -0.4 AR1→ ; 设定DB段指针AR4 0.5 ; 设定DA段指针AR5 -0.4 2018年12月1日 DSP原理及应用
126
A=b2x(n-2)+b1x(n-1)+b0x(n) A=a1y(n-1)+b2x(n-2) +b1x(n-1)+b0x(n)
第6章 应用程序设计 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 MAR *AR5+0% STH A,*AR3 BD IIR PORTW *AR3,PA0 .end A b0*x(n) a1*y(n-1)+A a2*y(n-2)+A b1*x(n-1)+A b2*x(n-2)+A ;设定缓冲区长度 ;设置双操作数增量 ;输入x(n) 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→ AR2→ AR2→ ;乘法运算,A=b0×x(n) x(n) ;第1次乘法累加 计算前向通道 ;第2次乘法累加 A=b1x(n-1)+b0x(n) AR3→ ;第3次乘法累加 A=b2x(n-2)+b1x(n-1)+b0x(n) 计算反馈通道 y(n) AR3→ A=a1y(n-1)+b2x(n-2) +b1x(n-1)+b0x(n) ;第4次乘法累加 ;修正AR5 A=a2y(n-2)+a1y(n-1) +b2x(n-2)+b1x(n-1) +b0x(n) AR4→ ;保持y(n) AR4→ AR4→ ;循环 ;输出y(n) AR5→ AR5→ AR5→ 2018年12月1日 DSP原理及应用
127
/ SOLUTION FILE FOR IIR.CMD / iir.obj vectors.obj -o iir.out
第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 } 存储空间 ROM RAM ;选定的目标文件 ;生成IIR的输出文件 ;生成IIR的存储器映像文件 ;定义源程序的入口地址 ;定义目标存储器空间 ;第0页:程序存储器 ;EPROM的起始地址:E000h 长度:4K ; VECS的起始地址:FF80h 长度:0080h ;第1页:数据存储器 ; SPRAM的起始地址:0060h 长度:0020h ; DARAM的起始地址:0080h 长度:1380h 0E000 EPROM … 0060 SPRAM … 20h 4k 007F 0080 DARAM … 0EFFF 0FF80 VECS … 1380h 80h 0FFEF 13EF 2018年12月1日 DSP原理及应用
128
DX: align(4){} > DARAM PAGE 1 DY: align(4){} > DARAM PAGE 1
第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区 2018年12月1日 DSP原理及应用
129
6.2.4 IIR滤波器的DSP实现 2.高阶IIR滤波器的实现
第6章 应用程序设计 6.2.4 IIR滤波器的DSP实现 2.高阶IIR滤波器的实现 一个高阶IIR滤波器可以由若干个二阶基本节相级联或并联构成。由于调整每个二阶基本节的系数,只涉及这个二阶基本节的一对极点和零点,不影响其他极、零点,因此用二阶基本节构成的IIR滤波器便于系统的性能调整,受量化噪声影响小,因而得到了广泛的应用。 方法:将高阶IIR滤波器分解成若干个二阶基本节,然后进行级联来实现。 特点:各基本节的极、零点独立,便于系统性能的调整。 2018年12月1日 DSP原理及应用
130
以四阶椭圆低通IIR滤波器为例,介绍高阶滤波器的实现方法:
第6章 应用程序设计 2.高阶IIR滤波器的实现 以四阶椭圆低通IIR滤波器为例,介绍高阶滤波器的实现方法: ● 先求出四阶椭圆低通滤波器的传递函数H(z); ● 再分解成两个级联的二阶基本节,分别求出系数,保存在iir_coff中; ● 循环执行两次二阶基本节IIR滤波,得到一个滤波后的值; ● 处理的采样点数由K_FRAME_SIZE决定。 2018年12月1日 DSP原理及应用
131
二阶基本节:采用标准型二阶IIR滤波器。 结构图:
第6章 应用程序设计 2.高阶IIR滤波器的实现 二阶基本节:采用标准型二阶IIR滤波器。 结构图: 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) 2018年12月1日 DSP原理及应用
132
2.高阶IIR滤波器的实现 第6章 应用程序设计 程序清单: .mmregs .include “main.inc”
第6章 应用程序设计 2.高阶IIR滤波器的实现 程序清单: .mmregs .include “main.inc” iir_table_star .sect “iir_coff” .word .word .word .word .word .word .word .word iir_table_end ;a2 ;a1/2,对大于1的系数定标 ;b2 ;b1 ;b0 定义第一个二阶基本节系数 定义第二个二阶基本节系数 2018年12月1日 DSP原理及应用
133
2.高阶IIR滤波器的实现 第6章 应用程序设计 程序清单: iir_coff_table .usect “coff_iir”,16
第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 2018年12月1日 DSP原理及应用
134
2.高阶IIR滤波器的实现 第6章 应用程序设计 程序清单: .sect “iir” iir_task: STM #in_buf,AR3
第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 ;设定二阶基本节的个数 2018年12月1日 DSP原理及应用
135
2.高阶IIR滤波器的实现 第6章 应用程序设计 程序清单: feedback_path: MAC *AR1+,*AR2-,A
第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)+a2w(n-2) ;A=x(n)+a2w(n-2)+a1w(n-1)/2 ;A=x(n)+a2w(n-2)+a1w(n-1) ;w(n)=x(n)+a2w(n-2)+a1w(n-1) ;A=b2w(n-2) ;A=b2w(n-2)+b1w(n-1) ;w(n-2)=w(n-1) 2018年12月1日 DSP原理及应用
136
2.高阶IIR滤波器的实现 第6章 应用程序设计 程序清单: eloop: BANZD feedback_path,*AR0-
第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=b2w(n-2)+b1w(n-1)+b0w(n) ;w(n-1)=w(n) ;定标输出数据 ;存储滤波结果y(n) 2018年12月1日 DSP原理及应用
137
注意:要合理安排各二阶基本节的前后顺序,使系统的精度得到优化。
第6章 应用程序设计 2.高阶IIR滤波器的实现 程序说明: AR1——指向滤波器系数; AR2——指向输入数据缓冲; AR3——指向采样数据入口; AR4——指向输出数据口。 注意:要合理安排各二阶基本节的前后顺序,使系统的精度得到优化。 2018年12月1日 DSP原理及应用
138
6.2.4 IIR滤波器的DSP实现 3.IIR滤波器实现中的几个问题 系数≥1时的定标方法 ① 用大系数定标,即用大系数除所有系数。
第6章 应用程序设计 6.2.4 IIR滤波器的DSP实现 3.IIR滤波器实现中的几个问题 系数≥1时的定标方法 在设计IIR滤波器时,若出现系数大于1时,需对系数进行定标。 方法: ① 用大系数定标,即用大系数除所有系数。 ② 大系数分解,即将大系数分解多个小于1系数。 例如:b0=1. 2,则 b0x(n)= 0. 5b0x(n)+0. 5b0x(n) = 0. 6x(n)+0. 6x(n) 2018年12月1日 DSP原理及应用
139
从外设输入数据加载到累加器A,可用一下指令: PORTR P0,@Xin LD @Xin,16,A
第6章 应用程序设计 3.IIR滤波器实现中的几个问题 对输入数据定标 从外设输入数据加载到累加器A,可用一下指令: PORTR LD @Xin,16,A 若在运算中,出现输出值大于1时,可将输入值缩小若干倍。 PORTR LD @Xin,16-3,A ;输入数据除8,使输出数据<1。 2018年12月1日 DSP原理及应用
140
6.3 快速傅里叶变换(FFT)的DSP实现 傅里叶变换是将信号从时域变换到频域的一种变换形式,是信号处理领域中一种重要的分析工具。
第6章 应用程序设计 6.3 快速傅里叶变换(FFT)的DSP实现 傅里叶变换是将信号从时域变换到频域的一种变换形式,是信号处理领域中一种重要的分析工具。 离散傅里叶变换(DFT)是连续傅里叶变换在离散系统中的表现形式。 快速傅里叶变换(FFT)是快速计算DFT的一种高效方法,可以明显地降低运算量,大大地提高DFT的运算速度,从而使DFT得到了广泛的应用。 DSP芯片的出现使FFT的实现变得更加方便。由于多数的DSP芯片都能在单指令周期内完成乘法—累加运算,而且还提供了专门的FFT指令使得FFT算法在DSP芯片上实现的速度更快。 2018年12月1日 DSP原理及应用
141
6.3 快速傅里叶变换(FFT)的DSP实现 6.3.1 FFT算法的简介 1.离散傅氏变换DFT
第6章 应用程序设计 6.3 快速傅里叶变换(FFT)的DSP实现 6.3.1 FFT算法的简介 1.离散傅氏变换DFT 快速傅里叶变换(FFT)是一种高效实现离散傅里叶变换(DFT)的快速算法,是数字信号处理中最为重要的工具之一,它在声学、语音、电信和信号处理等领域有着广泛的应用。 对于长度为N的有限长序列x(n),它的离散傅里叶变换为: 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)次复数加法。 2018年12月1日 DSP原理及应用
142
6.3.1 FFT算法的简介 2.快速傅氏变换FFT 旋转因子WN的特性: 对称性: WkN = -WNk+N/2;
第6章 应用程序设计 6.3.1 FFT算法的简介 2.快速傅氏变换FFT 旋转因子WN的特性: 对称性: WkN = -WNk+N/2; 周期性: WkN =WNk+N。 FFT的算法 : 将长序列的DFT分解成短序列的DFT。 最小变换的点数称为基数。 例如:对于基数为2的FFT算法,它的最小变换是2点DFT。 例如:当N为偶数时,其算法: 将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半; 将每个N/2点的DFT分解成N/4点的DFT,使复数乘法又减少 一半,继续进行分解可以大大减少计算量。 2018年12月1日 DSP原理及应用
143
DIT FFT算法:是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。
第6章 应用程序设计 2.快速傅氏变换FFT 按时间抽取的FFT——DIT FFT 按频率抽取的FFT——DIF FFT FFT算法 DIT FFT算法:是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。 DIF FFT算法:是在频域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。 区别:旋转因子出现的位置不同。 DIT FFT算法——输入端,DIF FFT——输出端。 2018年12月1日 DSP原理及应用
144
假定序列x(n)的点数N是2的幂,按照DIT FFT算法可分解为:
第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,…, 2018年12月1日 DSP原理及应用
145
2.快速傅氏变换FFT 按照奇偶序列,x(n)的DFT表示为: 第6章 应用程序设计 (6.3.2) 2018年12月1日 DSP原理及应用
第6章 应用程序设计 2.快速傅氏变换FFT 按照奇偶序列,x(n)的DFT表示为: (6.3.2) 2018年12月1日 DSP原理及应用
146
由于WN2=[e-j(2/N)]2=[e-j2/(N/2)]=WN/2,则有:
第6章 应用程序设计 2.快速傅氏变换FFT 由于WN2=[e-j(2/N)]2=[e-j2/(N/2)]=WN/2,则有: k = 0,1,…,N/ (6.3.3) 由于对称性,WNk+N/2 = -WNk, 则X(k+N/2)=X1(k) - WNkX2(k)。 X1(k)和X2(k)分别为x1(n)和x2(n)的N/2点的DFT。 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) 2018年12月1日 DSP原理及应用
147
xm(p)= xm-1(p)+ xm-1(q)WNk (6.3.6) xm(q)= xm-1(p) - xm-1(q)WNk (6.3.7)
第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) 2018年12月1日 DSP原理及应用
148
在基数为2的FFT中,设N=2M,共有M级运算,每级有N/2个2点FFT蝶形运算,因此,N点FFT总共有(N/2)log2N个蝶形运算。
第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的蝶形运算。 2018年12月1日 DSP原理及应用
149
2.快速傅氏变换FFT 信号流程如图: 第6章 应用程序设计 x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7)
第6章 应用程序设计 2.快速傅氏变换FFT 信号流程如图: x(0) x(4) x(2) x(6) x(1) x(5) x(3) x(7) WN0 -1 WN2 WN1 WN3 2018年12月1日 DSP原理及应用
150
输入是经过比特反转的倒位序列——位码倒置。 排列顺序:x(0)、x(4)、x(2)、x(6)、x(1)、x(5)、x(3)、x(7)
第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) 2018年12月1日 DSP原理及应用
151
6.3 快速傅里叶变换(FFT)的DSP实现 6.3.2 FFT算法的DSP实现
第6章 应用程序设计 6.3 快速傅里叶变换(FFT)的DSP实现 6.3.2 FFT算法的DSP实现 下面以8~1024复数点FFT算法为例,介绍用DSP芯片实现的方法。 1.FFT运算序列的存储分配 FFT运算时间是衡量DSP芯片性能的一个重要指标,在用DSP芯片实现FFT算法时,合理地安排好所使用的存储空间是十分重要的。 2018年12月1日 DSP原理及应用
152
1.FFT运算序列的存储分配 (1) 程序空间的分配 第6章 应用程序设计 E000h~E1FFh:正弦系数表
第6章 应用程序设计 1.FFT运算序列的存储分配 程序存储器 ┇ sine1 E000 E1FF 正弦系数表 cosine1 E200 E3FF 余弦系数表 fft_prg E400┇ E4A2 程序代码 .vectors FF80┇ FFFF 复位向量和 中断向量表 (1) 程序空间的分配 E000h~E1FFh:正弦系数表 E200h~E3FFh:余弦系数表 E400h~E4A2h:程序代码 FF80h~FFFFh:复位向量和 中断向量表 2018年12月1日 DSP原理及应用
153
1.FFT运算序列的存储分配 (2) 数据空间的分配 第6章 应用程序设计 数据存储器 数据存储器 ┇ cosine 0800 09FF
第6章 应用程序设计 1.FFT运算序列的存储分配 数据存储器 ┇ cosine 0800 09FF 余弦系数表 d_input 8000 87FF 输入数据 fft_data 8800 8FFF FFT结果 (实部、虚部) fft_out 9000 93FF (功率谱) (2) 数据空间的分配 数据存储器 0000 ┇ 005F 存储映像 寄存器 .bss 0060 0061 0062 暂存单元 stack 0063 006C 堆 栈 sine 0400 05FF 正弦系数表 2018年12月1日 DSP原理及应用
154
1.FFT运算序列的存储分配 (3) I/O空间的配置 PA0——输出口; PA1——输入口。 第6章 应用程序设计 2018年12月1日
第6章 应用程序设计 1.FFT运算序列的存储分配 (3) I/O空间的配置 PA0——输出口; PA1——输入口。 2018年12月1日 DSP原理及应用
155
2.FFT运算的实现 用汇编程序实现FFT算法主要分为四步: (1) 实现输入数据的比特反转 (2) 实现N点复数FFT
第6章 应用程序设计 2.FFT运算的实现 用汇编程序实现FFT算法主要分为四步: (1) 实现输入数据的比特反转 (2) 实现N点复数FFT (3) 功率谱的计算 (4) 输出FFT结果 2018年12月1日 DSP原理及应用
156
输入数据的比特反转是将输入数据进行位码倒 置,以便在整个运算后的输出序列是一个自然序列。
第6章 应用程序设计 2.FFT运算的实现 (1) 实现输入数据的比特反转 输入数据的比特反转是将输入数据进行位码倒 置,以便在整个运算后的输出序列是一个自然序列。 在用汇编指令进行位码倒置时,使用位码倒置寻址可以大大提高程序执行速度和使用存储器的效率。 在这种寻址方式下,AR0存放的整数N是FFT点的一半,用一个辅助寄存器指向一个数据存放的单元。当AR0加到辅助寄存器时,地址将以位码倒置的方式产生。 2018年12月1日 DSP原理及应用
157
N点复数FFT算法的实现可分为三个功能块: 第一级蝶形运算 第二级蝶形运算 第三级至log2N级蝶形运算
第6章 应用程序设计 2.FFT运算的实现 (2) 实现N点复数FFT N点复数FFT算法的实现可分为三个功能块: 第一级蝶形运算 第二级蝶形运算 第三级至log2N级蝶形运算 对于任何一个2的整数幂N = 2M,N点复数FFT算法总可以通过M次分解成为2点的DFT计算。通过这样的M次分解,可构成M(即log2N)级迭代计算,每级由N/2个碟形运算组成。 2018年12月1日 DSP原理及应用
158
设蝶形的输入为xm-1(p)和xm-1(q),输出为xm(p)和xm(q),则有
第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为数据所在的行数。 为了避免运算结果的溢出,对每个蝶形的运算结果右移一位。 2018年12月1日 DSP原理及应用
159
FFT运算中的旋转因子WN是一个复数,可表示:
第6章 应用程序设计 (2) 实现N点复数FFT FFT运算中的旋转因子WN是一个复数,可表示: 为了实现旋转因子WN的运算,在存储空间分别建立正弦表和余弦表,每个表对应从0度到180度,采用循环寻址来对正弦表和余弦表进行寻址。 2018年12月1日 DSP原理及应用
160
X(k)是由实部XR(k)和虚部X I(k)组成的复数: X(k)=XR(k)+jX I(k)
第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)求它们的平方和,然后对平方和进行开平方运算。 2018年12月1日 DSP原理及应用
161
● rfft_task:主调用子程序,用来调用其他子程序,实现统一的接口。 ● bit_rev:位码倒置子程序,用来实现输入数据的比特反转。
第6章 应用程序设计 3.汇编语言程序 程序主体由四个子程序组成: ● rfft_task:主调用子程序,用来调用其他子程序,实现统一的接口。 ● bit_rev:位码倒置子程序,用来实现输入数据的比特反转。 ● fft:FFT算法子程序,用来完成N点FFT运算。分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至log2N级蝶形运算。 ● power:功率谱计算子程序。 2018年12月1日 DSP原理及应用
162
正弦和余弦系数表可以由数据文件coeff.inc给出,主程序通过.copy汇编命令将正弦和余弦系数表与程序代码汇编在一起。
第6章 应用程序设计 4.正弦系数表和余弦系数表 正弦和余弦系数表可以由数据文件coeff.inc给出,主程序通过.copy汇编命令将正弦和余弦系数表与程序代码汇编在一起。 数据文件coeff.inc给出1024复数点FFT的正弦、余弦系数各512个。利用此系数表可完成8~1024点FFT的运算。 2018年12月1日 DSP原理及应用
163
6.4 正弦波信号发生器 正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。
第6章 应用程序设计 6.4 正弦波信号发生器 正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。 通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。 查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。 泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。 本节主要介绍用泰勒级数展开法来实现正弦波信号。 2018年12月1日 DSP原理及应用
164
6.4 正弦波信号发生器 6.4.1 产生正弦波的算法 正弦函数和余弦函数可以展开成泰勒级数,其表达式: 第6章 应用程序设计
第6章 应用程序设计 6.4 正弦波信号发生器 6.4.1 产生正弦波的算法 正弦函数和余弦函数可以展开成泰勒级数,其表达式: 2018年12月1日 DSP原理及应用
165
6.4.1 产生正弦波的算法 取泰勒级数的前5项,得近似计算式: 第6章 应用程序设计 (6.4.3) (6.4.4) 2018年12月1日
第6章 应用程序设计 6.4.1 产生正弦波的算法 取泰勒级数的前5项,得近似计算式: (6.4.3) (6.4.4) 2018年12月1日 DSP原理及应用
166
sin(nx) = 2cos(x)sin[(n-1)x]-sin[(n-2)x]
第6章 应用程序设计 6.4.1 产生正弦波的算法 递推公式: sin(nx) = 2cos(x)sin[(n-1)x]-sin[(n-2)x] (6.4.3) cos(nx) = 2cos(x)sin[(n-1)x]-cos[(n-2)x] (6.4.4) 由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x)、sin(n-1)x、sin(n-2)x和cos(n-2)x。 2018年12月1日 DSP原理及应用
167
计算一个角度x的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现。
第6章 应用程序设计 1.计算一个角度的正弦值 计算一个角度x的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现。 在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。 程序中要用到一些存储单元存放数据和变量,存储单元的分配如下: d_xs:x; d_squr_xs: x2 d_temp_s:暂存; d_sinx:计算结果sinx c_1_s:7FFFh (数值1);d_coef_s :泰勒系数 2018年12月1日 DSP原理及应用
168
1.计算一个角度的正弦值 存储单元分配图: 第6章 应用程序设计 x x2 table_s sinx 7FFFH c1=01C7H
第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) 2018年12月1日 DSP原理及应用
169
1.计算一个角度的正弦值 第6章 应用程序设计 程序清单sinx.asm: .title “sinx.asm” .mmregs
第6章 应用程序设计 1.计算一个角度的正弦值 程序清单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 ;定义符号 ;建立堆栈 ;设置堆栈指针 ;设置页指针 ;x→d_xs ;调用子程序 2018年12月1日 DSP原理及应用
170
1.计算一个角度的正弦值 第6章 应用程序设计 程序清单sinx.asm: sin_start: .def sin_start
第6章 应用程序设计 1.计算一个角度的正弦值 程序清单sinx.asm: sin_start: .def sin_start d_coef_s .usect “coef_s”,4 .data table_s: .word 01C7H .word 030BH .word H .word H 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/(89) ;c2=1/(67) ;c3=1/(45) ;c4=1/(23) ;定义1个数据空间存放x ;定义1个数据空间存放x2 ;定义1个暂存单元 ;定义数据空间存放结果 ;定义数据空间存放数值1 2018年12月1日 DSP原理及应用
171
第6章 应用程序设计 程序清单sinx.asm: .text SSBX FRCT STM #d_coef_s,AR4 RPT #3
第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=TA= x2(1-x2/72) 2018年12月1日 DSP原理及应用
172
;(d_temp_s)=x2(1-x2/42(1-x2/72)) ;B=1 ;A=1-x2/20(1-x2/42(1-x2/72))
第6章 应用程序设计 STH A,*AR3 MASR *AR3-,*AR2+,B,A MPYA *AR3+ ST B,*AR3 || LD *AR5,B MASR *AR3-,*AR2,B,A 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=… ;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单元 ;子程序返回 2018年12月1日 DSP原理及应用
173
2.计算一个角度的余弦值 计算余弦值与计算正弦值相同。 存储单元分配图: 第6章 应用程序设计 x x2 table_c cosx
第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/(78) c2=1/(56) c3=1/(34) c4=1/2 2018年12月1日 DSP原理及应用
174
第一步:利用sin_start和cos_start子程序,计算0~45(间隔为0.5)的正弦和余弦值;
第6章 应用程序设计 3.正弦波的实现 实现步骤如下: 第一步:利用sin_start和cos_start子程序,计算0~45(间隔为0.5)的正弦和余弦值; 第二步:利用sin(2x)=2sin(x)cos(x)公式,计算0~90的正弦值(间隔为1); 第三步:通过复制,获得0~359的正弦值; 第四步:将0~359的正弦值重复从PA口输出,便可得到正弦波。 2018年12月1日 DSP原理及应用
175
3.正弦波的实现 第6章 应用程序设计 正弦波源程序清单sin.asm .title “sinx.asm” .mmregs
第6章 应用程序设计 3.正弦波的实现 正弦波源程序清单sin.asm .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 ;theta=pi/360(0.5deg) PA set 0 2018年12月1日 DSP原理及应用
176
第6章 应用程序设计 正弦波源程序清单sin.asm start: .text STM #STACK+10,SP STM #0,AR0
第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 STL ;主程序 ;设置堆栈 ;AR0=x=0 ;设置增量 ;AR7指向sin_x ;设置重复次数,计算sin0至sin90 ;取x值 ;设置页指针 ;将x值送入d_xs单元 ;将x值送入d_xc单元 2018年12月1日 DSP原理及应用
177
;完成sin(x)cos(x)运算,将结果存入B ;完成2sin(x)cos(x)运算, ;结果存入AR7指定单元 ;修改AR0
第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 ;完成2sin(x)cos(x)运算, ;结果存入AR7指定单元 ;修改AR0 2018年12月1日 DSP原理及应用
178
第6章 应用程序设计 正弦波源程序清单sin.asm loop1: STM #sin_x+89,AR6 STM #88,BRC
第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 ;AR6指向sin_x+89单元 ;设置重复次数,计算sin91至sin179 ;设置重复次数,计算sin180至sin359 ;AR6指向sin_x单元 2018年12月1日 DSP原理及应用
179
第6章 应用程序设计 正弦波源程序清单sin.asm loop3: STM #sin_x,AR7 STM #1,AR1
第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单元 ;设置缓冲区长度 ;输出正弦值 ;循环输出,产生正弦波 2018年12月1日 DSP原理及应用
180
PAGE0:EPROM: org = 0E000H,len=1000H VECS: org = 0FF80H,len=0080H
第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 } 2018年12月1日 DSP原理及应用
181
sin_vars :> DARAM1 PAGE1 coef_s :> DARAM1 PAGE1
第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 } 2018年12月1日 DSP原理及应用
Similar presentations