基于MATLAB的数字滤波器设计【FIR和IIR】

本文详细介绍了使用Matlab设计FIR和IIR滤波器的过程,包括参数设置、滤波器特性分析以及滤波效果的Matlab仿真。接着,文章探讨了在CCS环境中实现这两种滤波器的汇编程序设计,包括循环缓冲区的实现方法,并通过波形仿真验证了滤波器的性能。最终,通过对Matlab和CCS仿真结果的比较,表明了DSP程序在滤波效果上的优势。
摘要由CSDN通过智能技术生成

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所示。

bcb606eaffac00508b997cdfd6d4b5f1.png
图3-1 滤波器的幅频特性图




cd0405f8578e58af604bbc238f1ba80b.png
图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;

ce90a92a105d66c7bf0caac3b0f0428d.png
输出方波如3-4所示

由图可知,经低通滤波后方波信号变为等峰峰值为和周期的正弦信号。

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所示

225b52b4a019fbf0e112f1a36c2f0119.png
图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滤波器的设计流程图如下

8b6359cc00f1d9480f7c8544b032dac0.png
图3-6 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所示:



3a832ef2dac996c9a6c7baca40352fa0.png


c405093108960b151d46c3645d4a5a97.png


由于方波是由许多个正弦波叠加而得到的,所以经过fir低通滤波器后,留下的是低频正弦波。

c04c2e79596f9660b50252ada83fc81c.png

CCS中正弦叠加信号的相频特性如图3-11所示:

d3f3436a542a81f57ca58a18186a4b82.png


CCS中正弦叠加信号滤波后的相频特性如图3-12所示:

66d6d5ebf186a1adfaa61e61e2ca5963.png

通过以上各图可看出当输入信号为方波时,输出信号基本为正弦波;当输入信号为叠加正弦波时,输出为低频正弦波。这说明滤波器起到了较好的滤波效果,符合设计要求。通过Matlab仿真和CCS仿真滤波效果比较,DSP程序的滤波效果要好于Matlab的滤波效果。


4 IIR滤波器设计

4.1 IIR滤波器的Matlab设计

数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程及其z变换描述:


4fd527e4b9f77329e3bbc599f8121c13.png


设计一个IIR滤波器就是要根据所给定的指标确定上式中的分子和分母系数。

设计IIR数字滤波器可以先设计一个合适的模拟滤波器,然后变换成满足给定指标的数字滤波器。这种方法很简便,因为模拟滤波器有多种设计方法,如巴特沃思型滤波器、切比雪夫型滤波器、椭圆函数型滤波器等,并且已经具有很多简单而又现成的设计公式。采用这种方法需要把s平面映射到z平面,使模拟系统函数H(s)变换成所需的数字滤波器的系统函数H(z)。映射方法主要有冲激响应不变法、阶跃响应不变法和双线性变换法。前两种方法会因为多值映射关系产生混叠失真,双线性变换法克服了这一缺点。双线性变换法的映射关系式是:

655b902afa83a820c33c2862cf17ad85.png

本实验采用的是巴特沃思型滤波器。

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滤波器的幅相频特性图

8bf6635a24132c2d5e09b5daa2f77578.png


由上图可以看出所设计的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

e35a6acd907c378c592961ea5dd8fc59.png

由图可知当输入方波时均可以滤出低频成分实现低通滤波器的功能,滤波后呈现正弦波。

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所示

3f631291fb13d8a5b5cd3a965f5f7af0.png


从上图可以看出低频正弦信号和高频正弦信号叠加后的信号经滤波后,得到低频的正弦信号,其幅值与频率和原始低频信号基本相同。


4.2 IIR滤波器的CCS设计

根据Matlab中设计的滤波器参数,将它们用Q15的定标方式写进汇编程序。利用循环卷积编写程序后,加载Matlab中生成的*.dat文件,就可以得到滤波之后的图像。这里以方波和正弦波进行检验。

4.2.1 IIR滤波器的CCS程序设计

先画出设计程序流程图如图4-4所示

e67e4573cda7c227ad940b25ac102c16.png


主程序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

568519f8f4941c3152bf92b97087ae6b.png


CCS中正弦叠加信号的相频特性如图4-6

6e3778cfd446870c5ee22e9cd01fc07d.png


CCS中正弦叠加信号滤波后的相频特性如图4-7

0377a0423bfbec32152f8a8194c7106a.png


由图4-5可知当输入为正弦叠加信号时,输出为一个低频信号,由图4-6和4-7可看出滤波器率除了高频成分,基本实现了低通滤波的功能。



CCS中方波信号和滤波前后波形如图4-8

386c1b163a051a866551d9a0ef3f9508.png


CCS中方波信号的相频特性如图4-9

d7afdfeb834ca47ce7dd5d7ec91769cc.png


CCS中方波信号滤波后的相频特性如图4-10

90615a10163e1f8ef56af2283900ef9d.png

由4-8可知当输入一个方波信号时,经低通滤波器,输出一个低频正弦信号,由4-9和4-10可以看出经低通滤波器后,滤除了高频成分,基本实现了低通滤波的功能。

通过Matlab仿真和CCS仿真滤波效果比较,DSP程序的滤波效果要好于Matlab的滤波效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的matlab大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值