下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 基于MATLAB的简易声音信号频谱分析仪设计

基于MATLAB的简易声音信号频谱分析仪设计.doc

基于MATLAB的简易声音信号频谱分析仪设计

最逅壹首离歌lol
2019-01-17 0人阅读 举报 0 0 暂无简介

简介:本文档为《基于MATLAB的简易声音信号频谱分析仪设计doc》,可适用于IT/计算机领域

基于MATLAB的简易声音信号频谱分析仪设计摘 要语音信号处理技术是语音处理领域中新近发展起来的一个学科分支而频谱分析技术是进行语音信号处理的基础。DFT及FFT变换是进行数字信号频谱分析的重要方法。DFT是FFT的基础,FFT是DFT的快速算法。MATLAB是一个数据分析和处理功能十分强大的工程实用软件运用它来进行语音信号的采集、分析和处理相当方便。本文介绍了在MATLAB环境中如何采集声音信号和采集后的频谱分析方法并使用MATLAB软件的GUI模块设计了一个简易的声音信号频谱分析仪。关键字:MATLABFFT声音信号频谱分析概述随着信息时代和数字世界的到来,数字信号处理己成为当今一门极其重要的学科和技术领域,数字信号处理在通信、语音、图像、自动控制、医疗和家用电器等众多领域得到了广泛的应用。任意一个信号都具有时域与频域特性,信号的频谱完全代表了信号,因而研究信号的频谱就等于研究信号本身。通常从频域角度对信号进行分析与处理,容易对信号的特性获得深入的了解。因此,信号的频谱分析是数字信号处理技术中的一种较为重要的工具【】。声卡是计算机最基本的配置硬件之一价格便宜使用方便。MATLAB工具箱集成了一些语音处理功能函数。本文将给出基于声卡与MATLAB的声音信号频谱分析仪的设计原理与实现方法。设计原理频谱分析用傅立叶变换将波形x(t)变换为频谱X(f)从另一角度来了解信号特征。常见傅里叶变换有DFT和FFT。DFT是FFT的基础,FFT是DFT的快速算法,在MATLAB中可以利用函数fft来计算序列的离散傅里叶变换DFT。FFT是时域和频域转换的基本运算。离散傅里叶级数如果x(n)表示周期为N的周期序列即:k为任意整数        ()周期序列用离散的傅里叶级数来表达其表达式如下:()式()称为周期序列的离散傅里叶变换的级数表示。对上式进行离散傅里叶逆变换得:()式()称为周期序列的离散傅里叶逆变换的级数表示。记:()这样结合式()和式()周期序列的离散傅里叶级数对可表示为:()DFT和FFT变换对于给定的一段时域信号可以通过傅里叶变换得到相应的频域信号。计算公式如下:()上式中N为样本点数为采样时间间隔。采样信号的频谱是一个连续的频谱故采用离散傅里叶变换(即DFT)计算公式如下:()上式中N为样本点数为采样时间间隔。由于采用式()进行计算时有大量的指数(等价于三角函数)运算效率很低因此实际中多采用快速傅里叶变换(即FFT)。其原理是通过选择和重新排列将重复的三角函数计算得到的中间结果保存起来以减少重复计算带来的时间浪费。由于三角函数计算的重复量相当大故FFT能极大地提高运算效率。汉宁窗频谱修正采用FFT算法计算信号频谱时设数据点数为N采样频率为Fs。则计算得到的离散频率点为:()如果信号中的频率分量与频率取样点不重合则只能按四舍五入的原则取相邻的频率取样点谱线值代替。这就产生了栅栏效应。频谱的离散取样造成了栅栏效应谱峰越尖锐产生误差的可能性就越大。实际应用中由于信号截断的原因产生了能量泄漏即使信号频率与频谱离散取样点不相等也能得到该频率分量的一个近似值。信号截断带来的能量泄漏分主瓣泄漏和旁瓣泄漏主瓣泄漏可以减小因栅栏效应带来的谱峰幅值估计误差而旁瓣泄漏则是完全有害的。实际应用时可以通过使用截断函数(窗函数)来减小栅栏效应。下面仅以汉宁窗函数为例说明其工作原理。汉宁窗函数是余弦平方函数又称为升余弦函数它的时域形式可以表示为:()它的频率幅度特性函数为:()汉宁窗的时域和频域曲线图如下所示:汉宁窗时域波形曲线图          汉宁窗频域特性曲线图在MATLAB中生成汉宁窗的函数是hanning。使用该函数进行频谱修正时先生成一个和待修正的样本具有相同点数的汉宁窗。然后将原样本序列和生成的汉宁窗序列相乘得到修正后的样本。最后对修正后的样本进行FFT变换即可得到修正后的频谱特性曲线。MATLAB程序设计图形界面设计首先打开MATLAB在命令窗口中输入guide命令进入GUI图形设计界面。再新建一个空白的图形界面文件添加如下的控件并设计它们的布局。()添加个axes控件用于显示时域波形图和频域频谱图()添加个statictext控件用于窗口及其他控件的说明使用()添加个panel控件将一组相关的控件框在一起()添加个edit控件用于输入和显示幅值、频率等参数值()添加个popupmenu控件用于选择信号发生器产生的信号类型()添加个pushbutton控件其中个用于控制输出显示相应的信号波形和频谱个用于控制播放声音信号其余个用于控制个坐标轴的放大和缩小。双击各个控件打开其属性编辑窗即可修改其名称、颜色、大小、初始值及位置等属性。最终编辑好的界面如下图所示:MATLAB编程当界面控件及布局创建完成以后点击运行即可自动生成包含各控件回调函数在内的m文件。MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现的。回调函数即在一定的操作下自动执行的指令代码。本次简易声音信号频谱分析仪设计的主要功能有声音文件的打开读取声音信号的采集录制信号发生器产生波形时域信号的频谱分析以及频谱的汉宁窗口校正。下面就依次介绍实现各功能M代码的编写。()wav声音文件的打开读取。实现的代码及说明如下:functionPBOpenCallback(hObject,eventdata,handles)filename=uigetfile('*wav','选择声音文件')y,fs=wavread(filename)handlesy=yN=size(handlesy)guidata(hObject,handles)t=:fs:(N())fsplot(handlesaxes,t,handlesy)xlabel(handlesaxes,'Time(s)','fontweight','bold')ylabel(handlesaxes,'Amplitude','fontweight','bold')grid(handlesaxes)上面代码为文件打开按钮的回调函数中的一部分第一句打开文件对话框限定选择wav文件返回选择的文件名。第二句读取打开的声音文件并获取音频采样率的值。接着将获得的信号数据存入handles句柄。然后根据获取到的音频采样率和数据长度还原出时间轴序列。最后将信号波形输出到axes坐标轴上。()声音信号的采集录制。实现的代码如下:functionPBRecordCallback(hObject,eventdata,handles)fs=strdouble(get(handleseditFs,'String'))  获取采样频率值handlesy=wavrecord(*fs,fs,'int')      录制声音并设定时间guidata(hObject,handles)上面代码为录制声音按钮的回调函数其中的一部分。首先利用get函数获取采样率编辑框中的参数值然后用该采样率录制一段声音信号并将它保存到handles数据中方便后面的信号处理和播放。()信号发生器产生波形。实现的代码如下:functionPBSignalGenerationCallback(hObject,eventdata,handles)fs=strdouble(get(handleseditFs,'String'))a=strdouble(get(handleseditamplitude,'String'))f=strdouble(get(handleseditfrequency,'String'))t=:fs:i=get(handlesPMSignaltype,'Value')switchicasehandlesy=a*sin(*pi*f*t)casehandlesy=a*square(*pi*f*t)casehandlesy=a*sawtooth(*pi*f*t,)casehandlesy=a*sawtooth(*pi*f*t)casehandlesy=sqrt(a)*randn(size(t))endguidata(hObject,handles)上面代码为信号产生分析按钮的回调函数其中的一部分。前三句利用get函数获取到采样频率、产生信号的幅度和频率值然后再获取弹出菜单控件的选择项序号根据选择项序号的值用switch语句和MATLAB自带的波形函数产生相对应的信号波形数据。最后将生成的波形数据保存到handles数据中方便后面的信号处理。()时域信号的频谱分析。实现的代码如下:sample=handlesy(:N)   设置要进行傅里叶变换的样本sample=double(sample)P=fft(sample,N)       对样本数据进行FFT变换Pyy=*sqrt(P*conj(P))N    计算频谱幅度f=linspace(,fs,N)      还原真实频率plot(handlesaxes,f,Pyy(:N))  画频谱图Y,I=max(Pyy(:N))    获取频谱图中的谱峰频率和幅值set(handleseditTestA,'string',numstr(Y))set(handleseditTestF,'string',numstr(I))xlabel(handlesaxes,'Freqency(Hz)','fontweight','bold')ylabel(handlesaxes,'Amplitude','fontweight','bold')grid(handlesaxes)上面代码为对已存好的信号时域数据进行频域分析的实现过程。首先截取时域信号中的一段数据作为进行傅里叶变换的样本数据。再用MATLAB自带的fft函数进行FFT变换。接着计算频谱幅度并获取谱峰的频率和幅度。最后绘出频谱图并显示谱峰参数。()频谱的汉宁窗口校正。实现的代码如下:h=hanning(N)      生成一个汉宁窗口yn=sample*h'      用汉宁窗修正样本数据Pn=fft(yn,N)    对修正后的样本数据进行FFT变换Pyyn=*sqrt(Pn*conj(Pn))Nplot(handlesaxes,f,Pyyn(:N))xlabel(handlesaxes,'Freqency(Hz)','fontweight','bold')ylabel(handlesaxes,'Amplitude','fontweight','bold')legend(handlesaxes,'加汉宁窗修正后频谱')grid(handlesaxes)上面代码为对进行频谱分析的样本进行汉宁窗修正并对新样本进行频谱分析的实现过程。首先生成一个汉宁窗向量将原样本数据与汉宁窗向量相乘从而得到新的样本数据yn对该新样本进行傅里叶变换即可得到经过汉宁窗修正后的频谱图。波形显示()读取声音文件信号的分析()录制声音文件信号的分析()信号发生器产生信号的分析存在的问题个人感觉对于初学者来说本次基于MATLAB的简易声音信号频谱分析仪设计比之前的基于MATLAB的信号发生器设计要难很多。但是上次的信号发生器的设计技巧和方法是本次频谱分析仪设计的基础。在本次频谱分析仪的设计过程中遇到了很多问题经过查阅资料有些问题得到了完美的解决也有些问题解决的不是很好。下面将设计过程中遇到的问题总结如下:()对在MATLAB中画多个图形的问题。本次设计由于要使用到多个坐标轴因此原来在一个坐标轴中使用的画图相关函数(如plotxlabelgridon等)都不能直接使用了而必须要在其参数中加入坐标轴的句柄才能使用。()MATLAB中的软件调试问题。在本次设计的M代码调试过程中经常出现plot函数报错的问题错误信息提示为参数维数不一致。为了找到出错的准确位置我尝试着在代码中加入了一些如disp(size(y))函数将矩阵或向量的维数打印到MATLAB的命令窗口中从而快速进行问题定位。()对在MATLAB中打开文件对话框的问题。MATLAB中用于打开文件对话框的函数是uigetfile。该函数可以有多个输入参数和输出结果。本设计中参数设置时限定了打开的文件类型为wav类型返回值是打开的文件名。()MATLAB提供的声音文件读取函数和录音函数的使用问题。MATLAB中用于声音读取的函数是wavread该函数输入参数为文件名输出结果有双声道的声音信号矩阵和音频采样率值。MATLAB中基于PC的录音函数是wavrecord使用该函数时发现必须先设定好录音的时间。对于该问题我想过用多种方法来解决但还是没有找到十分好的解决办法。()对频谱图的缩放控制问题。由于频谱图中的谱峰较少而谱峰位置不确定。为了使对频谱图进行缩放控制时时钟显示出谱峰的位置因此在进行缩放控制时先读取了谱峰所在的频率位置参数使该位置始终处于我的坐标轴的显示范围中。()对用汉宁窗进行频谱校正的理解问题。本程序设计中的汉宁窗校正直接使用了MATLAB中提供的hanning窗口函数。由于对该函数的实现过程不是很清楚因此不确定其效果是否有效。结束语本文通过对数字信号发生器常用几种波形信号进行时域和频域分析及对采集和读取到的声音信号进行时域和频域分析通过傅里叶变换将信号的时域波形和频谱特征对应起来。用MATLAB中提供的基于PC的声音录制和读取函数实现了wav格式文件的读取和播放。通过使用信号发生器对比进行傅里叶变换前后的参数验证了频率分析结果。通过对频谱图分析得到了检测的频率和幅值。通过GUI模块进行界面设计最终程序运行的结果比较好。基本实现了设计的任务要求。致 谢本次基于MATLAB的简易声音信号频谱分析仪的设计虽然比上次的信号发生器的设计要难很多但是经过自己不断的努力广泛的查找资料解决了很多问题。通过这次设计不仅使我对信号的傅里叶变换有了直观的认识同时加深了我对MATLAB工具的使用能力。整个设计过程都是在何老师课上所讲的傅里叶变换及频谱加窗校正等理论知识和实例程序演示的基础上进行的。因此首先要感谢何老师和他丰富的教学内容和先进的教学方式。此外在本次设计的完成过程中实验室师兄和寝室同学给予了我指导在此一并表示感谢。参考文献李益华MATLAB辅助现代工程数字信号处理(第版)西安:西安电子科技大学出版社刘小群周云波基于Matlab的DFT及FFT频谱分析山西电子技术,赵淑敏基于MATLAB实现对语音信号频谱分析兰州交通大学电子与信息工程学院,

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/16

基于MATLAB的简易声音信号频谱分析仪设计

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利