基MATLAB的简易声音信号频谱分析仪设计.docx
- 文档编号:2904911
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:10
- 大小:150.90KB
基MATLAB的简易声音信号频谱分析仪设计.docx
《基MATLAB的简易声音信号频谱分析仪设计.docx》由会员分享,可在线阅读,更多相关《基MATLAB的简易声音信号频谱分析仪设计.docx(10页珍藏版)》请在冰豆网上搜索。
基MATLAB的简易声音信号频谱分析仪设计
基MATLAB的简易声音信号频谱分析仪设计
摘要
声音是各种信号传递与交流最直接的体现,因此对声音信号的研究有十分重要的意义。
频谱分析技术是进行语音信号处理的基础,DFT及FFT变换是进行数字信号频谱分析的重要方法。
DFT是FFT的基础,FFT是DFT的快速算法。
而MATLAB是一个数据分析和处理功能十分强大的工程实用软件,运用它来进行语音信号的采集、分析和处理,具有实现简单、性价比和灵活度高的特点。
本文介绍了在MATLAB环境中如何采集声音信号和采集后的频谱分析方法,并使用MATLAB软件的GUI模块,设计了一个简易的声音信号频谱分析仪
1介绍
语音信号处理技术是语音处理领域中新近发展起来的一个学科分支。
随着科技的发展,对于语音信号的采集已经有很多种方法,如基于单片机技术、VC,C++等编程、纯硬件电路,本文介绍的方法主要通过一款软件MATLAB。
它是MathWorks公司推出的一种面向工程和科学运算的交互式计算软件,其中包含了一套非常实用的工具--数据采集工具箱。
使用此工具箱更容易将实验测量、数据分析和可视化的应用集合在一起。
数据采集工具箱提供了一整套的命令和函数,通过调用这些命令和函数,可以直接控制数据采集设备的数据采集。
这些数据工具箱使信号的频谱分析,读取MAV文件,处理从声卡中输入的声音信号非常容易。
1.1频谱分析的重要性
频谱分析是把信号的幅值、相位或能量变换以频率坐标轴表示,进而分析其频率特性的一种分析方法。
对信号进行频谱分析可以获得更多有用信息,如求得动态信号中的各个频率成分和频率分布范围,求出各个频率成分的幅值分布和能量分布,从而得到主要幅度和能量分布的频率值。
随着信息时代和数字世界的到来,数字信号处理己成为当今一门极其重要的学科和技术领域,数字信号处理在通信、语音、图像、自动控制、医疗和家用电器等众多领域得到了广泛的应用。
任意一个信号都具有时域与频域特性,信号的频谱完全代表了信号,因而研究信号的频谱就等于研究信号本身。
通常从频域角度对信号进行分析与处理,容易对信号的特性获得深入的了解。
因此,信号的频谱分析是数字信号处理技术中的一种较为重要的工具。
1.2MATLAB处理MAV文件
WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。
WAV格式支持许多压缩算法,支持多种音频位数、采样频率和声道,采用44.1kHz的采样频率,16位量化位数,因此WAV的音质与CD相差无几,但WAV格式对存储空间需求太大不便于交流和传播。
MATLAB有专门的函数库来读取MAV文件,可以显示其波形和播放其声音。
1.3声卡与MATLAB的关联
声卡是多媒体技术中最基本的组成部分,是实现声波/数字信号相互转换的一种硬件。
声卡的基本功能是把来自话筒、磁带、光盘的原始声音信号加以转换,输出到耳机、扬声器、扩音机、录音机等声响设备,或通过音乐设备数字接口(MIDI)使乐器发出美妙的声音。
声卡是计算机最基本的配置硬件之一,价格便宜,使用方便。
MATLAB工具箱集成了一些语音处理功能函数。
本文将给出基于声卡与MATLAB的声音信号频谱分析仪的设计原理与实现方法。
2method
2.1频谱分析原理
时域分析只能反映信号的幅值随时间的变化情况,除单频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。
由于从频域能获得的主要是频率信息,所以本节主要介绍傅立叶变换变换与频谱图的生成。
频谱分析用傅立叶变换将波形x(t)变换为频谱,从另一角度来了解信号特征。
常见傅里叶变换有DFT和FFT。
DFT是FFT的基础,FFT是DFT的快速算法,在MATLAB中可以利用函数fft来计算序列的离散傅里叶变换DFT。
FFT是时域和频域转换的基本运算。
2.1.2离散傅里叶级数
如果x(n)表示周期为N的周期序列,即:
k为任意整数(2-1)
周期序列用离散的傅里叶级数来表达,其表达式如下:
(2-2)
式(2-2)称为周期序列的离散傅里叶变换的级数表示。
对上式进行离散傅里叶逆变换,得:
(2-3)
式(2-3)称为周期序列的离散傅里叶逆变换的级数表示。
记:
(2-4)
这样,结合式(2-2)和式(2-3)周期序列的离散傅里叶级数对可表示为:
2.1.1DFT与FFT
对于给定的一段时域信号,可以通过傅里叶变换得到相应的频域信号。
计算公式如下:
(2-6)
上式中,N为样本点数,
为采样时间间隔。
采样信号的频谱是一个连续的频谱,故采用离散傅里叶变换(即DFT),计算公式如下:
(2-7)
上式中,N为样本点数,
为采样时间间隔,
。
由于采用式(2-7)进行计算时,有大量的指数(等价于三角函数)运算,效率很低,因此实际中多采用快速傅里叶变换(即FFT)。
其原理是通过选择和重新排列,将重复的三角函数计算得到的中间结果保存起来,以减少重复计算带来的时间浪费。
由于三角函数计算的重复量相当大,故FFT能极大地提高运算效率。
2.1.2汉宁窗频谱修正
采用FFT算法计算信号频谱时,设数据点数为N,采样频率为Fs。
则计算得到的离散频率点为:
(2-8)
如果信号中的频率分量与频率取样点不重合,则只能按四舍五入的原则,取相邻的频率取样点谱线值代替。
这就产生了栅栏效应。
频谱的离散取样造成了栅栏效应,谱峰越尖锐,产生误差的可能性就越大。
实际应用中,由于信号截断的原因,产生了能量泄漏,即使信号频率与频谱离散取样点不相等,也能得到该频率分量的一个近似值。
信号截断带来的能量泄漏分主瓣泄漏和旁瓣泄漏,主瓣泄漏可以减小因栅栏效应带来的谱峰幅值估计误差,而旁瓣泄漏则是完全有害的。
实际应用时,可以通过使用截断函数(窗函数)来减小栅栏效应。
下面仅以汉宁窗函数为例,说明其工作原理。
双语对照
汉宁窗函数是余弦平方函数,又称为升余弦函数,它的时域形式可以表示为:
(2-9)
它的频率幅度特性函数为:
(2-10)
汉宁窗的时域和频域曲线图如下所示:
汉宁窗时域波形曲线图汉宁窗频域特性曲线图
在MATLAB中,生成汉宁窗的函数是hanning。
使用该函数进行频谱修正时,先生成一个和待修正的样本具有相同点数的汉宁窗。
然后,将原样本序列和生成的汉宁窗序列相乘,得到修正后的样本。
最后,对修正后的样本进行FFT变换,即可得到修正后的频谱特性曲线。
2.2MATLAB程序设计
2.2.1图形界面设计
MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,为众多学科领域提供了一种简洁、高效的编程工具。
它提供的GUIDE工具为可视化编程工具,使得软件的界面设计像VB一样方便。
故本文采用MATLAB作为编程语言实现声音信号频谱分析仪,首先打开MATLAB,在命令窗口中输入guide命令进入GUI图形设计界面。
再新建一个空白的图形界面文件,添加如下的控件并设计它们的布局.
(1)添加4个axes控件,用于显示时域波形图和频域频谱图;
(2)添加7个statictext控件,用于窗口及其他控件的说明使用;
(3)添加3个panel控件,将一组相关的控件框在一起;
(4)添加6个edit控件,用于输入和显示幅值、频率等参数值;
(5)添加4个pushbutton控件,用于控制播放声音信号.
(6)
添加11个pushbutton控件,其中3个用于控制输出显示相应的信号波形和频谱,2个用于控制播放声音信号,其余6个用于控制3个坐标轴的放大和缩小。
双击各个控件,打开其属性编辑窗,即可修改其名称、颜色、大小、初始值及位置等属性。
最终编辑好的界面如下图所示:
2.2.2MATLAB编程
当界面控件及布局创建完成以后,点击运行即可自动生成包含各控件回调函数在内的m文件。
MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现的。
回调函数即在一定的操作下自动执行的指令代码。
本次设计的简易声音信号频谱分析仪主要功能有声音文件的打开读取,声音信号的采集录制,时域信号的频谱分析以及频谱的汉宁窗口校正。
下面就依次介绍实现各功能M代码的编写。
2.2.2.1WAV声音文件的输入
MATLAB提供了wavread函数,该函数能够方便的打开并读取WAV文件中的声音信息,并且同时读取所有声道。
WAV文件输入程序设计的主要代码:
MATLABprovides thewavreadfunction, thisfunction canbe convenienttoopenand readvoice information intheWAVfile, andreadallthechannelatthesametime .
ThemaincodeofWAV fileinput programdesign:
functionPB_Open_Callback(hObject,eventdata,handles)
[filename]=uigetfile('*.wav','选择声音文件');
[y,fs]=wavread(filename);
handles.y=y;
N=size(handles.y);
guidata(hObject,handles);
t=0:
1/fs:
(N
(1)-1)/fs;
plot(handles.axes1,t,handles.y);
xlabel(handles.axes1,'Time(s)','fontweight','bold');
ylabel(handles.axes1,'Amplitude','fontweight','bold');
grid(handles.axes1);
上面代码为文件打开按钮的回调函数中的一部分,第一句打开文件对话框,限定选择.wav文件,返回选择的文件名。
第二句读取打开的声音文件,并获取音频采样率的值。
接着将获得的信号数据存入handles句柄。
然后,根据获取到的音频采样率和数据长度还原出时间轴序列。
最后将信号波形输出到axes1坐标轴上。
2.2.2.2声卡的输入
这里声卡输入是指由麦克风录音得到的声音信号的输入,MATLAB提供了wavrecord函数,该函数能够实现读取麦克风录音信号。
声卡输入的主要代码:
参数的获取和信号录制及存储
functionPB_Record_Callback(hObject,eventdata,handles)
fs=str2double(get(handles.edit_Fs,'String'));%获取采样频率值
handles.y=wavrecord(5*fs,fs,'int16');%录制声音,并设定时间
guidata(hObject,handles);
上面代码为录制声音按钮的回调函数其中的一部分。
首先利用get函数获取采样率和采样时间编辑框中的参数值,然后用该采样值录制一段声音信号,并将它保存到handles数据中,方便后面的信号处理和播放。
2.2.2.3时域信号的频谱分析。
频域分析包括幅值谱、功率谱等的计算,结果以图形显示出来。
频域分析需要作Fourier变换,MATLAB提供了fft函数,能够方便地实现快速Fourier变换算法。
主要代码:
sample=handles.y(1:
N);%设置要进行傅里叶变换的样本
sample=do
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 简易 声音 信号 频谱 分析 设计