基于Matlab的FIR滤波器设计与仿真.docx
《基于Matlab的FIR滤波器设计与仿真.docx》由会员分享,可在线阅读,更多相关《基于Matlab的FIR滤波器设计与仿真.docx(15页珍藏版)》请在冰豆网上搜索。
![基于Matlab的FIR滤波器设计与仿真.docx](https://file1.bdocx.com/fileroot1/2023-6/23/c5e6b367-1070-4f19-8643-ae5d33465e63/c5e6b367-1070-4f19-8643-ae5d33465e631.gif)
基于Matlab的FIR滤波器设计与仿真
基于Matlab的FIR滤波器设计与仿真
实验地点:
曹光彪信息楼219实验日期:
7月13日至7月18日
一、实验目的
1、掌握基本的MATLAB编程方法;
2、理解FIR滤波器的设计原理;
3、学会用MATLAB来编程实现FIR滤波器;
4、掌握基本的simulink交互式仿真,并对FIR滤波器模型并进行仿真;
5、学会对所得的结果进行分析。
二、实验内容
1、制作数据源:
用电脑采集或用软件截取5至10秒的语音(如“宁波大学”...)(注意用wavread函数
将语音文件读入到matlab时,有“右声道”和“左声道”两个信号,只要将其中一个声道作为信号就可以。
)
2、信号中混入随机噪声(注意信噪比,噪声强度不要太大):
事先取一个参考值为0,再取噪声的方差,方差的取值是根据原始语音的幅度取的噪声,
噪声强度不宜过大或过小,适中即可。
然后通过randn(size(a)).*sqrt(noise_var)+noise_mu;语句产生与原始语音长度相同的随机噪声,最后把这个噪声添加到原始语音中,得到加噪语音信号。
3、设计一个FIR滤波器对前面的混合信号进行处理、降低噪声,并对性能进行分析:
有限长单位冲激响应(FIR)数字滤波器具有严格的线性相位,又具有任意的幅频特性。
同时FIR系统只有零点,系统是稳定的,因而容易实现线性相位和允许实现多通道滤波器。
只要经过一定的延时,任何非因果有限长序列都能变成因果的有限长序列,因而总能用因果系统来实现。
FIR滤波器由于单位冲激响应是有限长的,可以用快速傅立叶变换(FFT)算法来实现过滤信号,从而大大提高运算效率。
由于FIR滤波器具有以上优点,在信号处理和数据传输中得到了广泛的应用。
运用窗函数设计滤波器是FIR数字滤波器设计的主要方法之一,由于运算简单,又有闭合形式的公式可循,因而很实用。
有限长FIR数字滤波器的设计方法主要是窗函数设计法。
常用的窗函数有以下几种,矩形窗,三角窗,汉宁窗,海明窗,布拉克曼窗,凯泽窗(β=7.865),各种窗函数基本参数比较如下表1。
由表1得矩形窗虽然简便,但存在明显的吉布斯效应,主瓣和第一旁瓣之比只有13dB,为了克服这些缺陷,设计时可根据给定的滤波器技术指标,选择滤波器长度M和窗函数w(n),使其具有最窄宽度的主瓣和最小旁瓣
4、用Simulink设计FIR滤波器模型并进行仿真,所得结果进行分析:
Simulink创建模型并寻找解决实际问题的方法,可以用它轻松地搭建一个系统模型,并设置模型参数和仿真参数。
由于Simulink是交互式的应用程序,因此在仿真过程中,可以在线修改仿真参数,并立即观察到改变后的仿真结果。
本文将介绍在Simulink环境下应用数字滤波器设计模块进行信号处理(滤波)的可视化设计技术。
由于调用了Matlab高度集成化和可视化的计算机仿真环境,用户可以不用编写任何程序语句,仅仅通过鼠标拖放和点击操作,就可完成复杂的数字滤波器的设计工作。
下面通过一个应用示例介绍这种基于可视化的信号滤波技术,用数字滤波器设计模块(DigitalFilterDesignBlock)设计、分析和实现滤波器。
三、实验结果与分析
1、制作数据源:
我用电脑录制了同学的一段语音,内容是:
现代语音处理技术。
该语音大概有4,5秒之长。
然后用wavread函数将语音文件读入到matlab中,
其实现的语句如下:
[a,fs]=wavread('现代语音处理技术.wav');%读入语音
a=a(:
1);
从中我们知道fs语音的采样频率。
2、信号中混入随机噪声:
noise_mu=0;
noise_var=0.005;
a0=randn(size(a)).*sqrt(noise_var)+noise_mu;
a1=a+a0;
事先取一个参考值为0,再取噪声的方差为0.005,0.005是根据原始语音的幅度取的噪声,噪声强度不宜过大或过小,适中即可。
然后通过randn(size(a)).*sqrt(noise_var)+noise_mu;语句产生与原始语音长度相同的随机噪声,最后把这个噪声添加到原始语音中,得到a1是信号中混入随机噪声的的语音。
3、设计一个FIR滤波器:
3.1、FIR滤波器设计的原理:
①先对原始语音进行FFT变换,从FFT图中得到passband和stopband从中我们可以知道了FIR滤波器的截止频率。
确定我们选择是用低通,高通还是带通来处理加噪语音。
②然后我们通过:
fedge=input('BandedgesinHz=');
mval=input('Desiredmagnitudevaluesineachband=');
dev=input('Desiredrippleineachband=');
FT=input('SamplingfrequencyinHz=');
输入从FFT上得到的数据,passband和stopband,低通或高通,带通,通带纹波和阻带纹波,以及从wavread函数中得到的采样频率fs。
通过:
[N,fpts,mag,wt]=remezord(fedge,mval,dev,FT);
b=remez(N,fpts,mag,wt);
产生滤波器的阶数N和滤波器的系数b。
③然后把加噪的语音a1与b进行卷积:
a11=conv(b,a1)得到的是滤波后的语音信号。
3.2、FIR滤波器设计的程序:
[a,fs]=wavread('现在语音处理技术.wav');%读入宁波大学语音
a=a(:
1);
FS=length(a);
f=0:
fs/FS:
(FS-1)*fs/FS;
%进行FFT变换
x=fft(a);
figure
(1)
plot(f,abs(x));title('原始信号a的fft图');
axis([04500001000]);
xlabel('f');
ylabel('abs(x)');
gridon;
%设置FIR滤波器
formatlong
fedge=input('BandedgesinHz=');
mval=input('Desiredmagnitudevaluesineachband=');
dev=input('Desiredrippleineachband=');
FT=input('SamplingfrequencyinHz=');
[N,fpts,mag,wt]=remezord(fedge,mval,dev,FT);
b=remez(N,fpts,mag,wt);
disp('FIRFilterCoefficients');
disp(b)
[h,w]=freqz(b,1,256);
%画出幅频特性
figure
(2)
subplot(2,1,1);
plot(w/pi,20*log10(abs(h)));title('幅频特性');
xlabel('\omega/\pi');
ylabel('Gain,dB');
gridon;
%画出相频特性
subplot(2,1,2)
pha=angle(h);%得到相位
plot(w/pi,pha);title('相频特性');
xlabel('\omega/\pi');
ylabel('phase(Rad)');
%原始语音信号图
ts=1/fs;
ta=(length(a)-1)/fs;
t=0:
ts:
ta;
figure(3)
subplot(3,1,1);
plot(t,a);title('原始信号a');
xlabel('t');
ylabel('a');
gridon;
%添加随机噪声
noise_mu=0;
noise_var=0.005;
a0=randn(size(a)).*sqrt(noise_var)+noise_mu;
a1=a+a0;
%在原始信号上加随机噪声的信号图
subplot(3,1,2);
plot(t,a1);title('在原始信号上加上噪声信号a1');
xlabel('t');
ylabel('a1');
gridon;
%求卷积
a11=conv(b,a1);
%经过滤波器后的信号图
M=(length(a11)-1)/fs;
m=0:
ts:
M;
subplot(3,1,3);
plot(m,a11);title('经过滤波器后的信号a11');
xlabel('m');
ylabel('a11');
gridon;
3.3、FIR滤波器设计的结果及分析:
3.31.读入原始语音:
[a,fs]=wavread('现代语音处理技术.wav');%读入语音
a=a(:
1);
fs
结果:
fs=
44100
3.32.运行以上程序,得到图形以及数据如下:
Figure1:
原始语音信号的FFT图:
从中我们知道passbandFp=2000,stopbandFs=5000,我们采用低通滤波器[10],
已知fs=44100,则我们可以在命令窗口输入以下数据,并按回车键结束。
BandedgesinHz=[20005000]
Desiredmagnitudevaluesineachband=[10]
Desiredrippleineachband=[0.0150.01]
SamplingfrequencyinHz=44100Figure2:
Figure2:
FIR滤波器的幅频特性和相频特性图:
Figure3:
原始语音a,加噪语音a1,滤波语音a11的图形:
输出的滤波器的系数如下:
FIRFilterCoefficients
Columns1through4
0.002537-0.007558-0.009428-0.087944
Columns5through8
-0.037353-0.095962-0.064722-0.001676
Columns9through12
0.0661940.0394350.0329060.477741
Columns13through16
0.1410.1550.1550.141
Columns17through20
0.4777410.0329060.0394350.066194
Columns21through24
-0.001676-0.064722-0.095962-0.037353
Columns25through28
-0.087944-0.009428-0.0075580.002537
从上面的滤波效果来看,这个低通滤波器的效果还不错,基本上能把原始语音的滤波出来,虽然不能做到很好的把噪声滤除,但是在语音的听觉效果上分辩不出与原始语音有何差别,效果还是不错的。
4、用Simulink设计FIR滤波器模型并进行仿真,所得结果进行分析
因为滤波器的阶数是N=27阶,则我通过Simulink设计了一个27阶的滤波器,其图形如下,下图是simulink总的设计模型,其中我们可以看到示波器可以显示三路的波形,第一路是原始语音信号的波形,第二路是加噪语音信号的波形,第三路是加噪语音信号进过滤波后的语音信号输出,通过三路波形的同时显示我们可以很好的比较原始语音信号与滤波后的语音信号之间的差别,从而可以判断滤波器的滤波效果是否合格。
上图的Filter滤波器是下图所示的子系统封装得到的,该子系统设计了阶数为27阶的FIR滤波器,其中的滤波器系数是上面用MATLAB实现滤波器设计得到的滤波器的系数,共有28个。
我设计的simulink模型如下图所示:
原始语音的fromworkspace设置如下:
其中Data为[t’,a],Sampletime为ts,并且当数据处理完后,其最后的输出数据置零。
加噪原始语音的fromworkspace设置如下:
其中Data为[t’,a1],Sampletime为ts,并且当数据处理完后,其最后的输出数据置零。
在运行simulink之前,我对simulink的参数设置如下:
用simulink进行仿真的结果如下:
从仿真的结果我们可以看到,原始语音,加噪语音,以及滤波后的语音。
从中我们可以看出FIR滤波器对加噪语音有一定的滤波效果,滤波出的语音与原始语音比较接近,如果从听觉角度去分析,我们很难分辩这两种语音之间的差别,所以这个FIR滤波器在一定程度上对语音的滤波效果是不错的。
四、实验体会:
本次实验我在对MATLAB了解的基础上更好的,更熟练的应用MATLAB来编程实现FIR滤波器设计,以及学会用simulink来设计FIR滤波器,仿真实现滤波效果。
这个实验一开始我只具备基本的MATLAB知识和相关的FIR滤波器的设计原理。
开始用MATLAB来编程实现对我来说还是有点难度的,但是通过查看相关资料以及认真的阅读老师提供的资料,我慢慢的对实现FIR滤波器设计有了初步的程序轮廓,然后我花了将近一天的时间来编程,中间出现过很多困难,都是自己对函数的使用不熟悉,但在老师的帮助下我都逐个解决了,并最后实现FIR滤波器功能,对加噪语音进行滤波,输出的语音与原始语音在听觉效果上分辨不出有何差别,很好的实现了滤波效果。
用MATLAB来编程实现滤波器之后,我通过阅读老师提供的资料掌握了Simulink交互式设计的方法,用Simulink来设计FIR滤波器模型并进行仿真,滤波出的语音与原始语音比较接近,从听觉角度去分析,我们很难分辩这两种语音之间的差别,所以这个FIR滤波器在一定程度上对语音的滤波效果是不错的。
这次实验让我感觉收获很多,我希望下个实验我更努力,收获更多。