《基于MATLAB的声音信号频谱分析仪设计.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的声音信号频谱分析仪设计.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于MATLAB的声音信号频谱分析仪设计1 设计目的及要求1.1 设计目的基于MATLAB设计一个简易声音信号频谱分析仪。1.2 设计要求(1) 输入方式: 利用电脑声卡录音;打开WAV文件;(2) 时域分析:计算原始信号的幅值,频率,相位;(3) 频域分析:利用快速傅里叶变换(FFT)得到信号的幅频特性和相频特性。2 设计原理分析2.1 设计结构设计的结构图如下:频谱分析仪输入模块声卡录制打开WAV文件分析模块时域分析频域分析幅值频率相位幅频特性相频特性图像显示模块幅频特性曲线相频特性曲线原始波形2.2 声音输入方式(1) 声卡输入:利用MATLAB中的函数函数获取声卡录制的声音,录制频率和
2、时间可以设置。默认双声道录制。(2) 打开WAV文件:通过MATLAB中的函数获取声音文件。如果获取的信号是单声道信号,则双声道分析不可选。2.3 声道选择设置一个变量handles.sd,如果选择的是左声道,=1;如果是右声道,=2;如果是双声道,=0;在时域和频域分析的时候,通过的值来判断声道。2.4 时域分析(1) 幅值检测:在一个周期内,求出信号最大值与最小值的差的一半,即,同样,也会求出多个值,但第1个值对应的和不是在一个周期内搜索得到的,故以除第1个以外的值的平均作为幅值的估计值。(2) 频率检测:对周期信号来说,可以用时域波形分析来确定信号的周期,也就是计算相邻的两个信号波峰的时
3、间差、或过零点的时间差。这里采用过零点的时间差(周期)。频率即为,由于能够求得多个值(有多个),故采用它们的平均值作为周期的估计值。(3) 相位检测:采用过零法检测,通过判断与同频零相位信号过零点时刻,计算其时间差,然后换成相应的相位差。,同样,以的平均值作为相位的估计值。计算幅值,频率,相位的流程图如下:2.5 频域分析对于给定的时域信号y,可以通过变换得到频域信息。可按下式计算式中,为样本容量,为采样间隔。采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用离散变换,即式中,。但上式的计算效率很低,因为有大量的指数(等价于三角函数)运算,故实际中多采用快速变换()。其原理即是将
4、重复的三角函数算计的中间结果保存起来,以减少重复三角函数计算带来的时间浪费。由于三角函数计算的重复量相当大,故能极大地提高运算效率。为了直观地表示信号的频率特性,工程上常常将变换的结果用图形的方式表示,即频谱图。以频率为横坐标,为纵坐标,可以得到幅值谱;以频率为横坐标,为纵坐标,可以得到相位谱;3 软件实现基于上面的分析,接下来进行 的软件设计。3.1 界面设计界面介绍:(1) 输入模块具有采样频率(单位是kHz)和采样时间(单位是s)的设置功能,可以对不同长度的声音信号进行采样,同时有打开WAV文件的功能,以便对已有的信号进行处理,利用电脑声卡采样是双声道采样信号。录音结束后会在右方的原始信
5、号显示区域显示波形。(2) 分析模块首先需要选择声道,默认状态为双声道,当选择了某个声道后,点击时域分析,时域分析块中会显示相应的频率,幅值(这里转化为声强,单位是dB)以及相位,当点击频域分析时,在分析模块的下方会显示信号的幅频特性图和相频特性图。(3) 图像显示除了显示幅频特性图和相频特性图之外,也可显示原始信号波形。3.2 程序模块输入方式相关程序:录音输入:function pushbutton8_Callback(hObject, eventdata, handles)F=str2double(get(handles.edit1,String);Fs=F*1000;Time=str2
6、double(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
7、,filepath=uigetfile(*.wav,wavfile);if filename=0handles.y,Fs,bit=wavread(filename);handles.inputtype=2;guidata(hObject,handles);plot(handles.axes3,(1:length(handles.y)/Fs,handles.y);xlabel(handles.axes3,w/Hz)s=size(handles.y);if s(2)=1%如果输入是单声道,则右声道和双声道按钮不可选 set(handles.pushbutton7,Enable,off); set(
8、handles.pushbutton17,Enable,off);endend信号分析相关程序:声道选择:双声道function pushbutton17_Callback(hObject, eventdata, handles)handles.sd=0;guidata(hObject, handles);plot(handles.axes3,handles.y);axis tightxlabel(handles.axes3,w/Hz)左声道function pushbutton4_Callback(hObject, eventdata, handles)handles.sd=1;guidat
9、a(hObject, handles);plot(handles.axes3,handles.y(:,1),r);axis tightxlabel(handles.axes3,w/Hz) 右声道function pushbutton7_Callback(hObject, eventdata, handles)handles.sd=2;guidata(hObject, handles);plot(handles.axes3,handles.y(:,2),b);axis tightxlabel(handles.axes3,w/Hz)时域分析:function pushbutton16_Callba
10、ck(hObject, eventdata, handles)F=str2double(get(handles.edit1,String);Fs=F*1000;b=handles.sd;switch b case 0 sample=; case 1 sample=handles.y(:,1); case 2 sample=handles.y(:,2);end%计算频率n=1;ymax=max(sample(1) sample(2);ymin=min(sample(1) sample(2);for i=2:length(sample)-1; if sample(i-1)0 & sample(i-
11、2)=0 & sample(i+1)0 if sample(i)=0 ti(n)=i; else ti(n)=i-sample(i)/(sample(i)-sample(i-1); end amp(n)=(ymax-ymin)/2;%幅值 ymax=0; ymin=0; n=n+1; else if ymaxsample(i) ymin=sample(i); end endendn=n-1;for i=1:n-1 T(i)=ti(i+1)-ti(i);endfreq=Fs/mean(T);%频率phase=2*pi*(1-(ti(1:n-1)-1)./T+floor(ti(1:n-1)-1).
12、/T);%相位set(handles.text3,string,strcat(num2str(freq),Hz);set(handles.text5,String,strcat(num2str(-20*log(mean(amp(2:n-1),dB);%分贝set(handles.text7,string,num2str(mean(phase);频域分析function pushbutton15_Callback(hObject, eventdata, handles)F=str2double(get(handles.edit1,String);Fs=F*1000;N0=double(size(
13、handles.y);N=N0(1);b=handles.sd;switch b%对选择的声道进行判断 case 0 sample=handles.y; color=g;%设置颜色,下同 case 1 sample=handles.y(:,1); color=r; case 2 sample=handles.y(:,2); color=b;endf=linspace(0,Fs/2,N/2);P=2*fft(sample,N)/N;pyy=sqrt(P.*conj(P);plot(handles.axes4,f,pyy(1:N/2),color);axes(handles.axes4);axis
14、 tight;xlabel(w/Hz);plot(handles.axes5,f,angle(P(1:N/2),color);xlabel(handles.axes5,w/Hz);4 测试为了验证该程序的可行性,本文利用电脑声卡录制了一段声音信号,并进行了相应的时域和频域分析。左声道:右声道:5 设计体会首先是对MATLAB软件有了更多的了解,小组成员中多数人以前从来没有接触过MATLAB编程,通过这次的频谱分析仪设计,对MATLAB编程语言的简便性和实用性印象深刻,MATLAB中的M语言相对于C语言来说更加简单,有很多可以直接调用的库函数和工具箱可以使用,降低了编程的难度,但也存在很多缺点,比如在运行复杂的程序时,速度比较慢。然后是小组成员之间的的合作是解决问题的关键,负责查找资料,编写程序,结果分析都有相应的分工,其中也出现了很多创新点,例如对于声道的选择,采用了一个状态变量handles.sd来判断声道选择,在界面设计上也有很多人性化的因素,比如在关闭界面的时候,一般情况下是直接退出,我们在退出前会有一个提示对话框,减少了失误操作带来的损失。虽然是一次简单的程序设计作业,但是每个人都有一定的收获,动手能力得到了锻炼。