【正文】
信號(hào)處理實(shí)驗(yàn)實(shí)驗(yàn)八:音頻頻譜分析儀設(shè)計(jì)與實(shí)現(xiàn) 實(shí)驗(yàn)名稱:音頻頻譜分析儀設(shè)計(jì)與實(shí)現(xiàn) 實(shí)驗(yàn)原理:MATLAB是一個(gè)數(shù)據(jù)信息和處理功能十分強(qiáng)大的工程實(shí)用軟件,其數(shù)據(jù)采集工具箱為實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出提供了十分方便的函數(shù)和命令。本實(shí)驗(yàn)可以用MATLAB進(jìn)行音頻信號(hào)頻譜分析儀的設(shè)計(jì)與實(shí)現(xiàn)。信號(hào)頻率、幅值和相位估計(jì)(1)頻率(周期)檢測(cè)對(duì)周期信號(hào)來(lái)說(shuō),可以用時(shí)域波形分析來(lái)確定信號(hào)的周期,也就是計(jì)算相鄰的兩個(gè)信號(hào)波峰的時(shí)間差、或過(guò)零點(diǎn)的時(shí)間差。這里采用過(guò)零點(diǎn)(ti)的時(shí)間差T(周期)。頻率即為f = 1/T,由于能夠求得多個(gè)T值(ti有多個(gè)),故采用它們的平均值作為周期的估計(jì)值。(2)幅值檢測(cè)在一個(gè)周期內(nèi),求出信號(hào)最大值ymax與最小值ymin的差的一半,即A = (ymax ymin)/2,同樣,也會(huì)求出多個(gè)A值,但第1個(gè)A值對(duì)應(yīng)的ymax和ymin不是在一個(gè)周期內(nèi)搜索得到的,故以除第1個(gè)以外的A值的平均作為幅值的估計(jì)值。(3)相位檢測(cè)采用過(guò)零法,即通過(guò)判斷與同頻零相位信號(hào)過(guò)零點(diǎn)時(shí)刻,計(jì)算其時(shí)間差,然后換成相應(yīng)的相位差。φ=2π(1ti/T),{x}表示x的小數(shù)部分,同樣,以φ的平均值作為相位的估計(jì)值。頻率、幅值和相位估計(jì)的流程如圖所示。其中tin表示第n個(gè)過(guò)零點(diǎn),yi為第i個(gè)采樣點(diǎn)的值,F(xiàn)s為采樣頻率。數(shù)字信號(hào)統(tǒng)計(jì)量估計(jì)(1) 峰值P的估計(jì)在樣本數(shù)據(jù)x中找出最大值與最小值,其差值為雙峰值,雙峰值的一半即為峰值。P=[max(yi)min(yi)](2)均值估計(jì)式中,N為樣本容量,下同。(3) 均方值估計(jì)(4) 方差估計(jì) 頻譜分析原理時(shí)域分析只能反映信號(hào)的幅值隨時(shí)間的變化情況,除單頻率分量的簡(jiǎn)單波形外,很難明確提示信號(hào)的頻率組成和各頻率分量大小,而頻譜分析能很好的解決此問(wèn)題。(1)DFT與FFT對(duì)于給定的時(shí)域信號(hào)y,可以通過(guò)Fourier變換得到頻域信息Y。Y可按下式計(jì)算式中,N為樣本容量,Δt = 1/Fs為采樣間隔。采樣信號(hào)的頻譜是一個(gè)連續(xù)的頻譜,不可能計(jì)算出所有的點(diǎn)的值,故采用離散Fourier變換(DFT),即式中,Δf = Fs/N。但上式的計(jì)算效率很低,因?yàn)橛写罅康闹笖?shù)(等價(jià)于三角函數(shù))運(yùn)算,故實(shí)際中多采用快速Fourier變換(FFT)。其原理即是將重復(fù)的三角函數(shù)算計(jì)的中間結(jié)果保存起來(lái),以減少重復(fù)三角函數(shù)計(jì)算帶來(lái)的時(shí)間浪費(fèi)。由于三角函數(shù)計(jì)算的重復(fù)量相當(dāng)大,故FFT能極大地提高運(yùn)算效率。(2)頻率、周期的估計(jì)對(duì)于Y(kΔf),如果當(dāng)kΔf = 時(shí),Y(kΔf)取最大值,則為頻率的估計(jì)值,由于采樣間隔的誤差,也存在誤差,其誤差最大為Δf / 2。周期T=1/f。從原理上可以看出,如果在標(biāo)準(zhǔn)信號(hào)中混有噪聲,用上述方法仍能夠精確地估計(jì)出原標(biāo)準(zhǔn)信號(hào)的頻率和周期,這個(gè)將在下一章做出驗(yàn)證頻譜圖為了直觀地表示信號(hào)的頻率特性,工程上常常將Fourier變換的結(jié)果用圖形的方式表示,即頻譜圖。以頻率f為橫坐標(biāo),|Y(f)|為縱坐標(biāo),可以得到幅值譜;以頻率f為橫坐標(biāo),arg Y(f)為縱坐標(biāo),可以得到相位譜;以頻率f為橫坐標(biāo),Re Y(f)為縱坐標(biāo),可以得到實(shí)頻譜;以頻率f為橫坐標(biāo),Im Y(f)為縱坐標(biāo),可以得到虛頻譜。根據(jù)采樣定理,只有頻率不超過(guò)Fs/2的信號(hào)才能被正確采集,即Fourier變換的結(jié)果中頻率大于Fs/2的部分是不正確的部分,故不在頻譜圖中顯示。即橫坐標(biāo)f ∈[0, Fs/2]模塊劃分模塊化就是把程序劃分成獨(dú)立命名且可獨(dú)立訪問(wèn)的模塊,每個(gè)模塊完成一個(gè)子功能,把這些模塊集成起來(lái)構(gòu)成一個(gè)整體,可以完成指定的功能滿足用戶需求。根據(jù)人類解決一般問(wèn)題的經(jīng)驗(yàn),如果一個(gè)問(wèn)題由兩個(gè)問(wèn)題組合而成,那么它的復(fù)雜程度大于分別考慮每個(gè)問(wèn)題時(shí)的復(fù)雜程度之和,也就是說(shuō)把復(fù)雜的問(wèn)題分解成許多容易解決的小問(wèn)題,原來(lái)的問(wèn)題也就容易解決了。這就是模塊化的根據(jù)。在模塊劃分時(shí)應(yīng)遵循如下規(guī)則:改進(jìn)軟件結(jié)構(gòu)提高模塊獨(dú)立性;模塊規(guī)模應(yīng)該適中;深度、寬度、扇出和扇入都應(yīng)適當(dāng);模塊的作用域應(yīng)該在控制域之內(nèi);力爭(zhēng)降低模塊接口的復(fù)雜程度;設(shè)計(jì)單入口單出口的模塊;模塊功能應(yīng)該可以預(yù)測(cè)。 實(shí)驗(yàn)要求:參考以上原理,查閱相關(guān)資料,構(gòu)建交互界面,設(shè)計(jì)一個(gè)音頻頻譜分析儀,實(shí)現(xiàn)一下功能:(1) 音頻信號(hào)信號(hào)輸入,從聲卡輸入、從WAV文件輸入、從標(biāo)準(zhǔn)信號(hào)發(fā)生器輸入;(2) 信號(hào)波形分析,包括幅值、頻率、周期、相位的估計(jì),以及統(tǒng)計(jì)量峰值、均值、均方值和方差的計(jì)算;(3) 信號(hào)頻譜分析,頻率、周期的估計(jì),圖形顯示幅值譜、相位譜、實(shí)頻譜、虛頻譜和功率譜的曲線。 實(shí)驗(yàn)界面及程序程序: function varargout = yinpin(varargin) % YINPIN Mfile for % YINPIN, by itself, creates a new YINPIN or raises the existing % singleton*. % % H = YINPIN returns the handle to a new YINPIN or the handle to % the existing singleton*. % % YINPIN(39。CALLBACK39。,hObject,eventData,handles,...) calls the local % function named CALLBACK in with the given input arguments. % % YINPIN(39。Property39。,39。Value39。,...) creates a new YINPIN or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before yinpin_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to yinpin_OpeningF via varargin. % % *See GUI Options on GUIDE39。s Tools menu. Choose GUI allows only one % instance to run (singleton). % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help yinpin % Last Modified by GUIDE 07Nov2012 17:08:53 % Begin initialization code DO NOT EDIT gui_Singleton = 1。 gui_State = struct(39。gui_Name39。, mfilename, ... 39。gui_Singleton39。, gui_Singleton, ... 39。gui_OpeningF39。, @yinpin_OpeningF, ... 39。gui_OutputF39。, @yinpin_OutputF, ... 39。gui_LayoutF39。, [] , ... 39。gui_Callback39。, [])。 if nargin amp。amp。 ischar(varargin{1}) = str2func(varargin{1})。 end if nargout [varargout{1:nargout}] = gui_mainf(gui_State, varargin{:})。 else gui_mainf(gui_State, varargin{:})。 end function yinpin_OpeningF(hObject, eventdata, handles, varargin) = hObject。 guidata(hObject, handles)。 function varargout = yinpin_OutputF(hObject, eventdata, handles) varargout{1} = 。 function edit1_CreateF(hObject, eventdata, handles) if ispc amp。amp。 isequal(get(hObject,39。BackgroundColor39。), get(0,39。defaultUicontrolBackgroundColor39。)) set(hObject,39。BackgroundColor39。,39。white39。)。 end function caiyangpinlv_CreateF(hObject, eventdata, handles) if ispc amp。amp。 isequal(get(hObject,39。BackgroundColor39。), get(0,39。defaultUicontrolBackgroundColor39。)) set(hObject,39。BackgroundColor39。,39。white39。)。 end function caiyangdianshu_CreateF(hObject, eventdata, handles) if ispc am