声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1415|回复: 3

[编程技巧] MATLAB的GUI編程做一個錄音的程序

[复制链接]
发表于 2007-4-15 13:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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);
回复
分享到:

使用道具 举报

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



参考以下链接的帖子,看有否收获吧:我以前做过的课程设计(转)
 楼主| 发表于 2007-4-16 15:43 | 显示全部楼层
謝謝你
发表于 2007-5-14 10:59 | 显示全部楼层

请教!! 语音信号matlab !

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

急需源程序,感谢:handshake
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-19 06:20 , Processed in 0.057602 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表