語音信號處理基礎(六)——短時時域處理

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)的短時能量公式爲
E(i)=n=0L1yi2(n),1ifn E(i)=\sum_{n=0}^{L-1} y_{i}^{2}(n), \quad 1 \leqslant i \leqslant f 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)=n=0L1yi(n),1ifn M(i)=\sum_{n=0}^{L-1}\left|y_{i}(n)\right|, \quad 1 \leqslant i \leqslant f n
M(i)也是一幀語音信號能量大小的表徵,它與E(i)的區別在於計算時不論採樣值的大小,不會因取二次方而造成較大差異,在某些應用領域中會帶來一些好處.
短時能量和短時平均幅度函數的主要用途有:

區分濁音段與清音段,因爲濁音時E(i)值比清音時大得多;

區分聲母與韻母的分界和無話段與有話段的分界

3.2短時平均過零率

短時平均過零率表示一幀語音中語音信號波形穿過橫軸(零電平)的次數。過零率分析是語音時域分析中最簡單的一種。對於連續語音信號,過零即意味着時域波形通過時間軸;而對於離散信號,如果相鄰的取樣值改變符號,則稱爲過零。短時平均過零率就是樣本數值改變符號的次數。

定義語音信號x(n)分幀後有yi(n),幀長爲L,短時平均過零率爲
Z(i)=12n=0L1sgn[yi(n)]sgn[yi(n1)],1ifn Z(i)=\frac{1}{2} \sum_{n=0}^{L-1}\left|\operatorname{sgn}\left[y_{i}(n)\right]-\operatorname{sgn}\left[y_{i}(n-1)\right]\right|, \quad 1 \leqslant i \leqslant f n
理論上平均過零率按上式計算,但在MATLAB中,可表示爲離散信號相鄰的取樣值改變符號,那麼它們的乘積爲負數
yi(n)yi(n+1)<0 y_{i}(n) y_{i}(n+1)<0
將語音信號分幀,分幀後的數組爲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)的自相關函數定義爲
Φ(k)=m=x(m)x(m+k) \Phi(k)=\sum_{m=-\infty}^{\infty} x(m) x(m+k)
如果x(n)是隨機或週期性的離散信號,不是能量有限的,則其相關函數定義爲
Φ(k)=limN12N+1m=NNx(m)x(m+k) \Phi(k)=\lim _{N \rightarrow \infty} \frac{1}{2 N+1} \sum_{m=-N}^{N} x(m) x(m+k)
信號的自相關函數具有以下性質

①偶函數特性:Ф(k)=Ф((一k).
②| Ф(k)|<|Ф(0)|,即零延遲的自相關值最大.
③若x(n)爲能量有限信號,則其能量即爲Ф(0);若x(n)爲隨機信號或週期性信號,則Ф(0)爲其平均功率.
④如果x(n)是週期性信號,則Ф(k)也是週期性信號,並且其週期與x(n)的週期相同.

2.短時自相關函數的定義和性質

自相關函數具有一些性質(如它是偶函數;假設序列具有週期性,則其自相關函數也是同週期的周期函數等)。對於濁音語音可以用自相關函數求出語音波形序列的基音週期。在進行語音信號的線性預測分析時,也要用到自相關函數。語音信號x(m)的短時自相關函數R(k))的計算式如下:
Rn(k)=m=0N1kxn(m)xn(m+k)(0kK) R_{n}(k)=\sum_{m=0}^{N-1-k} x_{n}(m) x_{n}(m+k) \quad(0 \leq k\leq 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)=x(n)x(n+k)=0(k=0,±Np,±2Np,) d(n)=x(n)-x(n+k)=0 \quad\left(k=0, \pm N_{p}, \pm 2 N_{p}, \cdots\right)
對於實際的語音信號,d(n)雖不爲零,但其值很小。這些極小值將出現在整數倍週期的位置上。爲此,可定義短時平均幅度差函數:
Fn(k)=m=0N1kxn(m)xn(m+k) F_{n}(k)=\sum_{m=0}^{N-1-k}\left|x_{n}(m)-x_{n}(m+k)\right|
平均幅度差函數和自相關函數有密切的關係,兩者之間的關係可由下式表達:
Fn(k)=2β(k)[Rn(0)Rn(k)]1/2 F_{n}(k)=\sqrt{2} \beta(k)\left[R_{n}(0)-R_{n}(k)\right]^{1 / 2}
β(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

運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章