马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
我要用MATLAB的GUI編程做一個錄音的程序。GUI前面板上有一個pushbutton和axes1、axes2、axes3,pushbutton為錄音按鍵,axes1要求顯示語音波形,axes2要求顯示短時能量波形,axes3要求顯示過零率波形。
整體框架是:錄音程序中要使用短時能量和過零率來實現端點檢測功能,短時能量和過零率分別設置高低兩個門限值,儅語音信號超過兩個低門限時進入可能語音段,否則為靜音段;儅語音信號超過任一個高門限時,進入語音段,錄音、繪圖並回放;若語音信號超過高門限但是語音時間極短,則視爲噪音。
繪圖時,要在波形圖上由兩條竪綫標明語音段。
我在下面附上我現在的程序(運行程序后端點檢測完全沒有動靜),而且雖然波形是畵在指定axes上,但總會彈出一個有空白坐標的子圖窗口,並且過零綠始終沒有波形。
請懂MATLAB的GUI編程的高手幫幫忙寫個完整程序,麻煩加我MSN:pourqoui825@hotmail.com,謝謝。PS:我使用的軟件版本是7.0.1。
global x
%開始錄音
Fs = 11025;
x = wavrecord(3*Fs, Fs, 'int16');
%端点檢測
function [x1,x2] = vad(x)
%幅度歸一化到[-1,1]
x = double(x);
x = x /max(abs(x));
%常數設置
FrameLen = 240;
FrameInc = 80;
amp1 = 10;
amp2 = 2;
zcr1 = 10;
zcr2 = 5;
maxsilence = 3; %3*10ms=30ms
minlen = 15; %15*10ms=150ms
status = 0;
count = 0;
silence = 0;
%計算過零率
zcr = zeros(size(y,1),1);
delta = 0.02;
for i=1:size(y,1)
x = y(i,:);
for j=1:length(x)-1
if x(j) * x(j+1) < 0 & abs(x(j)-x(j+1))>delta
zcr(i) = zcr(i)+1;
end
end
end
%計算短時能量(絕對值能量)
amp = sum(abs(x), 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;
%繪製波形圖
plot(x,'Parent',handles.axes1)
axis([1 length(x) -1 1])
ylabel('Speech');
line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red');
line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');
plot(amp,'Parent',handles.axes2);
axis([1 length(amp) 0 max(amp)])
ylabel('Energy');
line([x1 x1], [min(amp),max(amp)], 'Color', 'red');
line([x2 x2], [min(amp),max(amp)], 'Color', 'red');
plot(zcr,'Parent',handles.axes3);
axis([1 length(zcr) 0 max(zcr)])
ylabel('ZCR');
line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');
line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');
%回放
wavplay(x, Fs); |