基于MATLAB的数字滤波器和均衡器设计_第1页
基于MATLAB的数字滤波器和均衡器设计_第2页
基于MATLAB的数字滤波器和均衡器设计_第3页
基于MATLAB的数字滤波器和均衡器设计_第4页
基于MATLAB的数字滤波器和均衡器设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 结束语本文通过对数字理想滤波器的频域特性构造,将信号发生器产生的标准信号进行频域滤波,生成滤波后的信号频谱图,再对该频域信号进行傅里叶反变换得到滤波后的时域信号。最后,对滤波前后的时域和频域信号图的对比可以直观的感受到滤波器的频域滤波功能。利用滤波器的频域滤波原理设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论