基于Matlab實現(xiàn)數(shù)字音頻分析處理系統(tǒng)
一、語音處理簡介
1 語音信號的特點
通過對大量語音信號的觀察和分析發(fā)現(xiàn),語音信號主要有下面兩個特點:
①在頻域內(nèi),語音信號的頻譜分量主要集中在300~3400Hz的范圍內(nèi)。利用這個特點,可以用一個防混迭的帶通濾波器將此范圍內(nèi)的語音信號頻率分量取出,然后按8kHz的采樣率對語音信號進(jìn)行采樣,就可以得到離散的語音信號。
②在時域內(nèi),語音信號具有“短時性”的特點,即在總體上,語音信號的特征是隨著時間而變化的,但在一段較短的時間間隔內(nèi),語音信號保持平穩(wěn)。在濁音段表現(xiàn)出周期信號的特征,在清音段表現(xiàn)出隨機噪聲的特征。
2 語音信號的采集
在將語音信號進(jìn)行數(shù)字化前,必須先進(jìn)行防混疊預(yù)濾波,預(yù)濾波的目的有兩個:①抑制輸入信導(dǎo)各領(lǐng)域分量中頻率超出fs/2的所有分量(fs為采樣頻率),以防止混疊干擾。②抑制50Hz的電源工頻干擾。這樣,預(yù)濾波器必須是一個帶通濾波器,設(shè)其上、下截止顏率分別是fH和fL,則對于絕人多數(shù)語音編譯碼器,fH=3400Hz、fL=60~100Hz、采樣率為fs=8kHz;而對丁語音識別而言,當(dāng)用于電話用戶時,指標(biāo)與語音編譯碼器相同。當(dāng)使用要求較高或很高的場合時fH=4500Hz或8000Hz、fL=60Hz、fs=10kHz或20kHz。
為了將原始模擬語音信號變?yōu)閿?shù)字信號,必須經(jīng)過采樣和量化兩個步驟,從而得到時間和幅度上均為離散的數(shù)字語音信號。采樣也稱抽樣,是信號在時間上的離散化,即按照一定時間間隔△t在模擬信號x(t)上逐點采取其瞬時值。采樣時必須要注意滿足奈奎斯特定理,即采樣頻率fs必須以高于受測信號的最高頻率兩倍以上的速度進(jìn)行取樣,才能正確地重建波它是通過采樣脈沖和模擬信號相乘來實現(xiàn)的。
在采樣的過程中應(yīng)注意采樣間隔的選擇和信號混淆:對模擬信號采樣首先要確定采樣間隔。如何合理選擇△t涉及到許多需要考慮的技術(shù)因素。一般而言,采樣頻率越高,采樣點數(shù)就越密,所得離散信號就越逼近于原信號。但過高的采樣頻率并不可取,對固定長度(T)的信號,采集到過大的數(shù)據(jù)量(N=T/△t),給計算機增加不必要的計算工作量和存儲空間;若數(shù)據(jù)量(N)限定,則采樣時間過短,會導(dǎo)致一些數(shù)據(jù)信息被排斥在外。采樣頻率過低,采樣點間隔過遠(yuǎn),則離散信號不足以反映原有信號波形特征,無法使信號復(fù)原,造成信號混淆。根據(jù)采樣定理,當(dāng)采樣頻率大于信號的兩倍帶寬時,采樣過程不會丟失信息,利用理想濾波器可從采樣信號中不失真地重構(gòu)原始信號波形。量化是對幅值進(jìn)行離散化,即將振動幅值用二進(jìn)制量化電平來表示。量化電平按級數(shù)變化,實際的振動值是連續(xù)的物理量。具體振值用舍入法歸到靠近的量化電平上。
語音信號經(jīng)過預(yù)濾波和采樣后,由A/D變換器變換為二址制數(shù)字碼。這種防混疊濾波通常與模數(shù)轉(zhuǎn)換器做在一個集成塊內(nèi),因此目前來說,語音信號的數(shù)字化的質(zhì)量還是有保證的。
采集到語音信號之后,需要對語音信號進(jìn)行分析,如語音信號的時域分析、頻譜分析、語譜圖分析以及加噪濾波等處理。
3 語音信號分析技術(shù)
語音信號分析是語音信號處理的前提和基礎(chǔ),只有分析出可表示語音信號本質(zhì)特征的參數(shù),才有可能利用這些參數(shù)進(jìn)行高效的語音通信、語音合成和語音識別等處理[8]。而且,語音合成的音質(zhì)好壞,語音識別率的高低,也都取決于對語音信號分橋的準(zhǔn)確性和精確性。因此語音信號分析在語音信號處理應(yīng)用中具有舉足輕重的地位。
貫穿于語音分析全過程的是“短時分析技術(shù)”。因為,語音信號從整體來看其特性及表征其本質(zhì)特征的參數(shù)均是隨時間而變化的,所以它是一個非乎穩(wěn)態(tài)過程,不能用處理乎穩(wěn)信號的數(shù)字信號處理技術(shù)對其進(jìn)行分析處理。但是,由于不同的語音是由人的口腔肌肉運動構(gòu)成聲道某種形狀而產(chǎn)生的響應(yīng),而這種口腔肌肉運動相對于語音頻率來說是非常緩慢的,所以從另一方面看,雖然語音倍號具有時變特性,但是在一個短時間范圍內(nèi)(一般認(rèn)為在10~30ms的短時間內(nèi)),其特性基本保持不變即相對穩(wěn)定,因面可以將其看作是一個準(zhǔn)穩(wěn)態(tài)過程,即語音信號具有短時平穩(wěn)性。所以任何語音信號的分析和處理必須建立在“短時”的基礎(chǔ)上.即進(jìn)行“短時分析”,將語音信號分為一段一段來分析其特征參數(shù),其中每一段稱為一“幀”,幀長一般取為10~30ms。這樣,對于整體的語音信號來講,分析出的是由每一幀特征參數(shù)組成的特征參數(shù)時間序列。
根據(jù)所分析出的參數(shù)的性質(zhì)的不同,可將語音信號分析分為時域分析、頻域分析、倒領(lǐng)域分析等;時域分析方法具有簡單、計算量小、物理意義明確等優(yōu)點,但由于語音信號最重要的感知特性反映在功率譜中,而相位變化只起著很小的作用,所以相對于時域分析來說頻域分析更為重要。
4 語音信號的時域分析
語音信號的時域分析就是分析和提取語音信號的時域參數(shù)。進(jìn)行語音分析時,最先接觸到并且也是最直觀的是它的時域波形。語音信號本身就是時域信號,因而時域分析是最早使用,也是應(yīng)用最廣泛的一種分析方法,這種方法直接利用語音信號的時域波形。時域分析通常用于最基本的參數(shù)分析及應(yīng)用,如語音的分割、預(yù)處理、大分類等。這種分析方法的特點是:①表示語音信號比較直觀、物理意義明確。②實現(xiàn)起來比較簡單、運算且少。③可以得到語音的一些重要的參數(shù)。④只使用示波器等通用設(shè)備,使用較為簡單等。
語音信號的時域參數(shù)有短時能量、短時過零率、短時白相關(guān)函數(shù)和短時平均幅度差函數(shù)等,這是語音信號的一組最基本的短時參數(shù),在各種語音信號數(shù)字處理技術(shù)中都要應(yīng)用[6]。在計算這些參數(shù)時使用的一般是方窗或漢明窗。
5 語音信號的頻域分析
語音信號的頻域分析就是分析語音信號的頻域持征。從廣義上講,語音信號的頻域分析包括語音信號的頻譜、功率譜、倒頻譜、頻譜包絡(luò)分析等,而常用的頻域分析方法有帶通濾波器組法、傅里葉變換法、線件預(yù)測法等幾種。
二、部分源代碼
function varargout = dsp(varargin) % --- 數(shù)字音頻分析與處理系統(tǒng) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @dsp_OpeningFcn, ... 'gui_OutputFcn', @dsp_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % --- Executes just before dsp is made visible. function dsp_OpeningFcn(hObject, eventdata, handles, varargin) % Choose default command line output for dsp handles.output = hObject; % 設(shè)置坐標(biāo)軸 set(gcf,'defaultAxesXGrid','off', ... 'defaultAxesYGrid','off', ... 'defaultAxesZGrid','off'); % 初始化 movegui(gcf,'center'); % figure居中 handles.Sample=[]; % 初始化樣本為空 handles.CSample=[]; % 初始化樣本副本 handles.volume=0; % 初始化音量為0 handles.Fs=0; % 初始化采樣率 if (exist('speech_database.mat','file')==2) load('speech_database.mat','-mat'); handles.data=data; c=data2cell(handles.data); else c=cell(0,0); end set(handles.data_uitable,'Data',c); % Update handles structure guidata(hObject, handles); % --- Outputs from this function are returned to the command line. function varargout = dsp_OutputFcn(hObject, eventdata, handles) % Get default command line output from handles structure varargout{1} = handles.output; function record_radiobutton_Callback(hObject, eventdata, handles) function file_radiobutton_Callback(hObject, eventdata, handles) % --- 顯示文件路徑 function filepath_edit_Callback(hObject, eventdata, handles) function filepath_edit_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function fs_popupmenu_Callback(hObject, eventdata, handles) function fs_popupmenu_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- 文件輸入音頻 function file_choose_pushbutton_Callback(hObject, eventdata, handles) [filename,pathname]=uigetfile({'*.wav;*.mp3;*.flac;*.m4a', ... '音頻文件(*.wav,*.mp3,*.flac,*.m4a)'},'選擇文件');%彈出選擇文件窗口 % 判斷文件為空 % 不能使用if isempty(filename)||isempty(pathname) % 取消窗口時會報錯,取消時uigetfile返回filename為0 if filename==0 return else handles.Filepath=[pathname,filename]; set(handles.filepath_edit,'string',handles.Filepath);% 顯示文件名 [handles.Sample,handles.Fs]=audioread(handles.Filepath);% 讀取音頻文件 % 若輸入音頻為雙聲道,則使用一個通道 samplesize=size(handles.Sample); if samplesize(2)>1 handles.Sample=handles.Sample(:,1); end handles.CSample=handles.Sample;% 創(chuàng)建副本 handles.player=audioplayer(handles.CSample,handles.Fs); setplayer(handles); set(handles.play_pushbutton,'enable','on'); set(handles.play_stop_pushbutton,'enable','on'); set(handles.putfile_pushbutton,'enable','on'); guidata(hObject,handles); end % --- 錄音按鈕 function record_start_pushbutton_Callback(hObject, eventdata, handles) fs_list=get(handles.fs_popupmenu,'string');% 獲取列表 fs_value=get(handles.fs_popupmenu,'value');% 獲取參數(shù)序號 fs=str2double(fs_list{fs_value});% 獲取選定采樣率 % list類型為cell必須轉(zhuǎn)換 handles.Fs=fs; handles.recObj=audiorecorder(fs,16,1);% 創(chuàng)建一個錄音器 set(handles.recObj,'StartFcn',{@recordstart_Callback,handles}, ... 'StopFcn',{@recordstop_Callback,handles}); % 錄音回調(diào) record(handles.recObj);% 開始錄音 guidata(hObject,handles); % --- 停止錄音按鈕 function record_stop_pushbutton_Callback(hObject, eventdata, handles) stop(handles.recObj);% 停止錄音 handles.Sample=getaudiodata(handles.recObj);% 獲取錄音 handles.CSample=handles.Sample;% 創(chuàng)建副本 handles.player=audioplayer(handles.CSample,handles.Fs); setplayer(handles); guidata(hObject,handles); % --- 播放器設(shè)置 function setplayer(handles) % 創(chuàng)建player回調(diào)函數(shù) set(handles.player,'StartFcn',{@playstart_Callback,handles}, ... 'StopFcn',{@playstop_Callback,handles}); % 音頻信息 sample_length=length(handles.Sample); % 音頻時長 t=sample_length/handles.Fs; set(handles.timeinfo_text,'String',['時長:',num2str(t),'s']); % 顯示時長 set(handles.fsinfo_text,'String',['采樣率:',num2str(handles.Fs),'Hz']); % 顯示采樣率 % plot wave audio_analyze(handles.Sample,handles.Fs,handles.axes1,handles); % 繪制初始樣本 audio_analyze(handles.CSample,handles.Fs,handles.axes2,handles);% 繪制樣本副本 nvar=std(handles.Sample).^2; % 初始方差 set(handles.nvar_edit,'String',round(nvar,3,'significant')); nmean=mean(handles.Sample); % 初始均值 set(handles.nmean_edit,'String',round(nmean,3,'significant')); dvar=std(handles.CSample).^2; % 樣本方差 set(handles.dvar_edit,'String',round(dvar,3,'significant')); dmean=mean(handles.CSample); % 樣本均值 set(handles.dmean_edit,'String',round(dmean,3,'significant')); % --- 播放按鈕 function play_pushbutton_Callback(hObject, eventdata, handles) play(handles.player);% 開始播放 % --- 停止播放按鈕 function play_stop_pushbutton_Callback(hObject, eventdata, handles) stop(handles.player);% 停止播放 % --- 輸入方式按鈕組 function uibuttongroup1_SelectionChangedFcn(hObject, eventdata, handles) switch get(hObject,'tag') case 'record_radiobutton' set(handles.fs_popupmenu,'enable','on'); set(handles.record_start_pushbutton,'enable','on'); set(handles.record_stop_pushbutton,'enable','off'); set(handles.filepath_edit,'enable','off'); set(handles.file_choose_pushbutton,'enable','off'); set(handles.play_pushbutton,'enable','off'); set(handles.play_stop_pushbutton,'enable','off'); case 'file_radiobutton' set(handles.fs_popupmenu,'enable','off'); set(handles.record_start_pushbutton,'enable','off'); set(handles.record_stop_pushbutton,'enable','off'); set(handles.filepath_edit,'enable','on'); set(handles.file_choose_pushbutton,'enable','on'); set(handles.play_pushbutton,'enable','off'); set(handles.play_stop_pushbutton,'enable','off'); end % --- 波形選擇欄 function wave_select_listbox_Callback(hObject, eventdata, handles) audio_analyze(handles.Sample,handles.Fs,handles.axes1,handles); audio_analyze(handles.CSample,handles.Fs,handles.axes2,handles); function wave_select_listbox_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
三、運行結(jié)果
以上就是基于Matlab實現(xiàn)數(shù)字音頻分析處理系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Matlab的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++使用JsonCpp庫操作json格式數(shù)據(jù)示例
這篇文章主要介紹了C++使用JsonCpp庫操作json格式數(shù)據(jù),結(jié)合實例形式詳細(xì)分析了JsonCpp庫的下載及C++使用JsonCpp庫對json格式數(shù)據(jù)序列化相關(guān)操作技巧,需要的朋友可以參考下2017-06-06C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12Qt實現(xiàn)導(dǎo)出QTableWidget/QTableView數(shù)據(jù)
這篇文章主要介紹了在Qt中實現(xiàn)將QTableWidget或者QTableView中的數(shù)據(jù)直接導(dǎo)出的示例代碼,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-01-01Cocos2d-x學(xué)習(xí)入門之HelloWorld程序
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)入門之HelloWorld程序,是學(xué)習(xí)Cocos2d-x的入門程序,其重要性不言而喻,需要的朋友可以參考下2014-08-08