?? edp.m
字號:
close all
clear
clc
[x]=wavread('speech.wav');
%幅度歸一化到[-1,1]
x = double(x);
x = x / max(abs(x));
%常數設置
FrameLen = 240;
FrameInc = 80;
amp1 = 10;
amp2 = 2;
zcr1 = 10;
zcr2 = 5;
maxsilence = 10; % 10*10ms = 30ms
minlen = 20; % 15*10ms = 150ms
status = 0;
count = 0;
silence = 0;
%計算過零率
tmp1 = enframe(x(1:length(x)-1), FrameLen, FrameInc);
tmp2 = enframe(x(2: length(x)) , FrameLen, FrameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr = sum(signs.*diffs, 2)
%計算短時能量
amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);
%調整能量門限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);
%開始端點檢測
x1 = 0;
x2 = 0;
for n=1:length(zcr)
goto = 0;
switch status
case {0,1} % 0 = 靜音, 1 = 可能開始
if amp(n) > amp1 % 確信進入語音段
x1 = max(n-count-1,1);
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) > zcr2
count = count + 1;
else % 語音將結束
silence = silence+1;
if silence < maxsilence % 靜音還不夠長,尚未結束
count = count + 1;
elseif count < minlen % 語音長度太短,認為是噪聲
status = 0;
silence = 0;
count = 0;
else % 語音結束
status = 3;
end
end
case 3,
break;
end
end
count = count-silence/2
x2 = x1 + count -1
subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel('Speech');
title('語音信號檢測結果')
line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red');
line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');
subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel('Energy');
title('短時能量')
line([x1 x1], [min(amp),max(amp)], 'Color', 'red');
line([x2 x2], [min(amp),max(amp)], 'Color', 'red');
subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel('ZCR');
title('過零率')
line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');
line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -