語音信號短時時域分析
類型
短時能量
- 對數
- 平方和
- 絕對值
短時平均過零率
短時自相關分析
說明
語音信號的分幀處理,實際上就是對各幀進行某種變換或運算。
T[ ]
:表示這種變換或運算
x(n)
:輸入語音信號
w(n)
:窗序列
h(n)
:是與w(n)
有關的濾波器
則各幀經處理後的輸出可以表示爲:
幾種常見的短時處理方法:
- Qn對應於短時能量
- Qn對應於平均過零率
- Qn對應於自相關函數
短時平均能量
定義n時刻某語音信號的短時平均能力En爲:
- 因爲在窗函數外是爲0,所以求和範圍只需在窗函數內
當窗函數爲矩形窗時:
若令h(n)=w2(n),則短時平均能量就可以寫成:
實現框圖:
En反映語音信號的幅度或能量隨時間緩慢變化的規律。窗的長短對於能否由短時能量反映語音信號的幅度變化,起着決定性影響。
操作小記
描述:不同矩形窗長N時的短時能量函數
代碼
fid=fopen('zqq.txt','rt'); %讀入語音文件,r表示讀,t表示以文本方式打開。
%fid是文件代號,爲正整數,若爲-1表示打開文件失敗
x=fscanf(fid,'%d'); %讀入數據,%f是小數點形式的浮點數,此處也可改爲%d(整數)
fclose(fid);
%計算N=50,幀移=50時的語音能量
s=fra(50,50,x) %fra爲自定義的分幀函數。需要放到同一個文件夾下
s2=s.^2; %一幀內各樣點的能量
energy=sum(s2,2) %求一幀能量
subplot(2,2,1) %定義畫圖數量和佈局
plot(energy) %畫N=50時的語音能量圖
xlabel('幀數') %橫座標
ylabel('短時能量 E') %縱座標
legend('N=50') %曲線標識
axis([0,1500,0,2*10^10]) %定義橫縱座標範圍。
%文件共66000個數據,66000/50=1320,橫座標取0~1500。
%計算N=100,幀移=100時的語音能量
s=fra(100,100,x)
s2=s.^2;
energy=sum(s2,2)
subplot(2,2,2)
plot(energy) %畫N=100時的語音能量圖
xlabel('幀數')
ylabel('短時能量 E')
legend('N=100')
axis([0,750,0,4*10^10]) %定義橫縱座標範圍
%計算N=400,幀移=400時的語音能量
s=fra(400,400,x)
s2=s.^2;
energy=sum(s2,2)
subplot(2,2,3)
plot(energy) %畫N=400時的語音能量圖
xlabel('幀數')
ylabel('短時能量 E')
legend('N=400')
axis([0,190,0,1.5*10^11]) %定義橫縱座標範圍
%計算N=800,幀移=800時的語音能量
s=fra(800,800,x)
s2=s.^2;
energy=sum(s2,2)
subplot(2,2,4)
plot(energy) %畫N=800時的語音能量圖
xlabel('幀數')
ylabel('短時能量 E')
legend('N=800')
axis([0,95,0,3*10^11]) %定義橫縱座標範圍
----
%fra.m文件
function f=fra(len,inc,x)
fh=fix(((size(x,1)-len)/inc)+1) %fix爲向0取整函數
f=zeros(fh,len);
i=1;n=1;
while i<=fh
j=1;
while j<=len
f(i,j)=x(n);
j=j+1;n=n+1;
end
n=n-len+inc;
i=i+1;
end
效果
短時平均能量的主要用途
- 作爲區分清音和濁音的特徵參數
- 在信噪比較高的情況下,作爲區分有聲和無聲的依據
- 作爲輔助的特徵參數用於語音識別中
短時平均幅度
爲了克服短時能量函數計算x2(m)的缺點(定點計算容易溢出),定義了短時平均幅度函數:
實現框圖:
操作小記
描述:不同矩形窗長N時的短時能量函數
代碼
fid=fopen('zqq.txt','rt') %讀入語音文件
x=fscanf(fid,'%f')
fclose(fid)
s=fra(50,50,x) %語音短時平均幅度圖
s3=abs(s) %求絕對值
avap=sum(s3,2)
subplot(2,2,1)
plot(avap)
xlabel('幀數')
ylabel('短時平均幅度 M')
legend('N=50')
axis([0,1500,0,10*10^5])
s=fra(100,100,x)
s3=abs(s)
avap=sum(s3,2)
subplot(2,2,2)
plot(avap)
xlabel('幀數')
ylabel('短時平均幅度 M')
legend('N=100')
axis([0,750,0,2*10^6])
s=fra(400,400,x)
s3=abs(s)
avap=sum(s3,2)
subplot(2,2,3)
plot(avap)
xlabel('幀數')
ylabel('短時平均幅度 M')
legend('N=400')
axis([0,190,0,7*10^6])
s=fra(800,800,x)
s3=abs(s)
avap=sum(s3,2)
subplot(2,2,4)
plot(avap)
xlabel('幀數')
ylabel('短時平均幅度 M')
legend('N=800')
axis([0,95,0,14*10^6])
----
%fra.m文件
function f=fra(len,inc,x)
fh=fix(((size(x,1)-len)/inc)+1) %fix爲向0取整函數
f=zeros(fh,len);
i=1;n=1;
while i<=fh
j=1;
while j<=len
f(i,j)=x(n);
j=j+1;n=n+1;
end
n=n-len+inc;
i=i+1;
end
效果
Mn與En的比較
- Mn能較好地反映清音範圍內的幅度變化
- Mn所能反映幅度變化的動態範圍比En好
- Mn反映清音和濁音之間的電平差次與En
短時平均過零率
在離散時間語音信號情況下,如果相鄰的採樣具有不同的代數符號就稱爲發生了過零。單位時間內過零的次數就稱爲過零率。短時平均過零率的定義爲:
其中:
用1/2N作爲幅值,考慮了對該窗口範圍內的過零數取平均
另外:考慮到w(n-m)的非零值範圍爲n-m大於等於0,以及n-m小於等於N-1,所以短時平均過零率可以改寫爲:
實現框圖
操作小記
描述:女聲“我到北京去”的短時平均過零次數的變化曲線
代碼:(chapter3_6.m)
clear all
fid=fopen('beijing.txt','rt')
x1=fscanf(fid,'%f');
fclose(fid);
x=awgn(x1,15,'measured'); %加入15dB的噪聲。awgn將高斯白噪聲添加到信號中,
%'15'指定每一個採樣點信號與噪聲的比率,單位爲dB。
%'measured'在添加噪聲之前測量了x的能量
s=fra(220,110,x); %分幀,幀移110
zcr=zcro(s); %自定義函數,求過零率
figure(1); %畫圖
subplot(2,1,1) %第一個子圖
plot(x); %畫原始圖
title('原始信號'); %圖標題
xlabel('樣點數'); %橫座標名稱
ylabel('幅度'); %縱座標名稱
axis([0,39760,-2*10^4,2*10^4]); %限定橫、縱座標範圍
subplot(2,1,2) %畫第二個子圖
plot(zcr); %原始信號的過零率
xlabel('幀數'); %橫座標名稱
ylabel('過零次數'); %縱座標名稱
title('原始信號的過零率'); %圖標題
axis([0,360,0,200]); %限定橫、縱座標範圍
效果:
短時過零率的應用:
端點檢測可以從包含語音的一段信號中確定出語音的起點及結束點
- 清音過零率高,濁音過零率低
- 侷限性:濁音和清音重疊區域只根據短時平均過零率不可能明確地判別清、濁音
基於能量和過零率的語音端點檢測
語音端點檢測就是指從包含語音的一段信號中確定出語音的起始點和結束點。
正確的端點檢測對於語音識別和語音編碼系統都有重要的意義
檢測方法:兩級判決法(雙門限法)
兩級判決法示意圖
具體如下:
第一級判決:
- 先根據語音短時能量的輪廓選取一個較高的門限T1,進行一次判決:語音起止點位於該門限與短時能量包絡 交點所對應的時間間隔之外(即AB段之外)。
- 根據背景噪聲的平均能量確定一個較低的門限T2 , 並從A點往左、從B點往右搜索,分別找到短時能量包 絡與門限T2相交的兩個點C和D,於是CD段就是用雙門 限方法根據短時能量所判定的語音段。
第二級判決:
- 以短時平均過零率爲標準,從C點往左和從D點往右搜索,找到短時平均過零率低於某個門限T3的兩點E和F,這便是語音段的起止點。門限T3是由背景噪聲的平均過零率所確定的。
注意:門限T2,T3都是由背景噪聲特性確定的,因此,在進行起止點判決前,T1,T2,T3,三個門限值的確定還應當通過多次實驗
短時自相關函數
時域離散確定信號的自相關函數定義爲:
時域離散隨機信號的自相關函數定義爲:
自相關函數性質
- 對稱性R(k)= R(-k)
- 在k = 0處爲最大值,即對於所有k來說,|R(k)|≤R(0)
- 對於確定信號,R(0)對應於能量
- 對於隨機信號,R(0)對應於平均功率
語音信號的短時自相關函數
採用短時分析方法,定義語音信號短時自相關函數爲:
因爲 Rn(-k)=Rn(k),所以:
若定義hk(n)=w(n)w(n+k),則短時自相關函數可以寫成:
上式子表明,序列x(n)x(n-k)經過一個衝激響應爲hk(n)的數字濾波器濾波即得到短時自相關函數Rn(k),也可採用直接運算的方法得到Rn(k),如下式子:
實現框圖:
操作小記
代碼:濁音的短時自相關函數(chapter3_7.m)
fid=fopen('voice.txt','rt')
x=fscanf(fid,'%f');
fclose(fid);
s1=x(1:320); %選擇一段320點的語音段
N=320; %選擇的窗長
A=[]; %加N=320的矩形窗
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+s1(m)*s1(m+k-1); %計算自相關,因爲k從1開始,所以是m+k-1
end
A(k)=sum;
end
for k=1:320
A1(k)=A(k)/A(1); %歸一化A(k);
end
f=zeros(1,320); %加N=320的漢明窗
n=1;j=1;
while j<=320
f(1,j)=x(n)*[0.54-0.46*cos(2*pi*n/300)]; %漢明窗公式
j=j+1;n=n+1;
end
B=[];
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+f(m)*f(m+k-1); %自相關函數
end
B(k)=sum;
end
for k=1:320
B1(k)=B(k)/B(1);%歸一化B(k)
end
s2=s1/max(s1);
figure(1) %畫圖
subplot(3,1,1) %第一個子圖
plot(s2) %畫一幀語音信號
title('一幀語音信號')%圖標題
xlabel('樣點數') %橫座標名稱
ylabel('幅值') %縱座標名稱
axis([0,320,-1,1]);%限定橫、縱座標範圍
subplot(3,1,2)
plot(A1);
title('加矩形窗的自相關函數')
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
subplot(3,1,3)
plot(B1);
title('加哈明窗的自相關函數')
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
效果:濁音的短時自相關函數
代碼:清音的短時自相關函數
fid=fopen('qingyin1.txt','rt')
x=fscanf(fid,'%f');
fclose(fid);
s1=x(1:320); %選擇一段320點的語音段
N=320; %選擇的窗長
A=[]; %加N=320的矩形窗
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+s1(m)*s1(m+k-1); %計算自相關
end
A(k)=sum;
end
for k=1:320
A1(k)=A(k)/A(1); %歸一化A(k);
end
f=zeros(1,320); %加N=320的哈明窗
n=1;j=1;
while j<=320
f(1,j)=x(n)*[0.54-0.46*cos(2*pi*n/300)];
j=j+1;n=n+1;
end
B=[];
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+f(m)*f(m+k-1);
end
B(k)=sum;
end
for k=1:320
B1(k)=B(k)/B(1);%歸一化B(k)
end
s2=s1/max(s1);
figure(1)
subplot(3,1,1)
plot(s2)
title('一幀語音信號')
xlabel('樣點數')
ylabel('幅值')
axis([0,320,-1,1]);
subplot(3,1,2)
plot(A1);
title('加矩形窗的自相關函數')
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
subplot(3,1,3)
plot(B1);
title('加哈明窗的自相關函數')
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
效果:清音的短時自相關函數
濁音和清音的短時自相關函數特點:
- 短時自相關函數可以很明顯的反映出濁音信號的週期性
- 清音的短時自相關函數沒有周期性,也不具有明顯突出的峯值,其性質類似於噪聲
- 不同的窗對短時自相關函數結果有一定的影響
代碼:不同矩形窗長時的短時自相關函數
fid=fopen('voice.txt','rt')
x=fscanf(fid,'%f');
fclose(fid);
s1=x(1:320);
N=320; %選擇的窗長,加N=320的矩形窗
A=[];
for k=1:320;
sum=0;
for m=1:N-(k-1);
sum=sum+s1(m)*s1(m+k-1); %計算自相關
end
A(k)=sum;
end
for k=1:320
A1(k)=A(k)/A(1); %歸一化A(k);
end
N=160; %選擇的窗長, %加N=160的矩形窗
B=[];
for k=1:320;
sum=0;
for m=1:N-(k-1);
sum=sum+s1(m)*s1(m+k-1); %計算自相關
end
B(k)=sum;
end
for k=1:320
B1(k)=B(k)/B(1); %歸一化B(k);
end
N=70; %選擇的窗長,加N=70的矩形窗
C=[];
for k=1:320;
sum=0;
for m=1:N-(k-1);
sum=sum+s1(m)*s1(m+k-1); %計算自相關
end
C(k)=sum;
end
for k=1:320
C1(k)=C(k)/C(1); %歸一化C(k);
end
figure(1)
subplot(3,1,1)
plot(A1)
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
legend('N=320')
subplot(3,1,2)
plot(B1);
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
legend('N=160')
subplot(3,1,3)
plot(C1);
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
legend('N=70')
效果:不同矩形窗長時的短時自相關函數
長基音週期、窄窗:得不到預期的基音週期
短基音週期、長窗:函數對多個週期平均,模糊語音的短時特性
修正的短時自相關函數:使用較窄的窗,同時避免短時自相關函數隨k增加而衰減 ,修正的短時自相關函數可以寫成:
因爲求和上限是N-1,與k無關,故當k增加時,Rn(k)值不下降
代碼:修正的短時自相關函數
fid=fopen('voice.txt','rt')
x=fscanf(fid,'%f');
fclose(fid);
s1=x(1:320); %選擇一段320點的語音段
N=320; %選擇的窗長
A=[]; %加N=320的矩形窗
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+s1(m)*s1(m+k-1); %計算自相關,因爲k從1開始,所以是m+k-1
end
A(k)=sum;
end
for k=1:320
A1(k)=A(k)/A(1); %歸一化A(k);
end
f=zeros(1,320); %加N=320的哈明窗
n=1;j=1;
while j<=320
f(1,j)=x(n)*[0.54-0.46*cos(2*pi*n/300)];
j=j+1;n=n+1;
end
B=[];
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+f(m)*f(m+k-1);
end
B(k)=sum;
end
for k=1:320
B1(k)=B(k)/B(1);%歸一化B(k)
end
s2=s1/max(s1);
figure(1)
subplot(3,1,1)
plot(s2)
title('一幀語音信號')
xlabel('樣點數')
ylabel('幅值')
axis([0,320,-1,1]);
subplot(3,1,2)
plot(A1);
title('加矩形窗的自相關函數')
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
subplot(3,1,3)
plot(B1);
title('加哈明窗的自相關函數')
xlabel('延時 k')
ylabel('R(k)')
axis([0,320,-1,1]);
效果:修正的短時自相關函數
基音週期估值
基音週期估值在語音信號處理應用中具有十分重要的作用
語音信號基音週期估值最基本的兩種方法:
- 基於短時自相關法的基音週期估值
- 基於短時平均幅度差函數法的基音週期估值
基於短時自相關法的基音週期估值
語音的濁音信號具有準週期性,其自相關函數在基 音週期的整數倍處取最大值
計算兩相鄰最大峯值間的距離,可估計出基音週期。爲了減小運算量,需要對語音信號進行適當預處理。
預處理的兩種方法:
- 先對語音信號進行低通濾波,再進行自相關計算
- 語音信號包括豐富的諧音分量
- 基音頻率範圍一般在50~500Hz,女高音不超過 1kHz
- 採用1kHz的低通濾波器先對語音信號進行濾波, 保留基音頻率;再用2kHz採樣頻率進行採樣,最後用 2~20ms的滯後時間計算短時自相關,幀長取10~20ms,即可估計出基音週期
- 先對語音信號進行中心削波處理,再進行自相關計算
- 中心削波:削波後的序列用短時自相關函數估計基音週期,在基音週期處峯值更加尖銳,可減少倍頻或半頻錯誤。中 心削波函數爲(xL一般取本幀信號最大幅度的60%~70%):
- 三電平削波 :爲了克服短時自相關函數計算量大的問題,在中心削波法的基礎上,還可以採用三電平削波法,削波函數爲:
- 中心削波:削波後的序列用短時自相關函數估計基音週期,在基音週期處峯值更加尖銳,可減少倍頻或半頻錯誤。中 心削波函數爲(xL一般取本幀信號最大幅度的60%~70%):
基音週期估值的後處理
- 在提取基音時,提取的基音頻率軌跡與真實的基音頻率軌跡不可能完全吻合。通常在實際基音頻率的倍頻或分頻處發生偏離,產生“野點”。
- 爲了去除 “野點”,常用的平滑技術主要有:中值濾波平滑處理、線性平滑、動態規劃平滑處理
操作小記
代碼:中心削波
% 本程序運行結果爲中心削波前後的語音波形,以及削波前後的自相關波形
%讀入數據 採樣fs=8KHz 採樣位數16bit 長度320樣點
fid=fopen('voice.txt','rt'); %打開語音文件
[a,count]=fscanf(fid,'%f',[1,inf]); %讀語音文件
L=length(a); %測定語音的長度
m=max(a);
for i=1:L
a(i)=a(i)/m; %數據歸一化
end
%找到歸一化以後數據的最大值和最小值
m=max(a); %找到最大的正值
n=min(a); %找到最小的負值
%爲保證幅度值與橫座標軸對稱,採用計算公式是n+(m-n)/2,合併爲(m+n)/2
ht=(m+n)/2;
for i=1:L; %數據中心下移 保持和橫座標軸對稱
a(i)=a(i)-ht;
end
figure(1); %畫第一幅圖
subplot(2,1,1); %第一個子圖
plot(a,'k');
axis([0,1711,-1,1]); %確定橫、縱座標的範圍
title('中心削波前語音波形'); %圖標題
xlabel('樣點數'); %橫座標
ylabel('幅度'); %縱座標
coeff=0.7; %中心削波函數係數取0.7
th0=max(a)*coeff; %求中心削波函數門限(threshold)
for k=1:L ; %中心削波
if a(k)>=th0
a(k)=a(k)-th0;
elseif a(k)<=(-th0);
a(k)=a(k)+th0;
else
a(k)=0;
end
end
m=max(a);
for i=1:L; %中心削波函數幅度的歸一化
a(i)=a(i)/m;
end
subplot(2,1,2); %第二個子圖
plot(a,'k');
axis([0,1711,-1,1]); %確定橫、縱座標的範圍
title('中心削波後語音波形'); %圖標題
xlabel('樣點數'); %橫座標
ylabel('幅度'); %縱座標
fclose(fid); %關閉文件
%沒有經過中心削波的修正自相關計算
fid=fopen('voice.txt','rt');
[b,count]=fscanf(fid,'%f',[1,inf]);
fclose(fid);
N=320; %選擇的窗長
A=[];
for k=1:320; %選擇延遲長度
sum=0;
for m=1:N;
sum=sum+b(m)*b(m+k-1); %計算自相關
end
A(k)=sum;
end
for k=1:320
B(k)=A(k)/A(1); %自相關歸一化
end
figure(2); %畫第二幅圖
subplot(2,1,1); %第一個子圖
plot(B,'k');
title('中心削波前修正自相關'); %圖標題
xlabel('延時k'); %橫座標
ylabel('幅度'); %縱座標
axis([0,320,-1,1]);
%中心削波函數和修正的自相關方法結合
N=320; %選擇的窗長
A=[];
for k=1:320; %選擇延遲長度
sum=0;
for m=1:N;
sum=sum+a(m)*a(m+k-1); %對削波後的函數計算自相關
end
A(k)=sum;
end
for k=1:320
C(k)=A(k)/A(1); %自相關歸一化
end
subplot(2,1,2); %第二個子圖
plot(C,'k');
title('中心削波後修正自相關'); %圖標題
xlabel('延時k'); %橫座標
ylabel('幅度'); %縱座標
axis([0,320,-1,1]);
效果:中心削波
附錄
相關練習之選擇題
- 小明和誰打檯球了?(%^&$%^#$%@$ 題^_^)
答案:小麗 - 卷積不能用於以下哪個場景?
答案:計算炒股受益 - 預加重是爲了提升語音信號( )部分,去除口脣輻射的影響。
答案:高頻 - 對信號進行分幀加窗後的頻譜( )。
答案:會多出一些原來沒有的頻率成分 - 以下哪項的本質意義與其它三項不同?
答案:
- 可以用來分辨清音和濁音的是( )
答案:以上皆可 - 使用兩級判別法進行語音端點檢測,需要設置( )個門限值。
答案:3 - 先對語音信號進行中心削波處理,再進行自相關計算,是爲了更好地計算( )。
答案:基音週期
相關練習之簡答題
- 爲什麼對語音信號進行分析之前要分幀?
答案:爲了方便對語音信號進行分析,假設假設語音信號在10~30ms短時間內是平穩的。可把語音信號分幀進行處理。採用可移動的有限長度窗口進行加權實現分幀 - 爲什麼濁音的自相關函數具有周期性?
答案:因爲濁音具有周期性 - chapter3_6.m 代碼及註釋,粘貼到這裏
答案:參看上面代碼 - chapter3_7.m 代碼及註釋,粘貼到這裏
答案:參看上面代碼