ms_s3ast.m

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

M
278
字号
disp(' ');
disp('SCRIPT: mstr_seg3ast.m ***********************************************');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	mstr_seg3ast.m
%
%	jmw
%	2/9/94
%
%	loads results of seg3_3st and fdiff3st and displays master (mstr)
%	segmentation plan...
%	
%	BASED UPON 1986 Tokyo ICASSP Paper by Glass and Zue (p2767)
%	INCLUDES post processing to remove false hits in the middle of silent
%	intervals
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

file_string = sprintf('%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('%s_Data.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);

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

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

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

		PLT = 1; 	% flag to determine plotting

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

% display seg data

[m,n]=size(cofa);

VOICED   = 2.0;
UNVOICED = 1.0;
SILENT   = 0.0;

for i=1:length(voicetype),
        if VUS_voicetype(i) == 'v'
                vt(i) = VOICED;
        elseif VUS_voicetype(i) == 'u'
                vt(i) = UNVOICED;
        elseif VUS_voicetype(i) == 's'
                vt(i) = SILENT;
        end;
end;

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

% find boundaries in VUS data

if (seg_cnt > 1)
	num_bnd = seg_cnt -1;
	vus_bnd = zeros(1,num_bnd);
	for i=1:num_bnd,
		vus_bnd(i) = seg_frame(i+1,1);
	end;
end;

disp_vus = zeros(1,m);
for i=1:m,
	x=find(i==vus_bnd);
	nohit = isempty(x);
	if (nohit)
		;
	else
		disp_vus(i) = 1;
	end;
end;
	
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% find subsegments (spectral boundaries within vbus boundaries)

disp('No unvoiced sub-segmentation allowed !');
mbf=length(boundary_frames);
cnt = 0;
[msf,nsf]=size(seg_frame);
CLOSENESS_threshold = 2; % changed 2/22/94/ from 3; 
new_b_frms = [];

for i=1:mbf,
	fa=[]; fb=[];
	error_matrix = abs((boundary_frames(i) * ones(msf,nsf)) - seg_frame);
	[fa,fb] = find(error_matrix <= CLOSENESS_threshold);
		if( fa==[] & fb==[])
			% now check if in unvoiced segment 
			% (no subsegments allowed)
			if(VUS_voicetype(boundary_frames(i)) == 'v')
				cnt = cnt + 1;
				new_b_frms(cnt) = boundary_frames(i);
			end;
		end;
end;
			
%end;	

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

% find new subsegmnt spectral boundaries

spect_boundary = zeros(1,m);

for i=1:m,
	if (find(i==new_b_frms))
		spect_boundary(i) = 1;
	end;
end;

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

if (PLT)
	disp('plotting results ...');

	h=gcf;
	figure(h);
	clg;

	subplot(411);
	plot(signal);
	grid;
	a=axis;
	axis(a);
	s=sprintf('%s', name);
	title(s);

	subplot(412);
	stairs(range(:,1), vt);
	axis([a(1) a(2) -1 3]);
	grid;
	s=sprintf('V/U/S voicetype');
	title(s);

	% add segment lengths to graph
	for i=1:seg_cnt,
        	s=sprintf('%d',seg_len(i));
        	if seg_type(i) == 's'
               	 y = -0.5;
        	elseif seg_type(i) == 'u'
                	y = 1.25;
        	elseif seg_type(i) == 'b'
                	y=2.25;
        	else
               		y=2.6;
        	end;
       		text(round(seg_range(i,1) + 0.4*seg_len(i)),y,s);
	end;

	subplot(413);
	stairs(range(:,1),disp_vus);
	axis([a(1) a(2) -1 2]);
	grid on;
	title('V/U/S segment boundaries');
	for i=1:num_bnd,
		s=sprintf('%d', range(vus_bnd(i),1));
		if ( rem(i,2)==1)
			ht = 1.7;
		else
			ht = 1.3;
		end;
		text(range(vus_bnd(i),1)-200,ht,s);
	end;

	subplot(414);
	stairs(range(:,1),(spect_boundary));
	axis([a(1) a(2) -1 2]);
	grid on;
	title('spectral subsegment boundaries');
	for i=1:length(new_b_frms),
		s=sprintf('%d', range(new_b_frms(i),1));
		if ( rem(i,2)==1)
			ht = 1.7;
		else
			ht = 1.3;
		end;

		text(range(new_b_frms(i),1)-200,ht,s);
	end;
end;
%end;
	
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% segment

seg_points = spect_boundary + disp_vus;
seg_frame(1,1)=1;

seg_cnt = 1;
for i = 2:m,
        if ( seg_points(i) == 1)
                % start new segment
                seg_cnt = seg_cnt + 1;
                seg_frame(seg_cnt,1) = i;
		seg_type(seg_cnt) = VUS_voicetype(i);
		seg_frame(seg_cnt-1,2) = i-1;
		
	else
		% still in same old segment
		seg_frame(seg_cnt,2) = i;
		seg_type(seg_cnt) = VUS_voicetype(i);
        end;
end;

for i=1:seg_cnt,
	seg_range(i,1) = range(seg_frame(i,1),1);
	seg_range(i,2) = range(seg_frame(i,2),2);
end;

new_seg_cnt = seg_cnt;
new_seg_range = seg_range;
new_seg_frame = seg_frame;
new_seg_type = seg_type;

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

% save results
s=sprintf('saving ./%s_NewSegdata to disk ...',name);
disp(s);
s=sprintf('save %s_NewSegdata new_seg_cnt new_seg_range new_seg_frame',name);
s2 = sprintf(' new_seg_type');
s=[s s2];
eval(s);

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

% clean up time

clear CLOSENESS_threshold           new_seg_cnt                   
clear PLT                           new_seg_frame                 
clear SILENT                        new_seg_range                 
clear UNVOICED                      new_seg_type                  
clear VOICED                        nohit                         
clear VUS_voicetype                 nsf                           
clear a                             num_bnd                       
clear boundary                      power                         
clear boundary_frames               range                         
clear cnt                           residue                       
clear cofa                          s2                            
clear disp_vus                      seg_cnt                       
clear error_matrix                  seg_frame                     
clear fa                            seg_len                       
clear fb                            seg_points                    
clear file_string                   seg_range                     
clear h                             seg_type                      
clear ht                            signal                        
clear i                             spect_boundary                
clear m                             voicetype                     
clear mbf                           vt                            
clear msf                           vus_bnd                       
clear n                             x                             
clear new_b_frms                    y  
                        
s=sprintf('clear %s', name);
eval(s);
clear s     

⌨️ 快捷键说明

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