1、基于MATLAB的简易声音信号频谱分析仪设计摘 要通过MATLAB强大的信号处理功能,先设计了几个理想滤波器,通过对理想滤波器的滤波特性分析对比,可以更直观得认识滤波器的功能。利用滤波器原理,结合数字均衡器的设计要求,对各种数字音频信号进行滤波处理,设计出一种可调节参数的数字滤波器,即一种均衡器。本文的数字均衡器以MATLAB为设计平台,有.wav文件的获取、滤波、保存和播放控制功能。在对声音文件进行频率分析的基础上,用10段均衡器可对声音信号进行调节后保存播放。关键字:MATLAB,滤波器,均衡器,傅里叶反变换1 概述随着数字化技术的快速、深入发展,人们对数字化电子产品所产生的图像、图形以及
2、声音等质量的要求越来越高。在实时数字处理过程中,往往需要对目标信号进行滤波处理,以满足用户对信号的要求。MATLAB 是一个数据分析和处理功能十分强大的工程实用软件,它的滤波器设计工具箱为实现声音信号的数字滤波提供了十分方便的函数和命令。本文将介绍基于MATLAB设计出的一种实用的数字滤波器,并对其功能进行扩展,设计出一种均衡器。2 设计原理滤波器的种类很多,按所通过信号的频段分为低通、高通、带通和带阻滤波器四种。低通滤波器:它允许信号中的低频或直流分量通过,抑制高频分量或干扰和噪声。高通滤波器:它允许信号中的高频分量通过,抑制低频或直流分量。带通滤波器:它允许一定频段的信号通过,抑制低于或高
3、于该频段的信号、干扰和噪声。带阻滤波器:它抑制一定频段内的信号,允许该频段以外的信号通过。上述每种滤波器又可以分为模拟滤波器和数字滤波器。如果滤波器的输入输出都是数字信号,则这样的滤波器称之为数字滤波器。根据数字滤波器冲激响应的时域特性,可将数字滤波器分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。2.1 滤波器设计原理滤波器就是对系统的输入信号进行滤波。输入x(n)和输出y(n)之间的关系是脉冲响应h(n),即 (2-1)如果滤波器的输入输出都为离散信号,那么该滤波器的脉冲响应也应该是离散信号,这样滤波器就成为了数字滤波器。上面的系统为时域离散系统时,其频域特性为
4、 (2-2)其中、分别是数字滤波器的输出序列和输入序列的频域特性,是数字滤波器的频域响应。可以看出,输入序列的频谱经过滤波后变成了;因此按照输入信号频谱的特点和处理信号的目的适当选择,使得滤波后的满足设计性能要求。在MATLAB中主要有Filter函数、Filtfilt函数等滤波函数。Filter函数滤波器的标准差分方程为 (2-3)如果不为1,那么滤波器的系数将用进行归一化处理,即各系数同除以。2.2 均衡器设计原理10段滤波器能够对以下几个频率段进行滤波,各段的音感特征如下所示:3060Hz(沉闷);60100Hz(沉重);100200Hz(丰满);200500Hz(力度);5001KHz
5、(明朗);1K2KHz(透亮);2K4Kz(尖锐);4K8Kz(清脆);8K16Kz(纤细)。通过对各频段的滤波特性设置即可调出不同的音效。打开音频文件后,先对原始声音信号进行傅里叶变换处理,然后从滚动条上获得各频段的滤波特性值,通过换算得到增益值,并构造滤波器频域特性响应,即可得到该频率范围的滤波器。使用该构造的滤波器对输入的原始声音信号进行频域滤波,并通过傅里叶反变换将滤波后的频域信号转化成的时域波形信号。然后,再播放该滤波后的声音信号,即可发现声音的音质效果发生了改变。这就是均衡器的基本工作原理。3 MATLAB程序设计3.1 模块设计该MATLAB程序的模块设计如下图所示。图1 模块设
6、计图3.2 图形界面设计首先打开MATLAB,在命令窗口中输入guide命令进入GUI图形设计界面。再新建一个空白的图形界面文件,添加如下的控件并设计它们的布局。(1) 添加5个axes控件,用于显示时域波形图和频域频谱图;(2) 添加4个static text控件,用于窗口及其他控件的说明使用;(3) 添加6个panel控件,将一组相关的控件框在一起;(4) 添加1个edit控件,用于输入频率参数值;(5) 添加2个pop-up menu控件,用于选择信号发生器产生的信号类型和均衡器参数配置;(6) 添加4个radiobutton,用于选择滤波器类型;(7) 添加11个slider控件,用于
7、设置均衡器参数和音量大小;(8) 添加11个push button控件,其中6个用于控制音频文件播放,2个用于打开和保存文件,其余3个用于控制均衡器设置。双击各个控件,打开其属性编辑窗,即可修改其名称、颜色、大小、初始值及位置等属性。最终编辑好的界面如下图所示:3.3 MATLAB编程当界面控件及布局创建完成以后,点击运行即可自动生成包含各控件回调函数在内的m文件。MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现的。回调函数即在一定的操作下自动执行的指令代码。本次数字滤波器及均衡器的设计主要功能有数字信号发生器,信号频谱分析显示,理想滤波器滤波,音频文件的打
8、开及保存,音频播放控制及均衡器效果设置等。下面仅介绍实现几个主要功能的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=zer
9、os(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
10、(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,0 0 0,X
11、Color,0 0.5 0,YColor,0 0.5 0);grid(handles.axes4);上面代码为理想滤波器频域滤波的部分代码,前一部分的if ; elseif ; elseif ; else ; end语句用于判断选择的理想滤波器类型,并用zeros和ones函数生成对应的理想滤波器频率特性离散值。后一语句将原始信号经快速傅里叶变换得到的频域特性与滤波器频域特性相乘,即得到滤波后的信号频域特性。然后,将得到的滤波后的信号频谱图输出到axes4坐标轴上。(2)音频信号的打开和保存。实现的代码如下:I. 打开音频文件function PB_open_Callback(hObject,
12、 eventdata, handles)filename = uigetfile(*.wav,选择声音文件);if(size(filename,2)1) % 判断是否已打开了声音文件 s,fs = wavread(filename); set(handles.musicname,string,filename); handles.s=s(:,1); handles.fs=fs; handles.sign=0; guidata(hObject,handles); end上面代码为打开音频文件按钮的回调函数。首先利用uigetfile函数打开检索文件对话框,打开一个wav音频文件,然后根据返回的文
13、件名长度判断是否打开成功,若成功,则将获取到的文件名显示到文本框控件上,并用wavread函数读取该文件,获取该音频信号的波形数据和采样率。最后将获取到的波形数据和采样率保存到handles数据中,方便后面的信号处理和播放。II. 保存音频文件function PB_save_Callback(hObject, eventdata, handles)if(size(get(handles.musicname,string),2)=12 & get(handles.musicname,string) =请打开一个音频文件.) return;endfilename = uiputfile(*.wa
14、v,将音频文件另存为);if(filename=0) return;endwavwrite(handles.s,handles.fs,filename);上面代码为保存音频文件按钮的回调函数。首先判断是否已打开了音频文件,若没有打开,则直接返回。然后,用uiputfile函数打开用于保存文件的标准对话框,输入保存后的wav文件名,然后用wavwrite函数将当前播放的音频文件数据写入到该wav音频文件中。(3)音频播放控制。实现的代码如下:I. 生成声音文件对象s=handles.s;fs=handles.fs;handles.p = audioplayer(s, fs);上面代码是用audi
15、oplayer函数,由声音波形信号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);慢播:首先获取声音对象的采样率,然后将采样率缩小到原来
16、的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); 上面代码为声音播放的回调函数中关于音量控制部分的程序。首先获取音量控制滑动条的参数值,然后将它与声音信号相乘得到新的声音信号,并由该声音信号生成声音播放对象。最后将该声音播放对象保存到handles数据中,方便后面的声音播放控制。(
17、4)均衡器参数设置。实现的代码如下:j=get(handles.PM_MusicType,Value);switch j case 1 case 2 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); s
18、et(handles.slider4k,value,0); set(handles.slider6k,value,1); set(handles.slider16k,value,2); case 3 case 7enda31=10.(round(get(handles.slider31,value)/20); a62=10.(round(get(handles.slider62,value)/20); a125=10.(round(get(handles.slider125,value)/20); a250=10.(round(get(handles.slider250,value)/20);
19、 a500=10.(round(get(handles.slider500,value)/20); a1k=10.(round(get(handles.slider1k,value)/20); a2k=10.(round(get(handles.slider2k,value)/20); a4k=10.(round(get(handles.slider4k,value)/20); a6k=10.(round(get(handles.slider6k,value)/20); a16k=10.(round(get(handles.slider16k,value)/20); N=size(s,1);
20、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=Hw0 Hw1 fliplr(Hw0); Yw=Pf(:
21、,1).*Hw; s=ifft(Yw); handles.p = audioplayer(s, fs);上面代码前一部分是进行均衡器参数设置(均衡器的参数设置范围为-12dB至+12dB),接着计算出对应频率点的增益,由频段的增益值构造出均衡器的频率特性。然后通过频域滤波和傅里叶反变换计算出滤波后的声音信号,并由该声音信号构造一个声音播放对象。4 波形显示(1) 理想低通滤波结果(2) 理想高通滤波结果(3) 理想带通滤波结果(4) 理想带阻滤波结果5 存在的问题本次基于MATLAB的数字滤波器和均衡器设计比之前的基于MATLAB的信号发生器和频谱分析仪设计要难很多。但是前两次的信设计技巧和方
22、法是本次数字滤波器和均衡器设计的基础。在本次数字滤波器和均衡器的设计过程中遇到了很多问题,经过查阅资料,有些问题得到了完美的解决,也有些问题解决的不是很好。下面将设计过程中遇到的问题总结如下:(1) 对进行滤波器设计时,发现在构造理想滤波器频率特性响应时,要注意使滤波器频域特性向量与信号的频域特性向量长度保持一致,且滤波器的频域特性向量应设计成对称形式,不然无法进行信号的频域滤波和傅里叶反变换。(2) 设计音频播放程序时,发现MATLAB的文件读取功能有限,打开30多兆的wav音频文件时,会提示数据内存不够用。另外,在进行大数据量的矩阵计算时,速度比较慢。(3) 个人感觉MATLAB的多线程能
23、力比较差,本人有考虑使用timer定时器来实现一些功能,比如实现音量的实时改变,均衡器效果的实时改变,播放进度控制等,但都没有成功。另外,发现这方面的资料很难找,所以只能放弃。(4) 在MATLAB中进行音频文件保存的问题。MATLAB中用于打开保存文件对话框的函数是uiputfile。但该函数只是返回一个保存的文件名,实际上并没有真正创建该文件。使用时,应在后面用wavwrite函数将要保存的数据写入到该文件名中。6 结束语本文通过对数字理想滤波器的频域特性构造,将信号发生器产生的标准信号进行频域滤波,生成滤波后的信号频谱图,再对该频域信号进行傅里叶反变换得到滤波后的时域信号。最后,对滤波前
24、后的时域和频域信号图的对比可以直观的感受到滤波器的频域滤波功能。利用滤波器的频域滤波原理设计的数字音乐均衡器,通过将人耳能听到的声音频率范围20Hz至20kHz进行分段,分别控制每一频段的信号的增益值,并进行整个频域特性响应的构造,即可得到该频率范围的滤波器。使用该构造的滤波器对输入的原始声音信号进行频域滤波,并通过傅里叶反变换将滤波后的频域信号转化成的时域波形信号。然后,再播放该滤波后的声音信号,即可发现声音的音质效果发生了改变。本程序实现了.wav格式文件的读取和播放控制,包括暂停、继续播放、停止播放、快播和慢播功能。并提供了多种推荐均衡器参数配置,能实现多种声音效果的变化。最后还可以使用
25、保存功能将通过均衡器处理后的声音文件另存为一个wav音频文件。致 谢本次基于MATLAB的数字滤波器和均衡器设计虽然比前两次的信号发生器和频谱分析仪设计要难很多,但是经过自己不断的努力,广泛的查找资料,解决了很多问题,学到了不少东西。通过这次设计,不仅使我对滤波器的滤波原理有了直观的认识,同时加强了我对使用MATLAB工具进行信号处理的能力。整个设计过程都是在何老师课上所讲的滤波器时域、频域滤波等理论知识和实例程序演示的基础上进行的。因此,首先要感谢何老师和他丰富的教学内容和先进的教学方式。此外,在本次设计的完成过程中,实验室师兄和寝室同学给予了我很多指导,在此一并表示感谢。参考文献1 李益华. MATLAB辅助现代工程数字信号处理(第2版). 西安:西安电子科技大学出版社,20102 雷学堂,徐火希. 基于MATLAB的语音滤波实验设计. 黄冈师范学院物电系,20073 赵淑敏. 基于MATLAB实现对语音信号频谱分析. 兰州交通大学电子与信息工程学院,20104 申鹏. 语音信号的滤波处理及时频域分析. 湖南工业大学计算机与通信学院,20105 陈亚勇. MATLAB信号处理详解. 北京:人民邮电出版社,2002word文档 可自由编辑
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922