基於Matlab實現數字音頻分析處理系統

一、語音處理簡介

1 語音信號的特點

通過對大量語音信號的觀察和分析發現,語音信號主要有下面兩個特點:

①在頻域內,語音信號的頻譜分量主要集中在300~3400Hz的范圍內。利用這個特點,可以用一個防混迭的帶通濾波器將此范圍內的語音信號頻率分量取出,然後按8kHz的采樣率對語音信號進行采樣,就可以得到離散的語音信號。

②在時域內,語音信號具有“短時性”的特點,即在總體上,語音信號的特征是隨著時間而變化的,但在一段較短的時間間隔內,語音信號保持平穩。在濁音段表現出周期信號的特征,在清音段表現出隨機噪聲的特征。

2 語音信號的采集

在將語音信號進行數字化前,必須先進行防混疊預濾波,預濾波的目的有兩個:①抑制輸入信導各領域分量中頻率超出fs/2的所有分量(fs為采樣頻率),以防止混疊幹擾。②抑制50Hz的電源工頻幹擾。這樣,預濾波器必須是一個帶通濾波器,設其上、下截止顏率分別是fH和fL,則對於絕人多數語音編譯碼器,fH=3400Hz、fL=60~100Hz、采樣率為fs=8kHz;而對丁語音識別而言,當用於電話用戶時,指標與語音編譯碼器相同。當使用要求較高或很高的場合時fH=4500Hz或8000Hz、fL=60Hz、fs=10kHz或20kHz。

為瞭將原始模擬語音信號變為數字信號,必須經過采樣和量化兩個步驟,從而得到時間和幅度上均為離散的數字語音信號。采樣也稱抽樣,是信號在時間上的離散化,即按照一定時間間隔△t在模擬信號x(t)上逐點采取其瞬時值。采樣時必須要註意滿足奈奎斯特定理,即采樣頻率fs必須以高於受測信號的最高頻率兩倍以上的速度進行取樣,才能正確地重建波它是通過采樣脈沖和模擬信號相乘來實現的。

在采樣的過程中應註意采樣間隔的選擇和信號混淆:對模擬信號采樣首先要確定采樣間隔。如何合理選擇△t涉及到許多需要考慮的技術因素。一般而言,采樣頻率越高,采樣點數就越密,所得離散信號就越逼近於原信號。但過高的采樣頻率並不可取,對固定長度(T)的信號,采集到過大的數據量(N=T/△t),給計算機增加不必要的計算工作量和存儲空間;若數據量(N)限定,則采樣時間過短,會導致一些數據信息被排斥在外。采樣頻率過低,采樣點間隔過遠,則離散信號不足以反映原有信號波形特征,無法使信號復原,造成信號混淆。根據采樣定理,當采樣頻率大於信號的兩倍帶寬時,采樣過程不會丟失信息,利用理想濾波器可從采樣信號中不失真地重構原始信號波形。量化是對幅值進行離散化,即將振動幅值用二進制量化電平來表示。量化電平按級數變化,實際的振動值是連續的物理量。具體振值用舍入法歸到靠近的量化電平上。

語音信號經過預濾波和采樣後,由A/D變換器變換為二址制數字碼。這種防混疊濾波通常與模數轉換器做在一個集成塊內,因此目前來說,語音信號的數字化的質量還是有保證的。

采集到語音信號之後,需要對語音信號進行分析,如語音信號的時域分析、頻譜分析、語譜圖分析以及加噪濾波等處理。

3 語音信號分析技術

語音信號分析是語音信號處理的前提和基礎,隻有分析出可表示語音信號本質特征的參數,才有可能利用這些參數進行高效的語音通信、語音合成和語音識別等處理[8]。而且,語音合成的音質好壞,語音識別率的高低,也都取決於對語音信號分橋的準確性和精確性。因此語音信號分析在語音信號處理應用中具有舉足輕重的地位。

貫穿於語音分析全過程的是“短時分析技術”。因為,語音信號從整體來看其特性及表征其本質特征的參數均是隨時間而變化的,所以它是一個非乎穩態過程,不能用處理乎穩信號的數字信號處理技術對其進行分析處理。但是,由於不同的語音是由人的口腔肌肉運動構成聲道某種形狀而產生的響應,而這種口腔肌肉運動相對於語音頻率來說是非常緩慢的,所以從另一方面看,雖然語音倍號具有時變特性,但是在一個短時間范圍內(一般認為在10~30ms的短時間內),其特性基本保持不變即相對穩定,因面可以將其看作是一個準穩態過程,即語音信號具有短時平穩性。所以任何語音信號的分析和處理必須建立在“短時”的基礎上.即進行“短時分析”,將語音信號分為一段一段來分析其特征參數,其中每一段稱為一“幀”,幀長一般取為10~30ms。這樣,對於整體的語音信號來講,分析出的是由每一幀特征參數組成的特征參數時間序列。

根據所分析出的參數的性質的不同,可將語音信號分析分為時域分析、頻域分析、倒領域分析等;時域分析方法具有簡單、計算量小、物理意義明確等優點,但由於語音信號最重要的感知特性反映在功率譜中,而相位變化隻起著很小的作用,所以相對於時域分析來說頻域分析更為重要。

4 語音信號的時域分析

語音信號的時域分析就是分析和提取語音信號的時域參數。進行語音分析時,最先接觸到並且也是最直觀的是它的時域波形。語音信號本身就是時域信號,因而時域分析是最早使用,也是應用最廣泛的一種分析方法,這種方法直接利用語音信號的時域波形。時域分析通常用於最基本的參數分析及應用,如語音的分割、預處理、大分類等。這種分析方法的特點是:①表示語音信號比較直觀、物理意義明確。②實現起來比較簡單、運算且少。③可以得到語音的一些重要的參數。④隻使用示波器等通用設備,使用較為簡單等。

語音信號的時域參數有短時能量、短時過零率、短時白相關函數和短時平均幅度差函數等,這是語音信號的一組最基本的短時參數,在各種語音信號數字處理技術中都要應用[6]。在計算這些參數時使用的一般是方窗或漢明窗。

5 語音信號的頻域分析

語音信號的頻域分析就是分析語音信號的頻域持征。從廣義上講,語音信號的頻域分析包括語音信號的頻譜、功率譜、倒頻譜、頻譜包絡分析等,而常用的頻域分析方法有帶通濾波器組法、傅裡葉變換法、線件預測法等幾種。

二、部分源代碼

function varargout = dsp(varargin)
% --- 數字音頻分析與處理系統
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;

% 設置坐標軸
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;% 創建副本
    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');% 獲取參數序號
fs=str2double(fs_list{fs_value});% 獲取選定采樣率
% list類型為cell必須轉換
handles.Fs=fs;

handles.recObj=audiorecorder(fs,16,1);% 創建一個錄音器

set(handles.recObj,'StartFcn',{@recordstart_Callback,handles}, ...
    'StopFcn',{@recordstop_Callback,handles}); % 錄音回調

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;% 創建副本
handles.player=audioplayer(handles.CSample,handles.Fs);
setplayer(handles);

guidata(hObject,handles);

% --- 播放器設置
function setplayer(handles)
% 創建player回調函數
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

三、運行結果

以上就是基於Matlab實現數字音頻分析處理系統的詳細內容,更多關於Matlab的資料請關註WalkonNet其它相關文章!

推薦閱讀: