bar2st.m

来自「这是一个用于语音信号处理的工具箱」· M 代码 · 共 237 行

M
237
字号
disp(' ');
disp('SCRIPT:   bar2st.m ***********************************************');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 
%	jmw 	
%	1/12/94
%	1/5/94
%	
%	playing with Weinstein, et al., algorithm for parsing based
% 	upon RMS values of BP filters
% 	gain calculated from sqrt of res NRG
%
%	AS A RESULT, IT IS USED TO: detect voice bars (which look similar
%	to nasals in my other algorithms ...
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

		PLT = 1;	% flag to plot results

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

file_string = sprintf('temp/%s.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);
signal = eval(name);

file_string = sprintf('temp/%s_Data.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% compute freq response

disp('calculating bar ratio ...');

N=256;
start1 = 2;
stop1 = 34;
start2 = 35;
stop2=N;

[m,n]=size(cofa);
bar = zeros(m,1);
e1 = zeros(m,1);
e2 = zeros(m,1);
gain = zeros(m,1);

for i=1:m-1,

	if(VUS_voicetype(i)=='v' )
		
		a = range(i,1);
		b = range(i,2);
	
		%res_nrg = residue(a:b) * residue(a:b)' ;
		%gain(i) =	sqrt(res_nrg); % removed 9/30/94 jmw
	
		gain(i) = 1;

		[h,w]=freqz(gain(i),cofa(i,:),N);
		mag=abs(h);
	
		e1(i)=sqrt(mag(start1:stop1)' * mag(start1:stop1));
		e2(i) = sqrt(mag(start2:stop2)' * mag(start2:stop2));
		bar(i) = e1(i) /e2(i);
	else
		;
	end;
end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% smooth bar ratio
MFO = 5; % old value was 3;	% median filter order
s=sprintf('smoothing bar ratio with median filter of order %d ...', MFO);
disp(s);
bar=median1(bar,MFO);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% calculate bar score

bar_score = zeros(1,m);
B_thresh_HI  = 30;		% empirically determined
B_thresh_LOW = 10; 
R = B_thresh_HI - B_thresh_LOW;
B_line_HI  = B_thresh_HI * ones(1,14000);
B_line_LOW = B_thresh_LOW * ones(1,14000);
BAR_NOISE_FLOOR = 0.05;

for i=1:m,
	if ( bar(i) > B_thresh_HI )
		bar_score(i) = 1;
	elseif ( bar(i) > B_thresh_LOW )
		bar_score(i) = (bar(i)-B_thresh_LOW) / R;
	end;

	if bar_score(i) < BAR_NOISE_FLOOR
		bar_score(i) = 0;
	end;
end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% segment 

seg_cnt = 0;
flg = 1;

for i = 1:m,
        if ( bar_score(i) > 0 & flg == 1)
                % start new segment
                seg_cnt = seg_cnt + 1;
                seg_frames(seg_cnt,1) = i;
                flg = 0;
        elseif ( bar_score(i) > 0 & flg==0)
                % continue in current segment
                seg_frames(seg_cnt,2) = i;
        elseif ( bar_score(i) == 0 & flg==0 )
                % segment just ended on previous frame - reset flag
		seg_frames(seg_cnt,2) = i-1;
                flg = 1;
        end;
end;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% and discard segments that are tooooo short

events = 0;
BAR_thresh = 300;

if ( seg_cnt >0)
	% segments do exist
	for i=1:seg_cnt,
		a=range(seg_frames(i,1),1);
		b=range(seg_frames(i,2),2);
		if ( (b-a) < BAR_thresh)
			% discard - too short
			events = events + 1; % counter of segments eliminated
			a=seg_frames(i,1);
			b=seg_frames(i,2);
			bar_score(a:b) = zeros(1,b-a+1);
		end;
	end;
end;
s=sprintf('eliminating bar segments less than');
s1 = sprintf(' %d samples: ... %d events',BAR_thresh,events);
s=[s s1];
disp(s);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if (PLT)

	titles = 1;	% turn off for diss figs

	disp('plotting results ...');

	h=gcf;
	figure(h);
	clf;
	subplot(311);
	plot(signal);
	grid;
	axis_1=axis;
	axis(axis_1);
	s=sprintf('%s', name);
	if (titles)
		title(s);	
	end;

	subplot(312);
	stairs(range(:,1),bar);
	axis([axis_1(1) axis_1(2) 0 50]);
	hold on;
	%plot(range(:,1), B_line_LOW, ':');
	%plot(range(:,1), B_line_HI, ':');
	plot( B_line_LOW, '--');
	plot( B_line_HI, '--');
	hold off;
	grid;
	s=sprintf('smoothed bar ratio - order %d median filter', MFO);
	if (titles)
		title(s);
	end;

	subplot(313);
	stairs(range(:,1), bar_score);
	grid on;
	axis([axis_1(1) axis_1(2) -0.5 1.5]);
	if (titles)
		title('(Voice) Bar Score');
	end;

	drawnow;
end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% save to disk
s=sprintf('saving ./%s_BARscore to disk ...', name);
disp(s);
s=sprintf('save temp/%s_BARscore bar_score', name);
eval(s);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% clean up time

clear BAR_NOISE_FLOOR     bar_score           range               
clear BAR_thresh          cofa                res_nrg             
clear B_line_HI           e1                  residue             
clear B_line_LOW          e2                  s1                  
clear B_thresh_HI         events              seg_cnt             
clear B_thresh_LOW        file_string         seg_frames          
clear MFO                 flg                 signal              
clear N                   gain                start1              
clear PLT                 h                   start2              
clear R                   i                   stop1               
clear VUS_voicetype       m                   stop2               
clear a                   mag                 voicetype           
clear axis_1              n                   w                   
clear b                                       
clear bar                 power 		titles
  
s=sprintf('clear %s',name);
eval(s);
clear s

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?