mokora 发表于 2007-4-15 13:24

MATLAB的GUI編程做一個錄音的程序

我要用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 = 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()
ylabel('Speech');
line(, [-1 1], 'Color', 'red');
line(, [-1 1], 'Color', 'red');
plot(amp,'Parent',handles.axes2);
axis()
ylabel('Energy');
line(, , 'Color', 'red');
line(, , 'Color', 'red');
plot(zcr,'Parent',handles.axes3);
axis()
ylabel('ZCR');
line(, , 'Color', 'red');
line(, , 'Color', 'red');
%回放
wavplay(x, Fs);

eight 发表于 2007-4-15 17:11

原帖由 mokora 于 2007-4-15 13:24 发表
我要用MATLAB的GUI編程做一個錄音的程序。GUI前面板上有一個pushbutton和axes1、axes2、axes3,pushbutton為錄音按鍵,axes1要求顯示語音波形,axes2要求顯示短時能量波形,axes3要求顯示過零率波形。
整體框架 ...


参考以下链接的帖子,看有否收获吧:我以前做过的课程设计(转)

mokora 发表于 2007-4-16 15:43

謝謝你

jany 发表于 2007-5-14 10:59

请教!! 语音信号matlab !

在Matlab环境下提取出语音的部分特征参数,短时平均幅度差,短时自相关函数,短时谱分析、语谱图!!!

急需源程序,感谢:handshake
页: [1]
查看完整版本: MATLAB的GUI編程做一個錄音的程序