www.pudn.com > voiceprocessingtoolbox.rar > endPointDetect01.m


function endPoint = endPointDetect01(wave, fs, plotOpt, epdParam) 
% endPointDetect: 根據音量來進行端點偵測 
%	Usage: endPoint = endPointDetect(wave, fs, plotOpt, epdParam) 
%		endPoint: 端點(長度為 2 的向量) 
%		wave: 輸入之聲音波形 
%		fs: 取樣頻率(只有在畫圖才用到) 
%		plotOpt: 是否畫出相關圖形 
%		epdParam: 端點偵測的相關參數 
 
%	Roger Jang, 20040413 
 
if nargin==0, selfdemo; return; end 
if nargin<2, fs=16000; end 
if nargin<3, plotOpt=0; end 
if nargin<4, 
	epdParam.frameSize = 256; 
	epdParam.overlap = 0; 
	epdParam.volumeRatio=0.1; 
end 
 
frameSize=epdParam.frameSize; 
overlap=epdParam.overlap; 
 
% ====== Zero adjusted 
wave = double(wave);				% 轉成資料型態是 double 的變數 
wave = wave-mean(wave);				% 零點校正 
frameMat  = buffer(wave, frameSize, overlap);	% 切出音框 
frameNum = size(frameMat, 2);			% 音框的個數 
volume = sum(abs(frameMat));			% 計算音量 
volumeTh = max(volume)*epdParam.volumeRatio;	% 計算音量門檻值 
index = find(volume>volumeTh);			% 找出超過音量門檻值的音框 
 
if isempty(index)				% 若找不到,回傳空矩陣 
	endPoint=[]; 
	return 
end 
 
endPoint=([index(1), index(end)]-1)*(frameSize-overlap)+frameSize/2;	% 由 frame index 轉成 sample index 
 
if plotOpt, 
	subplot(2,1,1); 
	time=(1:length(wave))/fs; 
	plot(time, wave); 
	axis tight; 
	line(time(endPoint(1))*[1 1], [min(wave), max(wave)], 'color', 'm'); 
	line(time(endPoint(end))*[1 1], [min(wave), max(wave)], 'color', 'm'); 
	ylabel('Amplitude'); 
	title('Waveform'); 
 
	subplot(2,1,2); 
	frameTime=(((1:frameNum)-1)*(frameSize-overlap)+frameSize/2)/fs; 
	plot(frameTime, volume, '.-'); 
	axis tight; 
	line([min(frameTime), max(frameTime)], volumeTh*[1 1], 'color', 'r'); 
	line(frameTime(index(1))*[1 1], [0, max(volume)], 'color', 'm'); 
	line(frameTime(index(end))*[1 1], [0, max(volume)], 'color', 'm'); 
	ylabel('Sum of abs.'); 
	title('Volume'); 
end 
 
% ====== Self demo 
function selfdemo 
wavefile='清華大學資訊系.wav'; 
[wave, fs, nbits] = wavread(wavefile); 
wave=wave*(2^nbits/2); 
plotOpt = 1; 
epdParam.frameSize = 256; 
epdParam.overlap = 0; 
epdParam.volumeRatio = 0.05; 
out = feval(mfilename, wave, fs, plotOpt, epdParam);