实验八 音频频谱分析仪设计与实现Word格式文档下载.docx
《实验八 音频频谱分析仪设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验八 音频频谱分析仪设计与实现Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
5、频谱分析原理
时域分析只能反映信号的幅值随时间的变化情况,除但频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。
(1)DFT与FFT
对于给定的时域信号y,可以通过Fourier变换得到频域信息Y。
Y可按下式计算
式中,N为样本容量,Δt=1/Fs为采样间隔。
采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用离散Fourier变换(DFT),即
式中,Δf=Fs/N。
但上式的计算效率很低,因为有大量的指数(等价于三角函数)运算,故实际中多采用快速Fourier变换(FFT)。
其原理即是将重复的三角函数算计的中间结果保存起来,以减少重复三角函数计算带来的时间浪费。
由于三角函数计算的重复量相当大,故FFT能极大地提高运算效率。
(2)频率、周期的估计
对于Y(kΔf),如果当kΔf=
时,Y(kΔf)取最大值,则
为频率的估计值,由于采样间隔的误差,
也存在误差,其误差最大为Δf/2。
周期T=1/f。
从原理上可以看出,如果在标准信号中混有噪声,用上述方法仍能够精确地估计出原标准信号的频率和周期。
(3)频谱图
为了直观地表示信号的频率特性,工程上常常将Fourier变换的结果用图形的方式表示,即频谱图。
以频率f为横坐标,|Y(f)|为纵坐标,可以得到幅值谱;
以频率f为横坐标,argY(f)为纵坐标,可以得到相位谱;
以频率f为横坐标,ReY(f)为纵坐标,可以得到实频谱;
以频率f为横坐标,ImY(f)为纵坐标,可以得到虚频谱。
根据采样定理,只有频率不超过Fs/2的信号才能被正确采集,即Fourier变换的结果中频率大于Fs/2的部分是不正确的部分,故不在频谱图中显示。
即横坐标f∈[0,Fs/2]
6、模块划分
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成制定的功能,满足用户需求。
2、实验内容
设计一个音频频谱分析仪,功能包括:
(1)音频信号输入,从声卡输入、从WAV文件输入、从标准信号发生器输入;
(2)信号波形分析,包括幅值、频率、周期、相位的估计,以及统计量峰值、均值。
均方值和方差的计算。
(3)信号频谱分析,频率、周期的估计,图形显示幅值谱、相位谱、时频谱、虚频谱和功率谱的曲线。
三、实验结果
(1)根据实验提示,设计如下界面
(2)通过声卡输入,分析声音频谱程序和界面如下
开始录音callback函数
functionluyin_pushbutton_Callback(hObject,eventdata,handles)
%hObjecthandletoluyin_pushbutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
handles.inputtype=1;
%用于点选控制
Fs=str2double(get(findobj('
Tag'
'
samplerate'
),'
string'
));
handles.y=wavrecord(str2double(get(handles.recordtime,'
))*Fs,Fs);
guidata(hObject,handles);
axes(handles.signal_axes)
plot(handles.y);
title('
WAVE'
);
ysize=size(handles.y);
set(handles.samplenum,'
num2str(ysize
(1)));
%输出采样点数
(3)通过加载wav输入信号,分析声音频谱程序和界面如下
打开文件callback函数
functionopenfile_pushbutton_Callback(hObject,eventdata,handles)
%hObjecthandletoopenfile_pushbutton(seeGCBO)
temp=wavread(get(findobj('
filename'
String'
channel=str2double(get(handles.channel,'
handles.y=temp(:
channel);
(4)通过信号发生器生成正弦波和白噪声混叠波形如下
(5)通过信号发生器生成方波和白噪声混叠波形如下
(6)通过信号发生器生成三角波和白噪声混叠波形如下
(7)通过信号发生器生成锯齿波和白噪声混叠波形如下
(4)~(7)中重要callback函数
生成波形callback函数
functionshengchengboxing_Callback(hObject,eventdata,handles)
%hObjecthandletoshengchengboxing(seeGCBO)
N=str2double(get(findobj('
samplenum'
x=linspace(0,N/Fs,N);
soundtype=get(handles.waveform,'
Value'
frequency=str2double(get(handles.pinlvF,'
amp=str2double(get(handles.fuzhiA,'
phase=str2double(get(handles.xiangweiQ,'
switchsoundtype%波形选择
case1
y=amp*sin(2*pi*x*frequency+phase);
case2
y=amp*sign(sin(2*pi*x*frequency+phase));
case3
y=amp*sawtooth(2*pi*x*frequency+phase,0.5);
case4
y=amp*sawtooth(2*pi*x*frequency+phase);
case5
y=amp*(2*rand(size(x))-1);
otherwise
errordlg('
Illegalwavetype'
Chooseerrer'
end
ifget(handles.add,'
)==0.0
handles.y=y;
else
handles.y=handles.y+y;
%波形混叠
handles.inputtype=3;
set(handles.signal_axes,'
XMinorTick'
on'
)
时域分析callback函数
functionfrequencydomain_pushbutton_Callback(hObject,eventdata,handles)
%hObjecthandletofrequencydomain_pushbutton(seeGCBO)
ifhandles.inputtype==0
msgbox('
Nowaveexist!
Pleasechooseainputtype!
'
return;
from=str2double(get(handles.startpoint,'
to=str2double(get(handles.endpoint,'
sample=handles.y(from:
to);
f=linspace(0,Fs/2,(to-from+1)/2);
Y=fft(sample,to-from+1);
[C,I]=max(abs(Y));
set(handles.period_of_F_output,'
1/f(I));
set(handles.frequency_of_F_output,'
f(I));
Y=Y(1:
(to-from+1)/2);
plot(handles.frequency_axes,f,2*sqrt(Y.*conj(Y)));
plot(handles.phase_axes,f,angle(Y));
plot(handles.real_axes,f,real(Y));
plot(handles.imagin_axes,f,imag(Y));
plot(handles.power_axes,f,abs(Y).^2);
%---Executesonbuttonpressintimedomain_pushbutton.
functiontimedomain_pushbutton_Callback(hObject,eventdata,handles)
%hObjecthandletotimedomain_pushbutton(seeGCBO)
%guolingjiance
n=1;
ymax=max([handles.y
(1)handles.y
(2)]);
ymin=min([handles.y
(1)handles.y
(2)]);
iffrom<
1||to-from<
5;
Errorrange!
fori=from+2:
to-1;
ifhandles.y(i-1)<
0&
&
handles.y(i-2)<
handles.y(i)>
=0&
handles.y(i+1)>
ifhandles.y(i)==0
ti(n)=i;
else
ti(n)=i-handles.y(i)/(handles.y(i)-handles.y(i-1));
%x1=i-1;
%y1=handles.y(i-1);
%x2=i;
%y2=handles.y(i);
%a=handles.y(i)-handles.y(i-1);
%b=a*x1-y1;
%ti(n)=b/a;
end
amp(n)=(ymax-ymin)/2;
ymax=0;
ymin=0;
n=n+1;
ifymax<
handles.y(i)
ymax=handles.y(i);
ifymin>
ymin=handles.y(i);
n=n-1;
%freqenceandperiodicity
fori=1:
n-1
T(i)=ti(i+1)-ti(i);
freq=Fs/mean(T);
set(handles.period_output,'
1/freq);
set(handles.frequency_output,'
num2str(freq));
%amplitude
set(handles.A_output,'
num2str(mean(amp(2:
n-1))));
%phase
phase=2*pi*(1-(ti(1:
n-1)-1)./T+floor((ti(1:
n-1)-1)./T));
set(handles.xiangweQ_output,'
num2str(mean(phase)));
%peak
set(handles.peakvalue_output,'
(max(handles.y(from:
to))-min(handles.y(from:
to)))/2);
%mean
set(handles.averagevalue_output,'
mean(handles.y(from:
to)));
%meansquare
set(handles.squarevalue_output,'
to).^2));
%s
set(handles.fanfcha_output,'
std(handles.y(from:
to))^2);
频域分析callback函数
主函数的openingFcn函数
functionuntitled_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%varargincommandlineargumentstountitled(seeVARARGIN)
handles.inputtype=0;
%
xlabel(handles.frequency_axes,'
freqency(Hz)'
%横坐标显示
xlabel(handles.phase_axes,'
xlabel(handles.real_axes,'
xlabel(handles.imagin_axes,'
xlabel(handles.power_axes,'
%Choosedefaultcommandlineoutputforuntitled
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesuntitledwaitforuserresponse(seeUI