基MATLAB的简易声音信号频谱分析仪设计Word文档下载推荐.docx
《基MATLAB的简易声音信号频谱分析仪设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基MATLAB的简易声音信号频谱分析仪设计Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
对信号进行频谱分析可以获得更多有用信息,如求得动态信号中的各个频率成分和频率分布范围,求出各个频率成分的幅值分布和能量分布,从而得到主要幅度和能量分布的频率值。
随着信息时代和数字世界的到来,数字信号处理己成为当今一门极其重要的学科和技术领域,数字信号处理在通信、语音、图像、自动控制、医疗和家用电器等众多领域得到了广泛的应用。
任意一个信号都具有时域与频域特性,信号的频谱完全代表了信号,因而研究信号的频谱就等于研究信号本身。
通常从频域角度对信号进行分析与处理,容易对信号的特性获得深入的了解。
因此,信号的频谱分析是数字信号处理技术中的一种较为重要的工具。
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)
为采样时间间隔,
。
由于采用式(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'
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'
%录制声音,并设定时间
上面代码为录制声音按钮的回调函数其中的一部分。
首先利用get函数获取采样率和采样时间编辑框中的参数值,然后用该采样值录制一段声音信号,并将它保存到handles数据中,方便后面的信号处理和播放。
2.2.2.3时域信号的频谱分析。
频域分析包括幅值谱、功率谱等的计算,结果以图形显示出来。
频域分析需要作Fourier变换,MATLAB提供了fft函数,能够方便地实现快速Fourier变换算法。
主要代码:
sample=handles.y(1:
N);
%设置要进行傅里叶变换的样本
sample=do