基于matlab的FIR和IIR滤波器.docx
《基于matlab的FIR和IIR滤波器.docx》由会员分享,可在线阅读,更多相关《基于matlab的FIR和IIR滤波器.docx(27页珍藏版)》请在冰豆网上搜索。
基于matlab的FIR和IIR滤波器
目录
1引言1
1.1MATLAB的介绍2
1.2CCS的介绍2
2设计要求4
3FIR滤波器设计5
3.1FIR滤波器的Matlab设计5
3.1.1FIR滤波器参数的设计5
3.1.2检验方波的Matlab设计6
3.1.3正弦叠加信号的Matlab设计7
3.2FIR滤波器的CCS设计8
3.2.1FIR滤波器的CCS设计程序10
3.2.2CCS波形仿真图12
4IIR滤波器设计15
4.1IIR滤波器的Matlab设计15
4.1.1IIR滤波器参数的设计15
4.1.2检验方波的Matlab设计16
4.1.3正弦叠加信号的Matlab设计17
4.2IIR滤波器的CCS设计19
4.2.1IIR滤波器的CCS程序设计19
4.2.2CCS波形仿真图23
结束语25
参考文献26
1引言
数字信号处理(DigitalSignalProcessing),或者说对信号的数字处理(包括
对信号进行采集、变换、滤波、估值、增强、压缩、识别等),是20世纪60年代前后发展起来的并广泛应用于多领域的新兴学科。
当今,数字信号处理技术正飞速发展,它不但自成一门学科,更是以不同形式影响和渗透到其他学科;它与国民经济息息相关,与国防建设紧密相连;它影响或改变着我们的生产、生活方式,因此受到人们普遍的关注。
数字化、智能化和网络化是当代信息技术发展的大趋势,而数字化是智能化和网络化的基础,实际生活中遇到的信号多种多样,例如广播信号、电视信号、雷达信号、通信信号、导航信号等等。
上述这些信号大部分是模拟信号,也有小部分是数字信号。
模拟信号是自变量的连续函数,自变量可以是一维的,也可以是二维或多维的。
大多数情况下一维模拟信号的自变量是时间,经过时间上的离散化(采样)和幅度上的离散化(量化),这类模拟信号便成为一维数字信号。
因此,数字信号实际上是数字序列表示的信号,语音信号经采样和量化后,得到的数字信号是一个一维离散时间序列;而图像信号的经采样和量化后,得到的是数字信号是一个二维离散空间序列。
数字滤波技术是数字信号分析、处理技术的重要分支。
无论是信号的获取、传输,还是信号的处理和交换都离不开滤波技术,它对信号安全可靠和有效灵活地传输时至关重要的。
在所有的电子系统中,使用最多技术最复杂的要算数字滤波器了。
数字滤波器的优劣直接决定产品的优劣。
1.1MATLAB的介绍
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,代表了当今国际科学计算软件的先进水平。
主要应用于工程计算、信号处理与通讯、图像处理、信号检测、金融建模设计与分析、控制系统设计以及计算生物学等众多应用领域。
MATLAB是矩阵实验室(Matrix Laboratory)之意。
除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多。
当前流行的MATLAB5.3/Simulink3.0包括拥有数百个内部函数的主包和三十几种工具包(Toolbox)。
工具包又可以分为功能性工具包和学科工具包。
功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能。
学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类。
除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包。
1.2CCS的介绍
CCS软件简介CCS(CodeComposerStudio)代码调试器是一种合成开发环境。
它是一种针对标准TMS320调试器接口的交互式方法。
CCS目前有CCS1.1,CCS1.2和CCS2.0等三个不同时期的版本,又有CC2000(针对C2XX),CCS5000(针对C54XX)和CCS6000(针对C6X)三个不同的型号。
我们所使用的是CCS50002.2的版本。
CCS5000具有以下特性:
(1)TI编译器的完全集成的环境:
CCS5000目标管理系统,内建编辑器,所有的调试和分析能力集成在一个Windows环境中。
(2)对C和DSP汇编文件的目标管理:
目标编辑器保持对所有文件及相关内容的跟踪。
它只对最近一次编译中改变过的文件重新编译,以节省编译时间。
(3)高集成的编辑器调整C和DSP汇编代码:
CCS5000的内建编辑器支持C和汇编文件的动态语法加亮显示。
使用户能很容易地阅读代码和当场发现语法错误。
(4)编辑和调试时的后台编辑:
用户在使用编译器和汇编器时没有必要退出系统到DOS环境中,因为CCS5000会自动将这些工具装载在它的环境中。
在其窗口中,错误会加亮显示只要双击错误就可以直接到达出错处。
在含有浮点并行调试管理器(PDM)的原有的MS窗口下支持多处理器CCS5000在Windows95和Windows-me中支持多处理。
PDM允许将命令传播给所有的或所选择的处理器。
(5)在任何算法点观察信号的图形窗口探针:
图形显示窗口使用户能够观察时域或频域内的信号。
对于频域图,FFT在主机内执行,这样就可以观察所感兴趣的部分而无须改变它的DSP代码。
图显示也可以同探针连接,当前显示窗口被更新时,探针被指定,这样当代码执行到达该点时,就可以迅速地观察到信号。
(6)文件探针在算法处通过文件提取或加入信号或数据:
CCS5000允许用户从PC机读或写信号流。
而不是实时的读信号,这就可以用已知的例子来仿真算法。
(7)图形分析:
CCS5000的图形分析能力在其环境中是集成的。
(8)在后台(系统命令)执行用户的DOS程序:
用户可以执行CCS5000中的DOS程序,并将其输出以流水方式送到CCS5000的输出窗口。
且允许用户将应用程序集成到CCS5000。
(9)技术状态观察窗口:
CCS5000的可视窗口允许用户进入C表达式及相关变量。
结构、数组、指针都能很简单地递归扩展和减少,以便进入复杂结构。
(10)代数分解窗口:
允许用户选择查看写成代数表达式的C格式,提高可读性。
(11)目标DSP上的帮助:
DSP结构和寄存器上的在线帮助可以使用户不必查看技术手册。
(12)用户扩展:
扩展语言(GEL)使得用户可以将自己的菜单项加到CCS5000的菜单栏中。
2设计要求
本次课设,主要针对DSP芯片进行程序设计,要求采用会变语言编写程序。
通过此次课程设计,熟悉DSP芯片的硬件结构,加深对DSP芯片的认识;掌握对DSP芯片编程方法,掌握间接寻址方法的使用方法,重点掌握算法的设计。
要求采用汇编语言针对DSP芯片设计低通滤波器:
1给出低通滤波器技术指标,在Matlab里先设计符合要求的低通滤波器,并得到滤波器参数,并得到该滤波器的幅频特性和相频特性;
2FIR低通滤波器设计,给出设计流程图,在CCS软件环境下编写程序;
3分别用方波和正弦波验证FIR低通滤波器的设计;
4IIR低通滤波器设计,给出程序流程图,在CCS软件环境下编写程序;
5分别用方波和正弦波验证IIR低通滤波器的设计;
6与Matlab中设计的滤波器,进行对比研究。
3FIR滤波器设计
3.1FIR滤波器的Matlab设计
FIR结构中的延迟Z-1在程序中实现是数据在存储器中的滑动,这对一个L阶的FIR数字滤波器来说,就是要求在存储器中开辟一个L个样本并进行乘累加运算。
这在DSP中可以用两种方法来实现该缓冲区。
对于线性缓冲区来说,每当DSP读入一个样本后都将此样本向后移动,读完最后一个样本后,最前面的样本(最老的)被推出缓冲区,并输入最新的样本至缓冲区顶部。
线性缓冲区的存储器延时可以由具有数据移动的DMOV指令来实现,它需要将缓冲区置于内部DARAM块中;对于循环缓冲区,每当输入新样本时,以新样本改写区中最老的样本,而缓冲区中的其他样本不需要其他样本移动。
循环缓冲区可采用循环寻址技术来实现,它不需要必须定位在DARAM块中,但需要适当的缓冲区对准以满足循环寻址的要求。
本次课设用的是循环寻址,下面主要介绍一下循环寻址的方法。
循环缓冲实现延时的特点是:
(1)实现N阶FIR数字滤波器时,需要在数据存储器中开辟一个称为滑窗的N个单元的缓冲区,滑窗中存放最新的N个样本。
(2)当每次输入新样本时以新的样本改写滑窗中最老的样本,而滑窗其他的数据不需要移动。
(3)利用片内BK(循环缓冲区长度)寄存器对滑窗进行间接寻址,循环缓冲区地址首位相邻。
3.1.1FIR滤波器参数的设计
FIR滤波器的参数用Matlab来设计,其程序为:
>>N=15;%滤波器的阶数
Wn=0.1%滤波器的截止频率
b=fir1(N,Wn)
freqz(b,512,1000)%滤波器的幅频特性和相频特性
Wn=
0.1000
b=
Columns1through9
0.00340.00740.01880.03950.06770.09840.12480.14000.1400
Columns10through16
0.12480.09840.06770.03950.01880.00740.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([050*pi-33]);
gridon;
subplot(2,1,2);
plot(x2);
axis([050*pi-33]);
gridon;
输出方波如3-4所示
图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所示
上图由上向下,第一个图是低频正弦波,第二个图是高频正弦波,第三个图是低频与高频的叠加,最后一个是叠加后的正弦波经低通滤波器后出现的波形,基本与低频正弦信号相同。
3.2FIR滤波器的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,'1651102100c8\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,'1651102100c8\n');%输出文件头
fprintf(fid,'%d\n',xto_ccs);%输出
fclose(fid);
3.2.1FIR滤波器的CCS设计程序
FIR滤波器的设计流程图如下
图3-6FIR设计流图
根据上图编写程序
主程序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:
.word34*32768/10000,74*32768/10000,188*32768/10000,395*32768/10000
.word677*32768/10000,984*32768/10000,1248*32768/10000,1400*32768/10000
.word1400*32768/10000,1248*32768/10000,984*32768/10000,677*32768/10000
.word395*32768/10000,188*32768/10000,74*32768/10000,34*32768/10000
.text
_c_int00:
SSBXFRCT
STM#Hn,AR5;AR5指向冲激响应
RPT#15
MVPDTABLE,*AR5+
STM#BUF,AR4;AR4指向缓冲区间
RPTZA,#15
STLA,*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
RPTZA,#15
MAC*AR4+0%,*AR5+0%,A
STHA,*AR2+
TABLE:
MVDD*AR3+,*AR4+0%
.end
链接配置文件fir.asm程序如下
-ofir.out
-mfir.map
MEMORY
{
PAGE0:
EPROM:
org=0E000Hlen=1000H
VECS:
org=0FF80Hlen=0080H
PAGE1:
SARAM:
org=0060Hlen=0040H
DARAM:
org=0101Hlen=1480H
}
SECTIONS
{
.text:
>EPROMPAGE0
.vectors:
>VECSPAGE0
.data:
>EPROMPAGE0
.bss:
>SARAMPAGE1
Hn:
align(128){}>DARAMPAGE1
BUF:
align(128){}>DARAMPAGE1
Xn:
>DARAMPAGE1
Yn:
>DARAMPAGE1
}
中断向量表文件vectors.asm程序如下
.title"vectors.asm"
.ref_c_int00
.sect".vectors"
B_c_int00
.end
3.2.2CCS波形仿真图
CCS中方波信号和滤波后波形如图3-7所示:
CCS中方波信号的相频特性如图3-8所示:
CCS中方波信号滤波后的相频特性如图3-9所示:
由于方波是由许多个正弦波叠加而得到的,所以经过fir低通滤波器后,留下的是低频正弦波。
图10方波信号滤波后的幅频、相频特性
CCS中正弦叠加信号与滤波后波形如图3-10所示:
CCS中正弦叠加信号的相频特性如图3-11所示:
CCS中正弦叠加信号滤波后的相频特性如图3-12所示:
通过以上各图可看出当输入信号为方波时,输出信号基本为正弦波;当输入信号为叠加正弦波时,输出为低频正弦波。
这说明滤波器起到了较好的滤波效果,符合设计要求。
通过Matlab仿真和CCS仿真滤波效果比较,DSP程序的滤波效果要好于Matlab的滤波效果。
4IIR滤波器设计
4.1IIR滤波器的Matlab设计
数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程及其z变换描述:
系统的转移函数为:
设计一个IIR滤波器就是要根据所给定的指标确定上式中的分子和分母系数。
设计IIR数字滤波器可以先设计一个合适的模拟滤波器,然后变换成满足给定指标的数字滤波器。
这种方法很简便,因为模拟滤波器有多种设计方法,如巴特沃思型滤波器、切比雪夫型滤波器、椭圆函数型滤波器等,并且已经具有很多简单而又现成的设计公式。
采用这种方法需要把s平面映射到z平面,使模拟系统函数H(s)变换成所需的数字滤波器的系统函数H(z)。
映射方法主要有冲激响应不变法、阶跃响应不变法和双线性变换法。
前两种方法会因为多值映射关系产生混叠失真,双线性变换法克服了这一缺点。
双线性变换法的映射关系式是:
本实验采用的是巴特沃思型滤波器。
4.1.1IIR滤波器参数的设计
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.16000.48000.48000.1600
a=
1.0000-0.04940.3340-0.0045
N=3
Wn=0.4914
所设计的IIR滤波器的幅相频特性如图4-1
由上图可以看出所设计的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([050*pi-33]);
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.2IIR滤波器的CCS设计
根据Matlab中设计的滤波器参数,将它们用Q15的定标方式写进汇编程序。
利用循环卷积编写程序后,加载Matlab中生成的*.dat文件,就可以得到滤波之后的图像。
这里以方波和正弦波进行检验。
4.2.1IIR滤波器的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:
.word0;数据初始化清零
.word0
.word0
.word0
.word0
.word0
.word1600*32768/10000;设定滤波器参数
.word4800*32768/10000
.word4800*32768/10000
.word1600*32768/10000
.word-494*32768/10000
.word3340*32768/10000
.word-45*32768/10000
.text
_c_int:
ssbxfrct
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次
mvpdtable+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指向输入
s