3 FIR滤波器设计
3.1 FIR滤波器的Matlab设计
FIR结构中的延迟Z-1 在程序中实现是数据在存储器中的滑动,这对一个L阶的FIR数字滤波器来说,就是要求在存储器中开辟一个L个样本并进行乘累加运算。这在DSP中可以用两种方法来实现该缓冲区。对于线性缓冲区来说,每当DSP读入一个样本后都将此样本向后移动,读完最后一个样本后,最前面的样本(最老的)被推出缓冲区,并输入最新的样本至缓冲区顶部。线性缓冲区的存储器延时可以由具有数据移动的DMOV指令来实现,它需要将缓冲区置于内部DARAM块中;对于循环缓冲区,每当输入新样本时,以新样本改写区中最老的样本,而缓冲区中的其他样本不需要其他样本移动。循环缓冲区可采用循环寻址技术来实现,它不需要必须定位在DARAM块中,但需要适当的缓冲区对准以满足循环寻址的要求。本次课设用的是循环寻址,下面主要介绍一下循环寻址的方法。
3.1.1 FIR滤波器参数的设计
FIR滤波器的参数用Matlab来设计,其程序为:
>> N=15; %滤波器的阶数
Wn=0.1 %滤波器的截止频率
b=fir1(N,Wn)
freqz(b,512,1000) %滤波器的幅频特性和相频特性
Wn =
0.1000
b =
Columns 1 through 9
0.0034 0.0074 0.0188 0.0395 0.0677 0.0984 0.1248 0.1400 0.1400
Columns 10 through 16
0.1248 0.0984 0.0677 0.0395 0.0188 0.0074 0.0034
滤波器的幅频特性和相频特性如图3-1和图3-2所示。
将1000个点的复频响应值均匀分布在0-2π上,便得到所设计的FIR低通滤波器的幅值特性如上图。
3.1.2 检验方波的Matlab设计
检验方波的Matlab程序为:
figure(4)
x=0:2*pi/1024:2*pi;
x1=2*square(1*pi*10*x);
x2=conv(x1,b);
subplot(2,1,1);
plot(x1);
axis([0 50*pi -3 3]);
grid on;
subplot(2,1,2);
plot(x2);
axis([0 50*pi -3 3]);
grid on;
由图可知,经低通滤波后方波信号变为等峰峰值为和周期的正弦信号。
3.1.3 正弦叠加信号的Matlab设计
正弦叠加信号的Matlab程序为:
>> figure(3)
x=0:2*pi/1024:2*pi;
y1=sin(1*x*2*pi+pi/6);
y2=sin(100*x*2*pi);
y3=y1+y2;
y4=conv(y3,b);
subplot(4,1,1);
plot(y1);
subplot(4,1,2);
plot(y2);
subplot(4,1,3);
plot(y3);
subplot(4,1,4);
plot(y4);
输出正弦叠加信号的波形如图3-5所示
上图由上向下,第一个图是低频正弦波,第二个图是高频正弦波,第三个图是低频与高频的叠加,最后一个是叠加后的正弦波经低通滤波器后出现的波形,基本与低频正弦信号相同。
3.2 FIR滤波器的CCS设计
根据Matlab中设计的滤波器参数,也就是我么需要的H(n),将它们用Q15的定标方式写进汇编程序。程序编写完成后,加载Matlab中生成的*.dat文件,就可以得到滤波之后的图像。这里同样以方波和正弦波进行检验。
其中生成方波的*.dat文件程序如下
x=0:2*pi/1024:2*pi;
x1=2*square(2*pi*x);
plot(x1);
axis([0,1000,-4,4]);
xlout=x1/max(x1);
x1t0_ccs=round(32767*xlout);
fid=fopen('square.dat','w');
fprintf(fid,'1651 1 0210 0 c8\n');
fprintf(fid,'%d\n',x1t0_ccs);
fclose(fid)
生成正弦波的*.dat文件程序如下
figure(3)
x=0:2*pi/1024:2*pi;
y1=sin(1*x*2*pi+pi/6);
y2=sin(100*x*2*pi);
y3=y1+y2;
plot(y3);
xout=y3/max(y3); %归一化
xto_ccs=round(32767*xout)
fid=fopen('sin.dat','w'); %打开文件
fprintf(fid,'1651 1 0210 0 c8\n'); %输出文件头
fprintf(fid,'%d\n',xto_ccs); %输出
fclose(fid);
3.2.1 FIR滤波器的CCS设计程序
FIR滤波器的设计流程图如下
根据上图编写程序
主程序fir.asm如下
.title "fir.asm"
.mmregs
.global _c_int00
Hn: .usect "Hn" , 16
BUF: .usect "BUF", 16
Xn: .usect "Xn", 200
nop
Yn: .usect "Yn", 240
.data
TABLE: .word 34*32768/10000, 74*32768/10000,188*32768/10000, 395*32768/10000
.word 677*32768/10000, 984*32768/10000, 1248*32768/10000, 1400*32768/10000
.word 1400*32768/10000, 1248*32768/10000, 984*32768/10000, 677*32768/10000
.word 395*32768/10000, 188*32768/10000, 74*32768/10000, 34*32768/10000
.text
_c_int00: SSBX FRCT
STM #Hn,AR5 ;AR5指向冲激响应
RPT #15
MVPD TABLE,*AR5+
STM #BUF,AR4 ;AR4指向缓冲区间
RPTZ A,#15
STL A,*AR4+
STM #Xn,AR3 ;AR3指向输入
STM #Yn,AR2 ;AR4指向输出
STM #(Hn+15),AR5 ;
STM #(BUF+15),AR4
STM -1,AR0
LD #BUF,DP
MVDD *AR3+,*AR4 ;向缓冲区送数
STM #240,BRC
RPTB #TABLE ;卷积算法
STM #16,BK
RPTZ A,#15
MAC *AR4+0%,*AR5+0%,A
STH A,*AR2+
TABLE: MVDD *AR3+,*AR4+0%
.end
链接配置文件fir.asm程序如下
-o fir.out
-m fir.map
MEMORY
{
PAGE 0: EPROM: org=0E000H len=1000H
VECS : org=0FF80H len=0080H
PAGE 1: SARAM: org=0060H len=0040H
DARAM: org=0101H len=1480H
}
SECTIONS
{
.text :> EPROM PAGE 0
.vectors :> VECS PAGE 0
.data :> EPROM PAGE 0
.bss :> SARAM PAGE 1
Hn : align(128){}> DARAM PAGE 1
BUF : align(128){}> DARAM PAGE 1
Xn :> DARAM PAGE 1
Yn :> DARAM PAGE 1
}
中断向量表文件vectors.asm程序如下
.title "vectors.asm"
.ref _c_int00
.sect ".vectors"
B _c_int00
.end
3.2.2 CCS波形仿真图
CCS中方波信号和滤波后波形如图3-7所示:
由于方波是由许多个正弦波叠加而得到的,所以经过fir低通滤波器后,留下的是低频正弦波。
CCS中正弦叠加信号的相频特性如图3-11所示:
CCS中正弦叠加信号滤波后的相频特性如图3-12所示:
通过以上各图可看出当输入信号为方波时,输出信号基本为正弦波;当输入信号为叠加正弦波时,输出为低频正弦波。这说明滤波器起到了较好的滤波效果,符合设计要求。通过Matlab仿真和CCS仿真滤波效果比较,DSP程序的滤波效果要好于Matlab的滤波效果。
4 IIR滤波器设计
4.1 IIR滤波器的Matlab设计
数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程及其z变换描述:
设计一个IIR滤波器就是要根据所给定的指标确定上式中的分子和分母系数。
设计IIR数字滤波器可以先设计一个合适的模拟滤波器,然后变换成满足给定指标的数字滤波器。这种方法很简便,因为模拟滤波器有多种设计方法,如巴特沃思型滤波器、切比雪夫型滤波器、椭圆函数型滤波器等,并且已经具有很多简单而又现成的设计公式。采用这种方法需要把s平面映射到z平面,使模拟系统函数H(s)变换成所需的数字滤波器的系统函数H(z)。映射方法主要有冲激响应不变法、阶跃响应不变法和双线性变换法。前两种方法会因为多值映射关系产生混叠失真,双线性变换法克服了这一缺点。双线性变换法的映射关系式是:
本实验采用的是巴特沃思型滤波器。
4.1.1 IIR滤波器参数的设计
IIR滤波器的参数用Matlab来设计,其程序为:
fp=2100;
fs=8000;
Fs=20000;
Rp=0.5;
Rs=30;
T=1/Fs;
W1p=fp/Fs*2;W1s=fs/Fs*2;
[N ,Wn]=buttord(W1p,W1s,Rp,Rs);
[b,a]=butter(N,Wn)
[N ,Wn]=buttord(W1p,W1s,Rp,Rs)
[b,a]=butter(4,0.0671);
figure(1)
freqz(b,a,512,1000)
b =
0.1600 0.4800 0.4800 0.1600
a =
1.0000 -0.0494 0.3340 -0.0045
N = 3
Wn = 0.4914
所设计的IIR滤波器的幅相频特性如图4-1
图4-1 IIR滤波器的幅相频特性图
由上图可以看出所设计的IIR滤波器能够让频率较低的信号通过。
4.1.2 检验方波的Matlab设计
检验方波的Matlab程序为:
t=0:2*pi/256:2*pi;
f1=square(2*pi*t*1);
y1=filter(b,a,f1);
subplot(2,1,1);plot(f1);axis([0 50*pi -3 3]);
subplot(2,1,2);plot(y1);
方波滤波前后的波形如图4-2
由图可知当输入方波时均可以滤出低频成分实现低通滤波器的功能,滤波后呈现正弦波。
4.1.3 正弦叠加信号的Matlab设计
正弦叠加信号的Matlab程序为:
figure(2)
t=0:2*pi/1024:2*pi;
f1=sin(2*pi*t*1);低频正弦信号
f2=sin(2*pi*t*10000);高频正弦信号
f3=f1+f2;叠加信号
y1=filter(b,a,f3);
subplot(4,1,1);plot(f1);输出图像
subplot(4,1,2);plot(f2);
subplot(4,1,3);plot(f3);
subplot(4,1,4);plot(y1);
figure(3)
freqz(b,a,512,1000)
正弦叠加信号滤波前后的波形如图4-3所示
从上图可以看出低频正弦信号和高频正弦信号叠加后的信号经滤波后,得到低频的正弦信号,其幅值与频率和原始低频信号基本相同。
4.2 IIR滤波器的CCS设计
根据Matlab中设计的滤波器参数,将它们用Q15的定标方式写进汇编程序。利用循环卷积编写程序后,加载Matlab中生成的*.dat文件,就可以得到滤波之后的图像。这里以方波和正弦波进行检验。
4.2.1 IIR滤波器的CCS程序设计
先画出设计程序流程图如图4-4所示
主程序IIR.asm如下
.title "iir.asm"
.mmregs
.def _c_int
x .usect "x",4
y .usect "y",4
b0 .usect "b0",4
a0 .usect "a0",4
Xn: .usect "Xn", 256
Yn: .usect "Yn", 256
.data
table:
.word 0 ;数据初始化清零
.word 0
.word 0
.word 0
.word 0
.word 0
.word 1600*32768/10000 ;设定滤波器参数
.word 4800*32768/10000
.word 4800*32768/10000
.word 1600*32768/10000
.word -494*32768/10000
.word 3340*32768/10000
.word -45*32768/10000
.text
_c_int:
ssbx frct
stm #x,ar1;ar1写入4
rpt #2;循环下条语句3次
mvpd #table,*ar1+ ;ar1清零
stm #y,ar1;ar1写入4
rpt #2
mvpd #table+3,*ar1+;ar1清零
stm #b0,ar1 ;ar1写入4
rpt #3 ; 循环下条语句3次
mvpd table+6,*ar1+;ar1指向table末尾并依次写入数据
stm #a0,ar1 ;ar1写入4
rpt #2
mvpd #table+10,*ar1+
stm #x+3,ar2
stm #a0+2,ar3
stm #y+2,ar4
stm #b0+3,ar5
stm #Xn,ar6 %AR6指向输入
stm #Yn,ar7 %AR7指向输出
stm #4,bk %定义循环缓冲区长度为4
stm #-1,ar0
stm 255,brc
iir: rptb next-1
ld *ar6+,a
stl a,-1,*ar2
mpy *ar2+0%,*ar5+0%,a %计算前向通道
mac *ar2+0%,*ar5+0%,a
mac *ar2+0%,*ar5+0%,a
mac *ar2,*ar5+0%,a
mac *ar4+0%,*ar3+0%,a %计算反向通道
mac *ar4+0%,*ar3+0%,a
mac *ar4+0%,*ar3+0%,a
mar *ar3+0% %修改AR3的位置
sth a,*ar4 ;输出结果Yn
sth a,*ar7+
next:B next
.end
链接配置文件程序如下
vectors.obj
iir.obj
-o iir.out
-m iir.map
MEMORY
{
page 0:rom1 :org=0100h,len=1000h ;设定各起始地址及存储空间长度
rom2 :org=2000h,len=0500h
page 1:
daram0 :org=1000h,len=0500h
daram1 :org=1500h,len=0010h
daram2 :org=1600h,len=0010h
daram3 :org=1700h,len=0010h
daram4 :org=1800h,len=0010h
}
SECTIONS
{
.text:{}>rom1 page0
.data : {}>daram0 page 1
x : {}>daram1 page 1
y : {}>daram2 page 1
b0 : {}>daram3 page 1
a0 : {}>daram4 page 1
}
中断向量文件程序如下
.title "vectors.asm"
.ref _c_int
.sect ".vectors"
B _c_int
.end
4.2.2 CCS波形仿真图
CCS中正弦信号滤波前后波形如图4-5
CCS中正弦叠加信号的相频特性如图4-6
CCS中正弦叠加信号滤波后的相频特性如图4-7
由图4-5可知当输入为正弦叠加信号时,输出为一个低频信号,由图4-6和4-7可看出滤波器率除了高频成分,基本实现了低通滤波的功能。
CCS中方波信号和滤波前后波形如图4-8
CCS中方波信号的相频特性如图4-9
CCS中方波信号滤波后的相频特性如图4-10
由4-8可知当输入一个方波信号时,经低通滤波器,输出一个低频正弦信号,由4-9和4-10可以看出经低通滤波器后,滤除了高频成分,基本实现了低通滤波的功能。
通过Matlab仿真和CCS仿真滤波效果比较,DSP程序的滤波效果要好于Matlab的滤波效果。