一、語音處理簡介
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 = untitled(varargin)
% UNTITLED MATLAB code for untitled.fig
% UNTITLED, by itself, creates a new UNTITLED or raises the existing
% singleton*.
%
% H = UNTITLED returns the handle to a new UNTITLED or the handle to
% the existing singleton*.
%
% UNTITLED(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in UNTITLED.M with the given input arguments.
%
% UNTITLED(‘Property’,‘Value’,…) creates a new UNTITLED or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before untitled_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to untitled_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’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 untitled
% Last Modified by GUIDE v2.5 12-Jan-2020 11:58:18
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @untitled_OpeningFcn, …
‘gui_OutputFcn’, @untitled_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
endif nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% — Executes just before untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to untitled (see VARARGIN)% Choose default command line output for untitled
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes untitled wait for user response (see UIRESUME)
% uiwait(handles.figure1);% — Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% — Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global x fs
[FileName,PathName] = uigetfile(‘*.wav’,‘選中語音檔案’); %Load file
[x,fs] = audioread([PathName FileName]);sigLength=length(x);%信号長度
t=(0:sigLength-1)/fs;
x1 = fft(x,sigLength);%傅裡葉變換
halflength=floor(sigLength/2); %取一半
f=fs*(0:halflength)/sigLength; %頻率範圍.
axes(handles.axes1)
plot(t,x) %時域圖
xlabel(‘t/s’);
ylabel(‘幅度’);axes(handles.axes3)
plot(f,abs(x1(1:halflength+1)));%原始信号頻譜圖
xlabel(‘頻率/Hz’);
ylabel(‘幅度’);% — Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global x fs
%設計一個切比雪夫1型低通濾波器,要求把50Hz的頻率分量保留,其他分量濾掉
wp = 550/(fs/2); %通帶截止頻率,取50~100中間的值,并對其歸一化
ws = 1000/(fs/2); %阻帶截止頻率,取50~100中間的值,并對其歸一化
alpha_p = 3; %通帶允許最大衰減為 3db
alpha_s = 40;%阻帶允許最小衰減為40 db
%擷取階數和截止頻率
[ N1, wc1 ] = cheb1ord( wp , ws , alpha_p , alpha_s);
%獲得轉移函數系數
[ b ,a ] = cheby1(N1,alpha_p,wc1,‘low’);
%濾波
x1= filter(b,a,x);
sigLength=length(x1);
y1 = fft(x1,sigLength);%傅裡葉變換
halflength=floor(sigLength/2); %取一半
f=fs*(0:halflength)/sigLength; %頻率範圍
t=(0:sigLength-1)/fs;
axes(handles.axes2)
plot(t,x1) %時域圖
xlabel(‘t/s’);
ylabel(‘幅度’);axes(handles.axes4)
plot(f,abs(y1(1:halflength+1)));%原始信号頻譜圖
xlabel(‘頻率/Hz’);
ylabel(‘幅度’);% — Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global x fs
%設計一個切比雪夫2型低通濾波器,要求把50Hz的頻率分量保留,其他分量濾掉
wp = 550/(fs/2); %通帶截止頻率,取50~100中間的值,并對其歸一化
ws = 1000/(fs/2); %阻帶截止頻率,取50~100中間的值,并對其歸一化
alpha_p = 3; %通帶允許最大衰減為 db
alpha_s = 40;%阻帶允許最小衰減為 db
%擷取階數和截止頻率
[ N1 ,wc1 ] = cheb2ord( wp , ws , alpha_p , alpha_s);
%獲得轉移函數系數
[ b, a ] = cheby2(N1,alpha_s,wc1,‘low’);
%濾波
三、運作結果
四、matlab版本及參考文獻
1 matlab版本
2014a