基于matlab的声音信号频谱分析仪设计b3r3hftk.docxVIP

  • 23
  • 0
  • 约4.94千字
  • 约 9页
  • 2018-09-11 发布于湖北
  • 举报

基于matlab的声音信号频谱分析仪设计b3r3hftk.docx

基于matlab的声音信号频谱分析仪设计b3r3hftk

基于MATLAB的声音信号频谱分析仪设计 设计目的及要求 设计目的 基于MATLAB设计一个简易声音信号频谱分析仪。 设计要求 输入方式: ①利用电脑声卡录音; ②打开WAV文件; 时域分析:计算原始信号的幅值,频率,相位; 频域分析:利用快速傅里叶变换(FFT)得到信号的幅频特性和相频特性。 设计原理分析 设计结构 设计的结构图如下: 频谱 频谱分析仪 输入模块 声卡录制 打开WAV文件 分析模块 时域分析 频域分析 幅值 频率 相位 幅频 特性 相频 特性 图像显示模块 幅频特性曲线 相频特性曲线 原始波形 声音输入方式 声卡输入:利用MATLAB中的函数函数获取声卡录制的声音,录制频率和时间可以设置。默认双声道录制。 打开WAV文件:通过MATLAB中的函数获取声音文件。如果获取的信号是单声道信号,则双声道分析不可选。 声道选择 设置一个变量handles.sd,如果选择的是左声道,handles.sd=1;如果是右声道,handles.sd=2;如果是双声道,handles.sd=0;在时域和频域分析的时候,通过handles.sd的值来判断声道。 时域分析 幅值检测:在一个周期内,求出信号最大值与最小值的差的一半,即,同样,也会求出多个值,但第1个值对应的和不是在一个周期内搜索得到的,故以除第1个以外的值的平均作为幅值的估计值。 频率检测:对周期信号来说,可以用时域波形分析来确定信号的周期,也就是计算相邻的两个信号波峰的时间差、或过零点的时间差。这里采用过零点的时间差(周期)。频率即为,由于能够求得多个值(有多个),故采用它们的平均值作为周期的估计值。 相位检测:采用过零法检测,通过判断与同频零相位信号过零点时刻,计算其时间差,然后换成相应的相位差。,同样,以的平均值作为相位的估计值。 计算幅值,频率,相位的流程图如下: 频域分析 对于给定的时域信号y,可以通过变换得到频域信息。可按下式计算 式中,为样本容量,为采样间隔。 采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用 离散变换,即 式中,。但上式的计算效率很低,因为有大量的指数(等价于三角函数)运算,故实际中多采用快速变换()。其原理即是将重复的三角函数算计的中间结果保存起来,以减少重复三角函数计算带来的时间浪费。由于三角函数计算的重复量相当大,故能极大地提高运算效率。 为了直观地表示信号的频率特性,工程上常常将变换的结果用图形的方式表示,即频谱图。 以频率为横坐标,为纵坐标,可以得到幅值谱; 以频率为横坐标,为纵坐标,可以得到相位谱; 软件实现 基于上面的分析,接下来进行 的软件设计。 界面设计 界面介绍: 输入模块具有采样频率(单位是kHz)和采样时间(单位是s)的设置功能,可以对不同长度的声音信号进行采样,同时有打开WAV文件的功能,以便对已有的信号进行处理,利用电脑声卡采样是双声道采样信号。录音结束后会在右方的原始信号显示区域显示波形。 分析模块首先需要选择声道,默认状态为双声道,当选择了某个声道后,点击时域分析,时域分析块中会显示相应的频率,幅值(这里转化为声强,单位是dB)以及相位,当点击频域分析时,在分析模块的下方会显示信号的幅频特性图和相频特性图。 图像显示除了显示幅频特性图和相频特性图之外,也可显示原始信号波形。 程序模块 输入方式相关程序: 录音输入: function pushbutton8_Callback(hObject, eventdata, handles) F=str2double(get(handles.edit1,String)); Fs=F*1000; Time=str2double(get(handles.edit2,String)); N=Time*Fs;%采样长度 handles.y=wavrecord(N,Fs,2,double); handles.sd=0;%默认声道为双声道 handles.inputtype=1; guidata(hObject,handles); plot(handles.axes3,handles.y); axis tight; xlabel(handles.axes3,w/Hz)%画原始波形图 打开WAV文件: function pushbutton18_Callback(hObject, eventdata, handles) [filename,filepath]=uigetfile(*.wav,wavfile); if filename~=0 [handles.y,Fs,bit]=wavread(filename); handles.inputtype=2; guidata(hObject,handles); plot(handles.axes3,(1:length

文档评论(0)

1亿VIP精品文档

相关文档