3.短時時域處理
3.1 短時能量
設語音波形時域信號爲x(n)、加窗函數w(n)分幀處理後得到的第i幀語音信號爲yi(n),則yi(n)滿足
KaTeX parse error: Undefined control sequence: \leqsl at position 58: … 1 \leqslant n \̲l̲e̲q̲s̲l̲
̲ant L, \quad 1 …
式中,w(n)爲窗函數,一般爲矩形窗或漢明窗;yi(n)是一幀的數值,n=1,2…,L,i=1,
2…,fn,L爲幀長;inc爲幀移長度;fn爲分幀後的總幀數。
計算第i幀語音信號yi(n)的短時能量公式爲
例:讀入語音文件C2_2_y.wav(內容爲"我,到,北,京,去")中的數據,計算能量譜
實現代碼
%語音分幀,平畫出它的短時能量譜
clear all; clc;
close all;
[x,Fs]=audioread('C2_2_y.wav'); % 讀入數據文件
wlen=200; inc=80; % 給出幀長和幀移
win=hanning(wlen); % 給出海寧窗
N=length(x); % 信號長度
X=enframe(x,win,inc)'; % 分幀
fn=size(X,2); % 求出幀數
time=(0:N-1)/Fs; % 計算出信號的時間刻度
for i=1 : fn
u=X(:,i); % 取出一幀
u2=u.*u; % 求出能量
En(i)=sum(u2); % 對一幀累加求和
end
subplot 211; plot(time,x,'b'); % 畫出時間波形
title('語音波形');
ylabel('幅值'); xlabel(['時間/s' 10 '(a)']);
frameTime=frame2time(fn,wlen,inc,Fs); % 求出每幀對應的時間
subplot 212; plot(frameTime,En,'k') % 畫出短時能量圖
title('短時能量');
ylabel('幅值'); xlabel(['時間/s' 10 '(b)']);
運行結果
程序中調用了frame2time函數,用於計算分幀後每一幀對應的時間。
名稱:frame2time
功能:計算分幀後每一幀對應的時間
調用格式:frameTime=frame2time(framelum,framelen,inc,fs)
說明:輸入參數framelNum是總幀數;framelen是幀長;inc是幀移;fs是採樣頻率.輸出參數frameTime是每幀的時間,即取這一幀數據中間位置的時間.
語音信號的平均幅度定義爲
M(i)也是一幀語音信號能量大小的表徵,它與E(i)的區別在於計算時不論採樣值的大小,不會因取二次方而造成較大差異,在某些應用領域中會帶來一些好處.
短時能量和短時平均幅度函數的主要用途有:
區分濁音段與清音段,因爲濁音時E(i)值比清音時大得多;
區分聲母與韻母的分界和無話段與有話段的分界
3.2短時平均過零率
短時平均過零率表示一幀語音中語音信號波形穿過橫軸(零電平)的次數。過零率分析是語音時域分析中最簡單的一種。對於連續語音信號,過零即意味着時域波形通過時間軸;而對於離散信號,如果相鄰的取樣值改變符號,則稱爲過零。短時平均過零率就是樣本數值改變符號的次數。
定義語音信號x(n)分幀後有yi(n),幀長爲L,短時平均過零率爲
理論上平均過零率按上式計算,但在MATLAB中,可表示爲離散信號相鄰的取樣值改變符號,那麼它們的乘積爲負數
將語音信號分幀,分幀後的數組爲X,其中每列數據表示一幀的數值,幀長爲wlen,用zcr表示短時平均過零率
實現代碼
zcr=zeros(1,fn); %初始化
fori=1:fn
z=X(:,i); %取得一幀數據
forj=1:(wlen-1); %在一幀內尋找過零點
if z(j)*z(j+1)<0 %判斷是否爲過零點
zcr(i)=zcr(i)+1; %是過零點,記錄1次
end
end
end
例 讀入語音文件C2_2_y.wav(內容爲“我,到,北,京,去”)中的數據,分幀後計算短時平均過零率。
實現代碼
%短時平均過零率
clear all; clc; close all;
[xx,Fs]=audioread('C2_2_y.wav'); % 讀入數據文件
x=xx-mean(xx); % 消除直流分量
wlen=200; inc=80; % 設置幀長、幀移
win=hanning(wlen); % 窗函數
N=length(x); % 求數據長度
X=enframe(x,win,inc)'; % 分幀
fn=size(X,2); % 獲取幀數
zcr1=zeros(1,fn); % 初始化
for i=1:fn
z=X(:,i); % 取得一幀數據
for j=1: (wlen- 1) % 在一幀內尋找過零點
if z(j)* z(j+1)< 0 % 判斷是否爲過零點
zcr1(i)=zcr1(i)+1; % 是過零點,記錄1次
end
end
end
time=(0:N-1)/Fs; % 計算時間座標
frameTime=frame2time(fn,wlen,inc,Fs); % 求出每幀對應的時間
% 作圖
subplot 211; plot(time,x,'b'); grid;
title('語音波形');
ylabel('幅值'); xlabel(['時間/s' 10 '(a)']);
subplot 212; plot(frameTime,zcr1,'k'); grid;
title('短時平均過零率');
ylabel('幅值'); xlabel(['時間/s' 10 '(b)']);
運行結果
通過分析語音信號發現,發濁音時,儘管聲道有若干共振峯,但由於聲門波引起譜的高頻跌落;而發清音時,多數能量出現在較高頻率上。因爲高頻意味着高的短時平均過零率,低頻意味着低的平均過零率,所以認爲,濁音時具有較低的過零率,而清音時具有較高的過零率(相當於白噪聲)。這種高僅是相對而言的,沒有精確的數值關係。
應用短時平均過零率的作用
利用短時平均過零率可以從背景噪聲中找出語音信號,可用於判斷寂靜無話段與有話段的起點和終點位置。
在背景噪聲較小時,用平均能量識別較爲有效
在背景噪聲較大時,用短時平均過零率識別較爲有效
主要應用短時平均過零率來判別清音和濁音、有話段與無話段
3.3短時自相關函數
1.自相關函數的定義和性質
能量有限信號x(n)的自相關函數定義爲
如果x(n)是隨機或週期性的離散信號,不是能量有限的,則其相關函數定義爲
信號的自相關函數具有以下性質
①偶函數特性:Ф(k)=Ф((一k).
②| Ф(k)|<|Ф(0)|,即零延遲的自相關值最大.
③若x(n)爲能量有限信號,則其能量即爲Ф(0);若x(n)爲隨機信號或週期性信號,則Ф(0)爲其平均功率.
④如果x(n)是週期性信號,則Ф(k)也是週期性信號,並且其週期與x(n)的週期相同.
2.短時自相關函數的定義和性質
自相關函數具有一些性質(如它是偶函數;假設序列具有週期性,則其自相關函數也是同週期的周期函數等)。對於濁音語音可以用自相關函數求出語音波形序列的基音週期。在進行語音信號的線性預測分析時,也要用到自相關函數。語音信號x(m)的短時自相關函數R(k))的計算式如下:
其中N表示爲語音分幀的長度,K表示最大延遲數
短時自相關函數具有以下性質:
(1)如果Xn(m)是週期的(設週期爲Np),則自相關函數是同週期的周期函數,即Rn(k)=Rn(k+Np)
(2)Rn(k)是偶函數,即Rn(k)+Rn(-k)
(3)當k=0時,自相關函數具有最大值,即Rn(0)>=| Rn(k) |,並且Rn(0)爲信號序列的能量或隨機性序列的平均功率
語音信號的自相關函數主要應用於端點檢測和基音的提取,在韻母基音頻率整數倍處將出現峯值特性,通常根據除Rτ(0)外的第一峯值點來估計基音,而在聲母的短時自相關函數中看不到明顯的峯值。
若已知分幀後的數據在 中,則取每一幀的數據都可以來做短時自相關函數的分析:
u=X(:,i); %取出一幀
R=xcorr(u); %利用xcorr函數求出自相關函數
R=R(wlen:end); %只取k值爲正值的自相關函數
例,實現一段語音信號的短時自相關(使用漢寧窗窗函數的情況,讀取“我,到,北,京, 去”,設置幀長爲200,幀移爲80
實現代碼
%短時自相關函數
clear all; clc; close all;
[Y,Fs]=audioread('C2_2_y.wav'); % 讀入數據文件
x=Y-mean(Y); % 消除直流分量
wlen=200; inc=80; % 設置幀長、幀移
win=hanning(wlen); % 窗函數設置爲漢寧窗
N=length(x); % 求數據長度
X=enframe(x,win,inc)'; % 分幀
xn=X(:);
Ac1=STAc(X); %計算短時自相關函數
Ac1=Ac1(:);
time=(0:N-1)/Fs; % 計算時間座標
% 作圖
subplot 211;
plot(xn,'b'); grid;
title('語音波形');
ylabel('幅值'); xlabel(['時間/s' 10 '(a)']);
subplot 212;
plot(Ac1,'k');
grid;
title('短時自相關函數');
ylabel('幅值'); xlabel(['時間/s' 10 '(b)']);
%定義短時自相關函數
function y=STAc(X)
y=zeros(size(X));
fn=size(X,2); %求出幀數
wlen=size(X,1); %求幀長
for i=1:fn
u=X(:,i); %取出一幀
R=xcorr(u); %短時自相關計算
y(:,i)=R(wlen,end); %只取k爲正值的自相關函數
end
end
運行結果
3.4短時平均幅度差
短時自相關函數是語音信號時域分析的重要參量。
但是計算自相關函數的計算量很大,其乘法運算所需時間較長。利用FFT等簡化計算方法都無法避免乘法運算。爲了避免乘法,一個簡單的方法就是利用差值。所以採用另一種與自相關函數有類似作用的參量,即短時平均幅度差函數。
平均幅度差函數代替自相關函數進行語音分析的原因是:如果信號是完全的週期信號(設週期爲Np),則相距爲週期的整數倍的樣點上的幅值是相等的,差值爲零。
對於實際的語音信號,d(n)雖不爲零,但其值很小。這些極小值將出現在整數倍週期的位置上。爲此,可定義短時平均幅度差函數:
平均幅度差函數和自相關函數有密切的關係,兩者之間的關係可由下式表達:
β(k)對不同的語音段在0.6-1.0之間變化,但是對一個特定的語音段,它隨k值變化並不明顯。
顯然,計算Fn(k)只需加、減法和取絕對值的運算,與自相關函數的加法與乘法相比,其運算量大大減少,尤其在用硬件實現語音信號分析時有很大好處。
例,實現一段語音信號的短時平均幅度差(使用漢寧窗窗函數的情況,讀取“我,到,北,京, 去”,設置幀長爲200,幀移爲100
實現代碼
%短時平均幅度差
clear all; clc; close all;
[Y,Fs]=audioread('C2_2_y.wav'); % 讀入數據文件
wlen=200; inc=100; % 設置幀長、幀移
win=hanning(wlen); % 窗函數設置爲漢寧窗
N=length(Y); % 求數據長度
X=enframe(Y,win,inc)'; % 分幀
xn=X(:);
Amdf=STAmdf(X); %計算短時幅度差
Amdf=Amdf(:);
time=(0:N-1)/Fs; % 計算時間座標
% 作圖
subplot 211;
plot(xn,'b'); grid;
title('語音波形');
ylabel('幅值'); xlabel(['點數' 10]);
subplot 212;
plot(Amdf,'k');
grid;
title('短時平均幅度差');
ylabel('幅值'); xlabel(['點數' 10]);
%短時平均幅度差函數
function y=STAmdf(X)
y=zeros(size(X));
fn=size(X,2); %幀數
wlen=size(X,1); %幀長
for i=1:fn
u=X(:,i); %取出一幀
for k=1:wlen
y(:,k)=sum(abs(u(k:end)-u(1:end-k+1)));%求每個樣本點的幅度差
end
end
end
運行結果