資源簡介
matlab程序雙門限法語音信號端點檢測(可實現多段檢測)
代碼片段和文件信息
function?[x1x2]?=?vad(x)
%幅度歸一化到[-11]
x?=?double(x);
x?=?x?/?max(abs(x));
%常數設置
frameLen?=?240;%幀長為240點
frameInc?=?80;%幀移為80點
amp1?=?10;%初始短時能量高門限
amp2?=?2;%初始短時能量低門限
zcr1?=?10;%初始短時過零率高門限
zcr2?=?5;%初始短時過零率低門限
maxsilence?=?8;??%?8*10ms??=?80ms???語音段中允許的最大靜音長度
minlen??=?15;????%?15*10ms?=?150ms??語音段的最短長度,若語音段長度小于此值,則認為其為一段噪音
status??=?0;?????%初始狀態為靜音狀態
count???=?0;?????%初始語音段長度為0
silence?=?0;?????%初始靜音段長度為0
?
%計算過零率
tmp1??=?enframe(x(1:end-1)?frameLen?frameInc);
tmp2??=?enframe(x(2:end)???frameLen?frameInc);
signs?=?(tmp1.*tmp2)<0;
diffs?=?(tmp1?-tmp2)>0.02;
zcr???=?sum(signs.*diffs?2);
?
%計算短時能量
amp?=?sum(abs(enframe(x?frameLen?frameInc))?2);
?
%調整能量門限
amp1?=?min(amp1?max(amp)/4);
amp2?=?min(amp2?max(amp)/8);
subplot(311)????%subplot(311)表示將圖排成3行1列,最后的一個1表示下面要畫第1幅圖
plot(x)
axis([1?length(x)?-1?1])????
ylabel(‘Speech‘);
subplot(312)???
plot(amp);
axis([1?length(amp)?0?max(amp)])
ylabel(‘Energy‘);
subplot(313)
plot(zcr);
axis([1?length(zcr)?0?max(zcr)])
ylabel(‘ZCR‘);
?
%開始端點檢測
x1?=?0;
x2?=?0;
for?n=1:length(zcr)
???goto?=?0;
???switch?status
???case?{01}???????????????????%?0?=?靜音?1?=?可能開始
??????if?amp(n)?>?amp1??????????%?確信進入語音段
?????????x1?=?max(n-count-11);
?????????status??=?2;
?????????silence?=?0;
?????????count???=?count?+?1;
??????elseif?amp(n)?>?amp2?|?...?%?可能處于語音段
?????????????zcr(n)?>?zcr2
?????????status?=?1;
?????????count??=?count?+?1;
??????else???????????????????????%?靜音狀態
?????????status??=?0;
?????????count???=?0;
??????end
???case?2???????????????????????%?2?=?語音段
??????if?amp(n)?>?amp2?|?...?????%?保持在語音段
?????????zcr(n)?>?z
評論
共有 條評論