基于MATLAB的数字滤波器和均衡器设计.docx
《基于MATLAB的数字滤波器和均衡器设计.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的数字滤波器和均衡器设计.docx(13页珍藏版)》请在冰豆网上搜索。
![基于MATLAB的数字滤波器和均衡器设计.docx](https://file1.bdocx.com/fileroot1/2022-11/24/5ac712a5-0dcb-4e53-9e3f-901da73a6893/5ac712a5-0dcb-4e53-9e3f-901da73a68931.gif)
基于MATLAB的数字滤波器和均衡器设计
基于MATLAB勺简易声音信号频谱分析仪设计
摘要
通过MATLAB强大的信号处理功能,先设计了几个理想滤波器,通过对理想滤波器勺滤波特性分析对比,可以更直观得认识滤波器勺功能。
利用滤波器原理,结合数字均衡器的设计要求,对各种数字音频信号进行滤波处理,设计出一种可调节参数的数字滤波器,即一种均衡器。
本文的数字均衡器以MATLAB^设计平台,有.wav文件的获取、滤波、保存和播放控制功能。
在对声音文件进行频率分析的基础上,用10段均衡器可对声音信号进行调节后保存播放。
关键字:
MATLAB滤波器,均衡器,傅里叶反变换
1概述
随着数字化技术的快速、深入发展,人们对数字化电子产品所产生的图像、图形以及声音等质量的要求越来越高。
在实时数字处理过程中,往往需要对目标信号进行滤波处理,以满足用户对信号的要求。
MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的滤波器设计工具箱为实现声音信号的数字滤波提供了十分方便的函数和命令。
本文将介绍基于MATLAB^计出的一种实用的数字滤波器,并对其功能进行扩展,设计出一种均衡器。
2设计原理
滤波器的种类很多,按所通过信号的频段分为低通、高通、带通和带阻滤波器四种。
低通滤波器:
它允许信号中的低频或直流分量通过,抑制高频分量或干扰和噪声。
高通滤波器:
它允许信号中的高频分量通过,抑制低频或直流分量。
带通滤波器:
它允许一定频段的信号通过,抑制低于或高于该频段的信号、干扰和噪声。
带阻滤波器:
它抑制一定频段内的信号,允许该频段以外的信号通过。
上述每种滤波器又可以分为模拟滤波器和数字滤波器。
如果滤波器的输入输出都是数字信号,则这样的滤波器称之为数字滤波器。
根据数字滤波器冲激响应的时域特性,可将数字滤波器分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。
2.1滤波器设计原理
滤波器就是对系统的输入信号进行滤波。
输入x(n)和输出y(n)
之间的关系是脉冲响应h(n),即
y(n)=x(n)*h(n)(2-1)
如果滤波器的输入输出都为离散信号,那么该滤波器的脉冲响应也应该是离散信号,这样滤波器就成为了数字滤波器。
上面的系统为时域离散系统时,其频域特性为
Y(e')=X(e「)H(e「)(2-2)
其中Y(e「)、X(ej)分别是数字滤波器的输出序列和输入序列的
频域特性,H(ejJ是数字滤波器的频域响应。
可以看出,输入序列的频谱X(ej)经过滤波后变成了X(ej)H(ej);因此按照输入信号频谱的特点和处理信号的目的适当选择H(e「),使得滤波后的X(e「)H(e「)满足设计性能要求。
在MATLAB^主要有Filter函数、Filtfilt函数等滤波函数。
Filter函数滤波器的标准差分方程为
a
(1)y(n)=b
(1)x(n)•b
(2)x(n_1)■...■b(nb1)x(n_nb)
-a
(2)y(n-"-a(n&-1)y(n-nb)(2-3)
如果a
(1)不为1,那么滤波器的系数将用a
(1)进行归一化处理,即各系数同除以a
(1)。
2.2均衡器设计原理
10段滤波器能够对以下几个频率段进行滤波,各段的音感特征
如下所示:
30~60Hz(沉闷);60~100Hz(沉重);100~200Hz(丰满);200~500Hz(力度);500~1KHz(明朗);1K~2KHz(透亮);2K~4Kz
(尖锐);4K~8Kz(清脆);8K~16Kz(纤细)。
通过对各频段的滤波特性设置即可调出不同的音效。
打开音频文件后,先对原理声音信号进行傅里叶变换处理,然后
从滚动条上获得各频段的滤波特性值,通过换算得到增益值,并构造
滤波器频域特性响应,即可得到该频率范围的滤波器。
使用该构造的滤波器对输入的原始声音信号进行频域滤波,并通过傅里叶反变换将
滤波后的频域信号转化成的时域波形信号。
然后,再播放该滤波后的
声音信号,即可发现声音的音质效果发生了改变。
这就是均衡器的基
本工作原理。
3MATLAB^序设计
3.1模块设计
该MATLA程序的模块设计如下图所示
图1模块设计图
3.2图形界面设计
首先打开MATLAB在命令窗口中输入guide命令进入GUI图形设计界面。
再新建一个空白的图形界面文件,添加如下的控件并设计它们的布局。
(1)添加5个axes控件,用于显示时域波形图和频域频谱图;
(2)添加4个statictext控件,用于窗口及其他控件的说明使用;
(3)添加6个panel控件,将一组相关的控件框在一起;
(4)添加1个edit控件,用于输入频率参数值;
(5)添加2个pop-upmenu控件,用于选择信号发生器产生的信号类型和均衡器参数配置;
(6)添加4个radiobutton,用于选择滤波器类型;
(7)添加11个slider控件,用于设置均衡器参数和音量大小;
(8)添加11个pushbutton控件,其中6个用于控制音频文件播放,2个用于打开和保存文件,其余3个用于控制均衡器设置。
双击各个控件,打开其属性编辑窗,即可修改其名称、颜色、大
小、初始值及位置等属性。
最终编辑好的界面如下图所示:
啰环$昭环hadkEh*
fdHWiwbi>DLflIoah
3.3MATLAB编程
当界面控件及布局创建完成以后,点击运行即可自动生成包含各控件回调函数在内的m文件。
MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现的。
回调函数即在一定的操作下自动执行的指令代码。
本次数字滤波器及均衡器的设计主要功能有数字信号发生器,信号频谱分析显示,
理想滤波器滤波,音频文件的打开及保存,音频播放控制及均衡器效果设置等。
下面仅介绍实现几个主要功能的M代码程序。
(1)理想滤波器滤波。
实现的代码及说明如下:
N=handles.N;
if(get(handles.RB_LowPass,'Value')==1)fL=5000;%设置低通截止频率%设置理想低通滤波器的频率特性Hw=[ones(1,fix(N*fL/fs)),zeros(1,N-2*fix(N*fL/fs)),ones(1,fix(N*fL/fs))];
elseif(get(handles.RB_HighPass,'Value')==1)fH=5000;%设置高通截止频率%设置理想高通滤波器的频率特性Hw=[zeros(1,fix(N*fH/fs)),ones(1,N-2*fix(N*fH/fs)),zeros(1,fix(N*fH/fs))];
elseif(get(handles.RB_BandDamp,'Value')==1)f0=2500;
f1=10000;Hw=[ones(1,fix(N*f0/fs)),zeros(1,fix(N*(f1-f0)/fs)),ones(1,N-2*fix(N*f1/fs)),zeros(1,fix(N*(f1-f0)/fs)),ones(1,fix(N*f0/fs))];
else
f0=2500;
f1=10000;Hw=[zeros(1,fix(N*f0/fs)),ones(1,fix(N*(f1-f0)/fs)),zeros(1,N-2*fix(N*f1/fs)),ones(1,fix(N*(f1-f0)/fs)),zeros(1,fix(N*f0/fs))];
endfPyy=Pyy(1:
handles.N/2).*Hw(1:
handles.N/2);
plot(handles.axes4,f,fPyy,'c');
xlabel(handles.axes4,'滤波后信号频谱Freqency(Hz)','fontweight','bold');
ylabel(handles.axes4,'Amplitude','fontweight','bold');
set(handles.axes4,'Color',[000],'XColor',[00.50],'YColor',[00.50]);grid(handles.axes4);
上面代码为理想滤波器频域滤波的部分代码,前一部分的if…;
elseif…;elseif…;else…;enc语句用于判断选择的理想滤波器类型,并用zeros和ones函数生成对应的理想滤波器频率特性离散值。
后一语句
将原始信号经快速傅里叶变换得到的频域特性与滤波器频域特性相乘,即得到滤波后的信号频域特性。
然后,将得到的滤波后的信号频谱图输出到axes4坐标轴上。
(2)音频信号的打开和保存。
实现的代码如下:
I.打开音频文件
functionPB_open_Callback(hObject,eventcata,hancles)
[filename]=uigetfile('*.wav','选择声音文件');if(size(filename,2)>1)%判断是否已打开了声音文件
[s,fs]=wavreac(filename);
set(hancles.musicname,'string',filename);
hancles.s=s(:
1);
hancles.fs=fs;
hancles.sign=0;
guicata(hObject,hancles);
enc
上面代码为打开音频文件按钮的回调函数。
首先利用uigetfile函
数打开检索文件对话框,打开一个wav音频文件,然后根据返回的文件名长度判断是否打开成功,若成功,则将获取到的文件名显示到文本框控件上,并用wavread!
数读取该文件,获取该音频信号的波形数据和采样率。
最后将获取到的波形数据和采样率保存到handies数据
中,方便后面的信号处理和播放。
II.保存音频文件functionPB_save_Callback(hObject,eventdata,handles)if(size(get(handles.musicname,'string'),2)==12&get(handles.musicname,'string')
=='请打开一个音频文件...')
return;
end
[filename]=uiputfile('*.wav','将音频文件另存为');
if(filename==0)
return;
end
wavwrite(handles.s,handles.fs,filename);
上面代码为保存音频文件按钮的回调函数。
首先判断是否已打开了音频文件,若没有打开,则直接返回。
然后,用uiputfile函数打开
用于保存文件的标准对话框,输入保存后的wav文件名,然后用
wavwrite函数将当前播放的音频文件数据写入到该wav音频文件中。
(3)音频播放控制。
实现的代码如下:
I.生成声音文件对象
s=handles.s;
fs=handles.fs;
handles.p=audioplayer(s,fs);
上面代码是用audioplaye函数,由声音波形信号s和采样率fs创建一个声音播放对象。
II.声音播放及控制(暂停、继续、停止、快播和慢播)
声音播放及控制的代码语句如下所示:
play(handles.p);%播放声音对象
pause(handles.p);%暂停播放
resume(handles.p);%继续播放
stop(handles.p);%停止播放
快播:
首先获取声音对象的采样率,然后将采样率放大到1.5倍,
代码如下:
temp=get(handles.p,'SampleRate');
set(handles.p,'SampleRate',1.5*temp);慢播:
首先获取声音对象的采样率,然后将采样率缩小到原来的0.7倍,代码如下:
temp=get(handles.p,'SampleRate');
set(handles.p,'SampleRate',0.7*temp);
III.音量控制
vol=get(handles.slider_vol,'value');
s=vol*s;
handles.p=audioplayer(s,fs);
guidata(hObject,handles);
上面代码为声音播放的回调函数中关于音量控制部分的程序。
首先获取音量控制滑动条的参数值,然后将它与声音信号相乘得到新的声音信号,并由该声音信号生成声音播放对象。
最后将该声音播放对象保存到handie数据中,方便后面的声音播放控制。
(4)均衡器参数设置。
实现的代码如下:
j=get(handies.PM_MusicType,'Vaiue');switchj
case1
case2
set(handles.slider31,'value',3);set(handles.slider62,'value',1);set(handles.slider125,'value',0);set(handles.slider250,'value',-2);set(handles.slider500,'value',-4);
set(handles.slider1k,'value',-4);
set(handles.slider2k,'value',-2);
set(handles.slider4k,'value',0);
set(handles.slider6k,'value',1);set(handles.slider16k,'value',2);
case3
end
case7
a3仁104(round(get(handles.slider31,'value'))/20);a62=104(round(get(handles.slider62,'value'))/20);a125=10.A(round(get(handles.slider125,'value'))/20);a250=10.A(round(get(handles.slider250,'value'))/20);a500=10.A(round(get(handles.slider500,'value'))/20);a1k=10.A(round(get(handles.slider1k,'value'))/20);a2k=10.A(round(get(handles.slider2k,'value'))/20);a4k=10.A(round(get(handles.slider4k,'value'))/20);a6k=10.A(round(get(handles.slider6k,'value'))/20);a16k=10.A(round(get(handles.slider16k,'value'))/20);N=size(s,1);
k=N/fs;
Pf=fft(s);
Hw0=[a31*ones(1,fix(k*31)),a62*ones(1,fix(k*31)),a125*ones(1,fix(k*63)),a250*ones(1,fix(k*125)),a500*ones(1,fix(k*250)),...
a1k*ones(1,fix(k*500)),a2k*ones(1,fix(k*1000)),a4k*ones(1,fix(k*2000)),a6k*ones(1,fix(k*2000))];
Hw1=a16k*ones(1,length(Pf)-2*size(Hw0,2));
Hw=[Hw0Hw1fliplr(Hw0)];
Yw=Pf(:
1).*Hw';
s=ifft(Yw);
handles.p=audioplayer(s,fs);
上面代码前一部分是进行均衡器参数设置(均衡器的参数设置范围为-12dB至+12dB),接着计算出对应频率点的增益,由频段的增益值构造出均衡器的频率特性。
然后通过频域滤波和傅里叶反变换计算出滤波后的声音信号,并由该声音信号构造一个声音播放对象。
4波形显示
1)理想低通滤波结果
MEqualizer
数字滤波器
滤波器颉車特性
频率2000
1B号选择柜齿液
遞渡署类型
Q悵通滤波带咀遞滾
高通滤逋甫通滤浪
o.
«pa=duu<
012345
原始信号浹形Time(s|„10-J
2o
◎p2±dE<
012345
港液后宿号液形Time(s)*佃4
ftl-p5EdE<
0.5115
FreqencyfHz)
0.511.5
炼殆信号穎谱Freqency(Hz)
vpnl二dmv
°;
0.5115
滤液后伯号類iSFreqency(HzJ
x10"
x10
2
x1Q4
(2)理想高通滤波结果
QEqualizer
数字滤波器
频率
2000怡号选择柜齿液
蕊滾器类型
低通淞波带IB滤波
*高通滤滅帝通滤浪
I==-;”-—__J
012345
原始信号激昭Time(sj
eprn--CIE<«
00.5116
FreqencJHz)
«pnsdE<
(3)理想带通滤波结果
QEquaEzer
数字滤波器
I滤披器瓠率特性
信号滤谨
频率20M]信号选择矩齿波
滤波器娄型
低通追涸洁阻遥汹
高通潦汲-帯迪溢遍
片phsdE<
051
15
2
FreqBncy(HE|
x.10*
42Q-2J
VPS二dE<
12345
原始信号濟影Time(s)诃m
12345
瀝波后怡訂滥用Time怕勻
^——1
0OS11.5
0$11.5
終僉后IB号類诵Freq-Ency(Hz)
(4)理想带阻滤波结果
BflEqualizer
频率2W
滤遍脣类型
高通滤波
数字滤波器
信号适波
信号选择柜齿液flj
滤滾器频率特性
1
0.511.5
Fr&qency^Hz)
xia
epn.*ia.UJ_H
1
1.S
05
0
D0.51IS
原始信号3®谱Fr&q^nc¥(Hz||
x10
epni二dwv
JS蛤信号叢形Time
滤波石信号逋时Tim^hk
«pm二duj<
05115
蛙波后伯号频诺Freq&ncy{Hr)
x10
5存在的问题
本次基于MATLAB的数字滤波器和均衡器设计比之前的基于
MATLAB的信号发生器和频谱分析仪设计要难很多。
但是前两次的信设计技巧和方法是本次数字滤波器和均衡器设计的基础。
在本次数字滤波器和均衡器的设计过程中遇到了很多问题,经过查阅资料,有些问题得到了完美的解决,也有些问题解决的不是很好。
下面将设计过程中遇到的问题总结如下:
(1)对进行滤波器设计时,发现在构造理想滤波器频率特性响应时,要注意使滤波器频域特性向量与信号的频域特性向量长度保持一致,且滤波器的频域特性向量应设计成对称形式,不然无法进行信号的频域滤波和傅里叶反变换。
(2)设计音频播放程序时,发现MATLAB的文件读取功能有限,打开30多兆的wav音频文件时,会提示数据内存不够用。
另外,在进行大数据量的矩阵计算时,速度比较慢。
(3)个人感觉MATLAB的多线程能力比较差,本人有考虑使用timer定时器来实现一些功能,比如实现音量的实时改变,均衡器效果的实时改变,播放进度控制等,但都没有成功。
另外,发现这方面的资料很难找,所以只能放弃。
(4)在MATLAB中进行音频文件保存的问题。
MATLAB中用于打开保存文件对话框的函数是uiputfile。
但该函数只是返回一个保存的文件名,实际上并没有真正创建该文件。
使
用时,应在后面用wavwrite函数将要保存的数据写入到该文件名中。
6结束语
本文通过对数字理想滤波器的频域特性构造,将信号发生器产生的标准信号进行频域滤波,生成滤波后的信号频谱图,再对该频域信号进行傅里叶反变换得到滤波后的时域信号。
最后,对滤波前后的时域和频域信号图的对比可以直观的感受到滤波器的频域滤波功能。
利用滤波器的频域滤波原理设计的数字音乐均衡器,通过将人耳能听到的声音频率范围20Hz至20kHz进行分段,分别控制每一频段的信号的增益值,并进行整个频域特性响应的构造,即可得到该频率范围的滤波器。
使用该构造的滤波器对输入的原始声音信号进行频域滤波,并通过傅里叶反变换将滤波后的频域信号转化成的时域波形信号。
然后,再播放该滤波后的声音信号,即可发现声音的音质效果发生了改变。
本程序实现了.wav格式文件的读取和播放控制,包括暂停、继续播放、停止播放、快播和慢播功能。
并提供了多种推荐均衡器参数配置,能实现多种声音效果的变化。
最后还可以使用保存功能将通过均衡器处理后的声音文件另存为一个wav音频文件。
致谢
本次基于MATLAB的数字滤波器和均衡器设计虽然比前两次的信号发生器和频谱分析仪设计要难很多,但是经过自己不断的努力,广泛的查找资料,解决了很多问题,学到了不少东西。
通过这次设计,不仅使我对滤波器的滤波原理有了直观的认识,同时加强了我对使用MATLAB工具进行信号处理的能力。
整个设计过程都是在何老师课上所讲的滤波器时域、频域滤波等理论知识和实例程序演示的基础上进行的。
因此,首先要感谢何老师和他丰富的教学内容和先进的教学方式。
此外,在本次设计的完成过程中,实验室师兄和寝室同学给予了我很多指导,在此一并表示感谢
参考文献
[1]李益华.MATLAB辅助现代工程数字信号处理(第2版)•西安:
西安电子科技大学出版社,2010
[2]雷学堂,徐火希.基于MATLA啲语音滤波实验设计.黄冈师范
学院物电系,2007
[3]赵淑敏.基于MATLA实现对语音信号频谱分析.兰州交通大学
电子与信息工程学院,2010
[4]申鹏.语音信号的滤波处理及时频域分析.湖南工业大学计算
机与通信学院,2010
[5]陈亚勇.MATLAB言号处理详解.北京:
人民邮电出版社,2002