Circular Convolution as Linear Convolution with Aliasing is

  • Slides: 151
Download presentation

Circular Convolution as Linear Convolution with Aliasing is related to overlap-save method L+M-1 M

Circular Convolution as Linear Convolution with Aliasing is related to overlap-save method L+M-1 M L+M-1 L+2 M-2 N=L+M-1 圆周卷积有L个值与线性卷积值相同 M-1 L+M-1 12

P点 overlap-save method input (1) segment into sections of length L, overlap P-1 points;

P点 overlap-save method input (1) segment into sections of length L, overlap P-1 points; (2) fill 0 into and some section of P-1 , then do L points FFT points (3) calculate L P-1 points (4) the output for this section is L-(P-1) points of y[n] n=P-1, …L-1 L-(P-1) points 圆周卷积中后L-(P-1)个点结果与线性卷积相等 13 L=25 P-1 points

8. 1 卷积运算的DSP实现 3. 卷积C程序代码: , 0 ≤ j ≤ nr #define Frame 240

8. 1 卷积运算的DSP实现 3. 卷积C程序代码: , 0 ≤ j ≤ nr #define Frame 240 //输入数据长度nr #define Filter. Length 8 //滤波器长度nh for ( j = 0 ; j < (Frame-7) ; j ++ ) { for ( k = 0 ; k < Filter. Length ; k ++ ) Acc 0 = L_mac( Acc 0, Filter[k], Spnt[j+k] ) ; Spnt[j] = round( Acc 0) ; //小数 16位精度 } 注:L_mac:Acc 0=Filter*Spnt+Acc 0, Filter[k] 是滤波器的时间反转信号,Spnt[j] 是输入信号。 参见ITU-T G. 723. 1源代码文件BASOP. C,有L_mac等函数的定义。 24

8. 2. 1 FIR滤波器的结构与设计 4. FIR滤波器在C 54 x上的实现 1) 利用C 54 x自带的dsplib库函数实现 DSPLIB库提供了几个与FIR滤波直接有关的函数, 分别是:

8. 2. 1 FIR滤波器的结构与设计 4. FIR滤波器在C 54 x上的实现 1) 利用C 54 x自带的dsplib库函数实现 DSPLIB库提供了几个与FIR滤波直接有关的函数, 分别是: Øcfir DSPLIB库函数见TI网站压缩文件 TMS 320 C 54 x DSP Library- sprc 099 Øfirinterp Øfirs 2 Øfirlat : Lattice FIR filter implementation Øfirdec: Decimation filter with user specified FIR coefficients 山东大学生物医学 程刘忠国 54

(1) 线性缓冲区法 单值更新缓存法: 线性缓冲区法实现FIR滤波. title " fir 1. asm ". mmregs. def start X.

(1) 线性缓冲区法 单值更新缓存法: 线性缓冲区法实现FIR滤波. title " fir 1. asm ". mmregs. def start X. usect“x”, 8 ; 数据存储空间, 第一个输出, 其余输入 PA 0. set 0 ; 输出口地址 PA 1. set 1 ; 输入口地址 . data COEF: . word 1*32768/10 2*32768/10 -4*32768/10 3*32768/10 -4*32768/10 2*32768/10 1*32768/10 ; h 6=0. 1 ; h 5=0. 2 ; h 4=-0. 4 ; h 3=0. 3 ; h 2=-0. 4 ; h 1=0. 2 ; h 0=0. 1

(1) 线性缓冲区法 单值更新缓存法: . text start: SSBx FRCT; 小数乘法编程时,设置FRCT(小数方式)位 STM #x+7, AR 2 STM

(1) 线性缓冲区法 单值更新缓存法: . text start: SSBx FRCT; 小数乘法编程时,设置FRCT(小数方式)位 STM #x+7, AR 2 STM #6, AR 0 This instruction loads the upper LD #x+1, DP ; 9 bits of address x into DP (in PORTR PA 1, @x+1 ST 0) FIR 1: ; FIR滤波运算 RPTZ A, #6 ; 累加器 A清零, 设置迭代次数 MACD *AR 2 -, COEF, A ; 完成乘法-累加并移位 y (n ) 输出 y (n ) ; 暂存y(n) X : h(0) STH A, *AR 2 xx((nn)) x(n+ n) 1 h(1) PORTW *AR 2+, PA 0; 输出y(n) X +1: 输入 )x(n) X +2 : x ( n -1) FIR 1 ; 循环 h(2) BD X +3: x(n-2) x(n-1) PORTR PA 1, *AR 2+0 h(3) X +4: x(n-3) x(n-2) ; 输入最新样本, 并修改AR 2=AR 2+AR 0, 并指向缓冲区底部 h(4) X +5: x(n-4) x(n-3). END h(5) X +6: x(n-5) x(n-4) h(6) COEF AR 2 X +7: x(n-6) x(n-5) 59

线性缓冲区法实现FIR滤波(按教材标号). title " fir 1. asm ". mmregs. def start output. usect “y”, 1;

线性缓冲区法实现FIR滤波(按教材标号). title " fir 1. asm ". mmregs. def start output. usect “y”, 1; 定义输出数据存储空间 input . usect “x”, 7; 定义输入数据存储空间 PA 0. set 0 ; 输出口地址 PA 1. set 1 ; 输入口地址 COEF: . data. word 1*32768/10 2*32768/10 -4*32768/10 3*32768/10 -4*32768/10 2*32768/10 1*32768/10 ; h 6=0. 1 ; h 5=0. 2 ; h 4=-0. 4 ; h 3=0. 3 ; h 2=-0. 4 ; h 1=0. 2 ; h 0=0. 1 山东大学生物医学 程刘忠国 60

. text start: SSBx FRCT; 小数乘法编程时,设置FRCT(小数方式)位 STM #output+7, AR 2; 输入数据缓冲区最老数据地址 STM #6, AR

. text start: SSBx FRCT; 小数乘法编程时,设置FRCT(小数方式)位 STM #output+7, AR 2; 输入数据缓冲区最老数据地址 STM #6, AR 0 ; 从input到缓冲区底部偏移量 This instruction loads the upper LD #output+1, DP; 9 bits of address x into DP (in PORTR PA 1, @output+1 ST 0) FIR 1: ; FIR滤波运算 RPTZ A, #6 ; 累加器 A清零, 设置迭代次数 MACD *AR 2 -, COEF, A ; 完成乘法-累加并移位 X: y (n ) ; 暂存y(n) h(0) STH A, *AR 2 X +1 : x ( n ) x(n+1 h(1) PORTW *AR 2+ , PA 0 ; 输出y(n) ) X +2 : x ( n -1) FIR 1 ; 循环 h(2) BD X +3 +2: : xx((n n-2) -1) x(n) X X +4 +3: : xx((n n-3) -2) x(n-1) h(3) PORTR PA 1, *AR 2+0 X X +4 : x ( n -3) x ( n -2) h(4); 输入最新样本,并修改AR 2=AR 2+AR 0, 并指向缓冲区底部 X +5 : : xx((n -4) X +5 n -4) x(n-3) h(5). END X +6 : x ( n -5) X换成output X +6 : x ( n -5) x ( n -4) h(6) COEF AR 2 X +7: x(n-6) 61 山东大学生物医学 程刘忠国 X +7: x(n-6) x(n-5)

循环缓冲区法实现FIR 滤波器. title " fir 2. asm ". mmregs. def start. bss y, 1

循环缓冲区法实现FIR 滤波器. title " fir 2. asm ". mmregs. def start. bss y, 1 ; 定义输出数据暂存空间 Xn. usect “xn”, 7 ; 定义输入数据存储空间 h 0. usect “h 0”, 7 ; 定义滤波器系数存储空间 PA 0. set 0 ; 输出口地址 PA 1. set 1 ; 输入口地址 . data Table: . word 1*32768/10 2*32768/10 3*32768/10 4*32768/10 5*32768/10 6*32768/10 7*32768/10 ; h 0=0. 1 ; h 1=0. 2 ; h 2=0. 3 ; h 3=0. 4 ; h 4=0. 5 ; h 5=0. 6 ; h 6=0. 7 67

. text start: SSBx FRCT; 小数乘法编程时,设置FRCT(小数方式)位 STM #h 0, AR 1 RPT #6 MVPD

. text start: SSBx FRCT; 小数乘法编程时,设置FRCT(小数方式)位 STM #h 0, AR 1 RPT #6 MVPD table, *AR 1+ ; 滤波系数从程序存储器到数存 STM #xn+6, AR 2 乘累加从底部数据开始, STM #h 0+6, AR 3 便于存储单元延迟 STM #7, BK STM #-1, AR 0 LD #xn, DP AR 1 PORTR PA 1, @xn 新缓冲区 FIR 2: ; FIR滤波运算 Xy: : yy((nn)) RPTZ A, #6 h(0) TABLE h(0) h 0 Xn : : x(xn()n) x(n) X +1 MAC *AR 2+0%, *AR 3+0%, A h(1) X +2: : xx((nn-1) Xn+1 -1) x(n-1) STH A, @y h(2) Xn+2 -2) x(n-2) X +3: : xx((nn-2) PORTW @y, PA 0 h(3) X +4: : xx((nn-3) Xn+3 -3) x(n-3) BD FIR 2 h(4) X +5: : xx((nn-4) Xn+4 -4) x(n-4) PORTR PA 1, *AR 2+0% ; h(5) X +6: : xx((nn-5) Xn+5 -5) x(n-5). END; 用最新样本替代最老样本 h(6) 山东大学生物医学 程刘忠国 h(6) AR 3 AR 2 Xn+6 X +7: : xx((nn-6) x(n+1 68

8. 2. 1 FIR滤波器的结构与设计 . mmregs x_new . def begin x_old . bss y,

8. 2. 1 FIR滤波器的结构与设计 . mmregs x_new . def begin x_old . bss y, 1 x(n) AR 3 x(n-4) x_new: . usect ″DATA 1″, 4 x(n-5) x(n-3) x_old: . usect ″DATA 2″, 4 size . set 4 x(n-2) x(n-6) PA 0 . set 0 ; 输出口地址 x(n-1) x(n-7) AR 4 PA 1 . set 1 ; 输出口地址 . data COEF . word 1*32768/10; . word 2*32768/10; . word 3*32768/10; . word 4*32768/10; 80 . text

x_new x_old begin: x(n) AR 3 x(n-4) LD #x_new, DP 5 4 SSBX FRCT

x_new x_old begin: x(n) AR 3 x(n-4) LD #x_new, DP 5 4 SSBX FRCT x(n-5) x(n-3) + STM #x_new, AR 3 ; AR 3指向新缓冲区第一个单元 x(n-6) AR 4 x(n-2) 3 STM #x_old+(size-1), AR 4 ; AR 4指向老缓冲区最后1个单元 STM #size, BK ; 循环缓冲区长度x(n-1) 2 1 x(n-7) AR 4 AR 3 STM #-1, AR 0 PORTR PA 1, #x_new ; 输入x[n] FIR: ADD *AR 3+0%, *AR 4+0%, A ; AH=x[n]+x[n-7] (第一次) RPTZ B, #(size-1) ; 让B=0, 下条指令执行size(4)次 FIRS *AR 3+0%, *AR 4+0%, COEF ; B=B+AH * h 0, ; AH=x[n-1]+x[n-6], (RC)-1→RC, (PAR+1)→PAR STH B, @y ; 保存结果 ;以上程序执行完毕后,AR 3和AR 4指向位置如图 81

8. 2 数字滤波器的DSP实现 8. 2. 2 FIR滤波器在C 54 x上的实现举例 目标:设计一个 15阶FIR低通滤波器,截止频率0. 6 b =

8. 2 数字滤波器的DSP实现 8. 2. 2 FIR滤波器在C 54 x上的实现举例 目标:设计一个 15阶FIR低通滤波器,截止频率0. 6 b = 0. 0033 -0. 0018 -0. 0106 0. 0226 0. 0162 ① 用MATLAB编程得出滤波器系数; -0. 0977 0. 0601 0. 5096 0. 0601 f = [0 0. 6 1]; %书中f = [0 0. 1 0. 2 1] 对应截止频率约 0. 15 -0. 0977 0. 0162 0. 0226 -0. 0106 -0. 0018 m = [1 1 0 0]; 0. 0033 b=fir 2(15, f, m) freqz(b, 1, 1000) 或者用 Matlab 中的Filter Design and Analysis Tool (FDATool)设计滤波器 山东大学生物医学 程刘忠国 86

8. 2. 2 FIR滤波器在C 54 x上的实现举例 目标:设计一个 15阶FIR低通滤波器,截止频率0. 15 b = -0. 0009 0.

8. 2. 2 FIR滤波器在C 54 x上的实现举例 目标:设计一个 15阶FIR低通滤波器,截止频率0. 15 b = -0. 0009 0. 0005 0. 0065 0. 0224 0. 0509 ① 用MATLAB编程得出滤波器系数; 0. 0879 0. 1235 0. 1455 0. 1235 f = [0 0. 1 0. 2 1]; %书中f = [0 0. 1 0. 2 1] 截止频率约 0. 15 0. 0879 0. 0509 0. 0224 0. 0065 0. 0005 m = [1 1 0 0]; -0. 0009 b=fir 2(15, f, m) freqz(b, 512, 1000) 或者用 Matlab 中的Filter Design and Analysis Tool (FDATool)设计滤波器 山东大学生物医学 程刘忠国 88

8. 2. 2 FIR滤波器在C 54 x上的实现举例 b) 建立汇编源文件fir. asm, 15阶FIR低通滤波器 . mmregs CIR_BFFR_LENGTH .

8. 2. 2 FIR滤波器在C 54 x上的实现举例 b) 建立汇编源文件fir. asm, 15阶FIR低通滤波器 . mmregs CIR_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 879*32768/10000 . word 224*32768/10000 . word 509*32768/10000 . word 224*32768/10000 . word 879*32768/10000 . word 1235*32768/10000 . word 65*32768/10000 . word 1455*32768/10000 . word -9*32768/10000 . word 1235*32768/10000 FIR_COFF_END 90

b) 建立汇编源程序及链接命令文件fir. cmd(续) MEMORY { PAGE 0: EPROG: org=0 x 1400, len=0 x 7

b) 建立汇编源程序及链接命令文件fir. cmd(续) MEMORY { PAGE 0: EPROG: org=0 x 1400, len=0 x 7 C 00 VECT: org=0 x. FF 80, len=0 x 80 PAGE 1: USERREGS: org=0 x 0060, len=0 x 1 C /*没有用*/ IDATA: org=0 x 0080, len=0 x 50 IDATA 1: org=0 x 0180, len=0 x 1280 EDATA: org=0 x 1400, len=0 x 8000 } SECTIONS {. text : > EPROG PAGE 0 . fir_prog : > EPROG PAGE 0 vectors : > VECT PAGE 0 fir_coff : > EPROG PAGE 0 fir_bfr : > IDATA 1 PAGE 1 fir_vars : > IDATA 1 PAGE 1 STACK : > EDATA PAGE 1 97 }

Direct Form II w[n] b 0 a 1 z 1 b 1 a 2

Direct Form II w[n] b 0 a 1 z 1 b 1 a 2 z 1 b 2 x[n] b. N-1 a. N y[n] z 1 b. N 山东大学生物医学 程刘忠国 114

Cascade Form 2 nd Order System 山东大学生物医学 程刘忠国 2 nd Order System 116

Cascade Form 2 nd Order System 山东大学生物医学 程刘忠国 2 nd Order System 116

Cascade Form Assume Ns=3 1 x[n] 2 3 b 01 b 02 b 03

Cascade Form Assume Ns=3 1 x[n] 2 3 b 01 b 02 b 03 a 11 z 1 b 11 a 12 z 1 b 12 a 13 z 1 b 13 a 21 z 1 b 21 a 22 z 1 b 22 a 23 z 1 b 23 山东大学生物医学 程刘忠国 y[n] 117

二阶IIR滤波器的C 54 x实现程序 . data K_SIZE . set 256 ; 执行256次滤波 ; 二阶IIR滤波器系数, 截止频率2000

二阶IIR滤波器的C 54 x实现程序 . data K_SIZE . set 256 ; 执行256次滤波 ; 二阶IIR滤波器系数, 截止频率2000 Hz, 采样频率20000 Hz iir_table. word 3695*32768/10000 ; a 1=-0. 3695 . word -1958*32768/10000 ; a 2=0. 1958 . word 2066*32768/10000 ; b 0=0. 2066 . word 4132*32768/10000 ; b 1=0. 4134 . word 2066*32768/10000 ; b 2=0. 2066 WDATA . usect "COEF", 8 ; 中间结果w(n)循环缓冲区 COEF . usect “COEF”, 8 ; a 1, a 2, b 0, b 1, b 2系数 input . usect "COEF", 256 ; 输入缓冲区 output . usect "COEF", 256 ; 输出缓冲区 . def Start 山东大学生物医学 程刘忠国 143

二阶IIR滤波器的C 54 x实现程序 . text Start: SSBX FRCT STM #input, AR 6 ; 输入缓冲区首址存AR

二阶IIR滤波器的C 54 x实现程序 . text Start: SSBX FRCT STM #input, AR 6 ; 输入缓冲区首址存AR 6 STM #output, AR 7 ; 输出缓冲区首址存AR 7 STM #WDATA, AR 2 ; 存w(n)循环缓冲区首址 STM #COEF, AR 1 ; 存IIR系数缓冲区首址 MVMM AR 1, AR 3 ; IIR系数缓冲区首址存AR 3 RPT #4 MVPD #iir_table, *AR 3+ ; IIR系数转存data区 MVMM AR 1, AR 3 STM #3, BK ; w(n)循环缓冲区长度 3 STM #1, AR 0 ; w(n)循环缓冲区访问步长, 1与图匹配 STM #K_SIZE-1, BRC ; 执行256次滤波 RPTB MAINLOOP-1 144 山东大学生物医学 程刘忠国

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

二阶IIR滤波器的C 54 x实现程序 RPTB MAINLOOP-1 LD *AR 6+, 13, A ; 输入值调整, 适当放大,否则输入太小,可能没有输出 Feedback: MAC *AR 2+0%, *AR 3+, A ; A=输入+a 1 w(n-1)+a 2 w(n-2) STH A, *AR 2 ; 存w(n)=输入+a 1 w(n-1)+a 2 w(n-2) Forward: MPY *AR 2+0%, *AR 3+, A ; A=b 0 w(n) MAC *AR 2+0%, *AR 3+, A ; A=b 0 w(n)+b 1 w(n-1)+b 2 w(n-2) STH A, *AR 7+ ; 存y(n)=A=b 0 w(n)+b 1 w(n-1)+b 2 w(n-2) MVMM AR 1, AR 3 下个循环是n+1时刻, 用w(n+1), w(n) , w(n-1) MAINLOOP: B MAINLOOP 145 . end 山东大学生物医学 程刘忠国

四阶IIR滤波器的C 54 x实现程序 . data K_SIZE . set 200; 执行200次滤波 四阶IIR滤波器系数, 截止频率2000 Hz, 采样频率20000

四阶IIR滤波器的C 54 x实现程序 . data K_SIZE . set 200; 执行200次滤波 四阶IIR滤波器系数, 截止频率2000 Hz, 采样频率20000 Hz ; 第一个二阶节系数 iir_table. word -4663*32768/10000 ; A 2=0. 4663 . word 4531*32768/10000 ; A 1=-0. 4531 . word 2533*32768/10000 ; B 2=0. 2533 . word 5066*32768/10000 ; B 1=0. 5066 . word 2533*32768/10000 ; B 0=0. 2533 ; 第二个二阶节系数 . word -646*32768/10000 ; A 2=0. 0646 . word 3290*32768/10000 ; A 1=-0. 3290 . word 1939*32768/10000 ; B 2=0. 1839 . word 3678*32768/10000 ; B 1=0. 3678 . word 1839*32768/10000 ; B 0=0. 1839 147 山东大学生物医学 程刘忠国

四阶IIR滤波器的C 54 x实现程序 STM #K_SIZE-1, BRC ; 执行200次滤波 RPTB MAINLOOP-1 LD *AR 6+, 3,

四阶IIR滤波器的C 54 x实现程序 STM #K_SIZE-1, BRC ; 执行200次滤波 RPTB MAINLOOP-1 LD *AR 6+, 3, A ; 输入值调整, 适当放大 STM #COEF 1, AR 3 ; 存IIR系数缓冲区首址 CALL IIR_CIRCLE 1 STM #COEF 2, AR 3 ; 存IIR系数缓冲区首址 CALL IIR_CIRCLE 2 STH A, *AR 7+ ; 存第二个二阶节即四阶输出 ; y(n)=b 0 w(n)+b 1 w(n-1)+b 2 w(n-2) MAINLOOP: B MAINLOOP 山东大学生物医学 程刘忠国 150

四阶IIR滤波器的C 54 x实现程序 IIR_CIRCLE 1: MAC *AR 2+0%, *AR 3+, A ; A=输入+a 1

四阶IIR滤波器的C 54 x实现程序 IIR_CIRCLE 1: MAC *AR 2+0%, *AR 3+, A ; A=输入+a 1 w(n-1)+a 2 w(n-2) STH A, *AR 2 ; 存w(n)=输入+a 1 w(n-1)+a 2 w(n-2) Forward: MPY *AR 2+0%, *AR 3+, A ; A=b 0 w(n) MAC *AR 2+0%, *AR 3+, A ; A=b 0 w(n)+b 1 w(n-1)+b 2 w(n-2) RET 山东大学生物医学 程刘忠国 151

四阶IIR滤波器的C 54 x实现程序 IIR_CIRCLE 2: MAC *AR 4+0%, *AR 3+, A ; A=输入+a 1

四阶IIR滤波器的C 54 x实现程序 IIR_CIRCLE 2: MAC *AR 4+0%, *AR 3+, A ; A=输入+a 1 w(n-1)+a 2 w(n-2) STH A, *AR 4 ; 存w(n)=输入+a 1 w(n-1)+a 2 w(n-2) Forward: MPY *AR 4+0%, *AR 3+, A ; A=b 0 w(n) MAC *AR 4+0%, *AR 3+, A ; A=b 0 w(n)+b 1 w(n-1)+b 2 w(n-2) RET 山东大学生物医学 程刘忠国 152