1.25k likes | 1.57k Views
第 8 章 数字信号处理典型算法程序设计. 本章将要讲解通信与信号处理中常见的下列几种具有代表性的算法在 C54x 芯片中的具体实现方法: 卷积 有限冲激响应 (FIR) 数字滤波器 无限冲激响应 (IIR) 数字滤波器 快速傅立叶变换 (FFT). 第 8 章 数字信号处理典型算法程序设计. 目录: 8.1 卷积运算的 DSP 实现 8.2 数字滤波器的 DSP 实现 8.3 IIR 滤波器的 DSP 实现 8.4 快速傅立叶变换的 DSP 实现. 第 8 章 数字信号处理典型算法程序设计. 8.1 卷积运算的 DSP 实现.
E N D
第8章 数字信号处理典型算法程序设计 • 本章将要讲解通信与信号处理中常见的下列几种具有代表性的算法在C54x芯片中的具体实现方法: • 卷积 • 有限冲激响应(FIR)数字滤波器 • 无限冲激响应(IIR)数字滤波器 • 快速傅立叶变换(FFT)
第8章 数字信号处理典型算法程序设计 • 目录: • 8.1 卷积运算的DSP实现 • 8.2 数字滤波器的DSP实现 • 8.3 IIR滤波器的DSP实现 • 8.4快速傅立叶变换的DSP实现
第8章 数字信号处理典型算法程序设计 8.1 卷积运算的DSP实现 数字卷积运算通常采用两种方法: • 线性卷积 • 圆卷积
第8章 数字信号处理典型算法程序设计 8.1.1信号的卷积 函数f(t)与h(t)的卷积积分,用符号“﹡”表示,即: 读作f(t)与h(t)的卷积积分,简称卷积。
第8章 数字信号处理典型算法程序设计 8.1.2 离散系统的卷积分析 1.离散时间信号的时域分解 根据单位序列 及单位移位序列 的选择性, 可将任意序列f(k)用单位序列及其移位序列表示,即:
3 2 1 第8章 数字信号处理典型算法程序设计 例:如图所示离散时间序列,可表示为: 0 1 2 3
第8章 数字信号处理典型算法程序设计 2.离散系统的卷积计算过程 设两个离散时间信号为 ,定义 与 和 的卷积和运算为: 与卷积积分一样,离散卷积也可通过图解法来计算,分为反折、平移、相乘、取和等过程。
第8章 数字信号处理典型算法程序设计 3.卷积的计算 在实际应用中,参与卷积运算的两个序列长度往往差距较大,比如我们要实时的对一长序列语音信号进行“过滤”处理,可以采用有限冲激相应序列与该语音信号进行卷积的方法来实现。 比如:重叠保留法
第8章 数字信号处理典型算法程序设计 8.1.3.重叠保留法卷积运算在C54x上的实现 1.利用C54x自带的dsplib库函数实现 TI公司提供了以C54x系列芯片为基础的DSPLIB库函数,在CCS开发系统内包含DSPLIB库函数。 这些库函数均为经过优化处理的符合C语言标准的函数。
第8章 数字信号处理典型算法程序设计 DSPLIB库提供了一个直接进行线性卷积运算的函数,形式如下: oflag = short convol (DATA *x, DATA *h, DATA *r, ushort nr, ushort nh) 其中x,h为输入数组,即进行卷积的两序列,r为输出数组。
第8章 数字信号处理典型算法程序设计 其算法为: 0 <=j <=nr 通常我们将分段后的待滤波数据放于X数组中,而将滤波器冲激响应序列放于h数组。按前述方法,x长度为L+M-1,h长度为M,则nr应为L+M-1。计算得到结果后,舍弃r的前M-1个值。
第8章 数字信号处理典型算法程序设计 其算法为: ,0 <=j <=nr C程序代码为: #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.pdf
第8章 数字信号处理典型算法程序设计 2.汇编语言设计 C54x指令集内提供了单周期乘累加指令MAC和循环寻址方式,使每个样值的乘累加计算可以在一个周期内完成。 卷积运算就是实现两组数对应项乘积的累加和。可采用RPTZ和MAC指令,结合循环寻址方式去方便地实现这一运算: RPTZ 累加器,N-1 MAC (双访问数据),(双访问数据),累加器
第8章 数字信号处理典型算法程序设计 其中,RPTZ 指令将累加器清零初始化,并将立即数N-1(16位)装入到重复计数器,使下一条指令重复执行N次。 MAC指令实现将两存储区数据的乘积累加到累加器,再通过存储区指针以循环寻址的方式指向下一个存储区。
第8章 数字信号处理典型算法程序设计 程序设计的要点简要分析如下: • 为了能高效的利用DSP流水线,待卷积的两组数据都应存放在DARAM中 • 如果使用双操作数指令,辅助寄存器只能用 AR2~AR5,在此我们选择AR3和AR4作为双操作数寻址辅助寄存器 • 汇编语言的代码设计要充分考虑到资源的优化等
重叠保留法卷积运算算法程序 在此经常使用一种零长度循环缓冲区,循环体对应的汇编程序如下: (修改书中的红色部分) .bss x,239 .bss y,233 .bss h,8 BEGIN STM # 233,BRC STM # x,AR1 STM # x,AR3 STM # h,AR4 STM # y,AR5 STM # -7, AR0 ; loop starts RPTB next-1
第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 STL A, * AR5+ LD #0,A ;上面第一行有了,这里不需要了 ; loop ends next:
第8章 数字信号处理典型算法程序设计 8.2 数字滤波器的DSP实现 用DSP芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好的特点。 本节主要介绍FIR和IIR滤波器DSP实现方法。 首先简要介绍滤波器的基本原理、结构和设计方法,然后通过实例介绍滤波器设计在C54x上的实现方法。
第8章 数字信号处理典型算法程序设计 8.2.1 FIR滤波器的结构与设计 1.FIR滤波器的结构 一般时域离散系统或网络的描述方式: • 差分方程 • 单位脉冲响应 • 系统函数进行描述。
第8章 数字信号处理典型算法程序设计 如果系统输入、输出服从N阶差分方程: 则其系统函数,即滤波器的传递函数为:
第8章 数字信号处理典型算法程序设计 若所有的 均为零,则有: 相应的传递函数为:
第8章 数字信号处理典型算法程序设计 据上两式可直接画FIR滤波器的直接型结构: FIR滤波器的直接型结构又称为卷积型结构,有时也称为横截型结构。
第8章 数字信号处理典型算法程序设计 FIR滤波器主要具有如下几个特点: • 可以在幅度特性随意设计的同时,保证精确、严格的线性相位 • FIR滤波器的单位脉冲响应是有限长序列,因此FIR滤波器系统总是稳定的
第8章 数字信号处理典型算法程序设计 • 由于FIR滤波器一般为非递归结构,在有限精度运算中,不会出现像递归机构的滤波器那样的极限震荡等不稳定现象,误差较小 • FIR滤波器可采用FFT算法实现,从而提高运算效率
第8章 数字信号处理典型算法程序设计 2. FIR滤波器的设计方法 中,系数 (k=1~M)形成的序列 就是单位冲激响应序列,滤波器设计的目标就是 找到合适的序列 (k=1~M)。 方法1:傅立叶级数法 是以 为周期的周期函数,所以可展开为傅 立叶级数,即:
第8章 数字信号处理典型算法程序设计 这里我们用 表示归一化频率,即 ,则有: 可由下式求得:
第8章 数字信号处理典型算法程序设计 通常 为偶函数,这时: 且 。 因为FIR的系数为有限个,因此需将上式中的系数进行截取,到近似的传递函数为: 式中Q为有限的正整数。
第8章 数字信号处理典型算法程序设计 令 , 则有: 上式即为所求系统的Z域传递函数。近似传递函数的冲激响应是由系数决定。
第8章 数字信号处理典型算法程序设计 方法2:窗函数法设计FIR 窗函数法的思路是寻找一有限长序列 逼近理想的滤波器脉冲响应 。 是对 做截 取处理。 用一个有限长度的窗函数序列 来截取 ,即:
第8章 数字信号处理典型算法程序设计 利用 ,就可得到一近似的传递函数: 如令 ,则有:
第8章 数字信号处理典型算法程序设计 同样,为使式8-17具有因果性,需延迟Q个样值,可得: 令 上式成为:
第8章 数字信号处理典型算法程序设计 再令 , ,得到: 设计FIR滤波器时,加窗是一个重要的计算步骤。采用矩形窗函数是简单并且直接的方法。而在实际设计中,一般采用其他窗函数,比较常用的窗函数有Hanning、Hamming、Blackman、Kaiser窗等。
第8章 数字信号处理典型算法程序设计 FIR滤波器分为低通滤波、高通滤波、带通滤波和带阻滤波。 下面给出各种滤波器具体的设计方法: 1)低通滤波器的设计
第8章 数字信号处理典型算法程序设计 2)高通滤波器的设计 高通滤波器可以由一个幅度为1的响应减去一个低通滤波的响应来获得。 (n)函数的表达式为: 高通滤波器的系数可由下式计算得到:
第8章 数字信号处理典型算法程序设计 3) 带通滤波器的设计 带通滤波器可以由两个截止频率不同的低通滤波器获得,其系数等于两个低通滤波器的系数之差。 fc1和fc2为低通滤波器的截止频率,fs为采样频率。
第8章 数字信号处理典型算法程序设计 4) 带阻滤波器的设计 带阻滤波器可由(n)和带通滤波器相减获得,其系数可以由一个幅度为1的响应减去一个带通滤波的响应来获得。
第8章 数字信号处理典型算法程序设计 3.FIR滤波器的设计工具 在MATLAB中,提供了两种FIR滤波器设计方法: • 一种是标准通带滤波器的设计FIR1 • 一种是多带FIR滤波器的设计FIR2
第8章 数字信号处理典型算法程序设计 函数FIR1:只能设计标准的低通、高通、带通和带 阻线性相位FIR滤波器。 函数FIR2:还可设计加窗的FIR滤波器,但它针 对任意形状的分段线性频率相应,这一点在FIR1 中是受到限制的。
第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)
第8章 数字信号处理典型算法程序设计 n:滤波器的阶数; Wn:滤波器的截止频率; ftype:用来决定滤波器的类型: 当ftype=high时,可设计高通滤波器; 当ftype=stop时,可设计带阻滤波器。 Window:用来指定滤波器采用的窗函数类型,其默认值为汉明(Hamming)窗。
第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')
第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’)
第8章 数字信号处理典型算法程序设计 在上述滤波器设计中,Window参数可采用的窗口函数有: • Boxcar • Hanning • Bartlett • Blackman • Kasier • chebwin等 默认的窗函数为汉明(Hamming)窗。
第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)
第8章 数字信号处理典型算法程序设计 n:滤波器的阶数; f:频率点矢量,且f[0,1],f=1对应于0.5fs。矢量f按升序排列,并且第一个元素必须为0,最后一个元素必须为1,并可以包含重复的频率点; m:参数m为幅度点矢量,在矢量m中包含了与f相对应的期望得到的滤波器幅度;
第8章 数字信号处理典型算法程序设计 Window:用来指定所使用的窗函数类型,其默认值为汉明(Hamming)窗; Npt:用来指定fir2函数对频率响应进行内插的点数; Lap:用来指定fir2函数在重复频率点附近插入的区域大小。
第8章 数字信号处理典型算法程序设计 4. FIR滤波器在C54x上的实现 1) 利用C54x自带的dsplib库函数实现 DSPLIB库提供了几个与FIR滤波直接有关的函数,分别是: • cfir • fir • firdec • firinterp • firs • firs2 • firlat
第8章 数字信号处理典型算法程序设计 2) FIR滤波运算的汇编语言程序设计 采用汇编的方法主要有: 单值更新缓存法 • 线性缓冲区法 • 循环缓冲区法 区域更新缓存法
第8章 数字信号处理典型算法程序设计 (1) 线性缓冲区法 单值更新缓存法: 具体实现步骤如下: (1)在数据存储器中开辟一个N单元的缓冲区,用来存放最新的N个输入样本; (2)从最老样本开始取数,每取一个数后,样本向下移位; (3)读完最后一个样本后,输入最新样本并存入缓冲区的顶部。
线性缓冲区法实现FIR滤波 .title " fir1.asm " .mmregs .def start X .usect“x”,8 ;定义数据存储空间 PA0 .set 0 PA1 .set 1