fun_nm1.m

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

M
476
字号
%function func_newmap1(name)
disp(' ');
disp('FUNCTION: func_newmap1.m *********************************');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	jmw 
%
%	6/27/94
%	
%	5/02/94 4/06/94
%	
%	segment duration calculation program development
%
%	this version also allows time expansion as well as time compression
%
%	it also checks calculated duration with the specified
%	MINIMUM duration and adjusts if too short. MD file is 
%	LOADED from disk ...
%
%	This version uses the previously calculated and saved indx
%	vector to decide which frames live and which frames die ...
%
%  modified by D. G. Childers 2/16/98
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

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

file_string=sprintf('./temp/%s_SF.mat',name);
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);

% load minimum durations

file_string=sprintf('./temp/%s_MD.mat',name);	
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);

% load manual override flags and scale factors

file_string=sprintf('./temp/%s_MSF.mat',name);	
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);

% load MASTERMAP

file_string=sprintf('./temp/%s_Maps.mat',name);	
s=sprintf('loading %s',file_string);
disp(s);
s=sprintf('load %s',file_string);
eval(s);

disp(' ');

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

% initialize

initial_dur = zeros(1,seg_cnt);		% starting segment durations
Excite = [];				% indexes of frames that will be kept
ranking = zeros(1,length(VUS_voicetype));

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

% record entire first & last silent (non-word) Excitations 

initial_dur(seg_cnt) = (seg_range(seg_cnt,2)-seg_range(seg_cnt,1)+1);

Excite = [Excite [seg_frame(1,1):1:seg_frame(1,2)] ];
Excite = [Excite [seg_frame(seg_cnt,1):1:seg_frame(seg_cnt,2)] ];

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

% data to be recorded for later use - results of mapping process
% also initialize values for first (silent) segment

map_seg_choice = [];
map_seg_choice(1,:) = choice_1(1,:);	% record first (silent) segment

map_seg_dur = []; 
map_seg_dur(1) = (seg_range(1,2)-seg_range(1,1)+1);
					% record first (silent) segment
map_seg_range = [];
map_seg_range(1,:) = seg_range(1,:);	% record first (silent) segment

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

% display titles for console display 
	
s1=sprintf('seg #');
s1a=sprintf('\tsegment');
s2=sprintf('\t initial');
s3=sprintf('    min ');
s4=sprintf('   final');
s5=sprintf('   spec''d');
s6=sprintf('     actual');
s7=sprintf('\tapplied');
s8=sprintf('\t manual ');
disp([s1 s1a s2 s3 s4 s5 s6 s7 s8]);

s11a=sprintf('\ttype');
s12=sprintf('\t dur');
s13=sprintf('\t    dur');
s14=sprintf('\t   dur');
s15=sprintf('\t   sf');
s16=sprintf('\t      sf');
s17=sprintf('\trules');
s18=sprintf('\t override ?');
disp([s11a s12 s13 s14 s15 s16 s17 s18]);

disp(' ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% do word segments

map_seg_cnt = 1;		% counter of _output_ segments

for i = 2:seg_cnt-1,		% ignore first and last (silent) segments
	
        dur(i) = (seg_range(i,2)-seg_range(i,1)+1);
	initial_dur(i) = dur(i);
	ndur(i) = dur(i);

	% scale durations accordingly (if appropriate)
	
	md_flag_1 = [];	% flag to indicate min. duration violation before mods
	md_flag_2 = [];	% flag to indicate min. duration violation after mods

	if (man_override_flag(i) == 0)
        	if (strcmp(choice_1(i,:),'   silent'))	
			md(i) = sil_md;
			sf(i) = sil_sf;
        	elseif (strcmp(choice_1(i,:),'    nasal'))
			md(i) = nas_md;
			sf(i) = nas_sf;
       	 	elseif (strcmp(choice_1(i,:),'    vowel'))
            		md(i) = vwl_md;
			sf(i) = vwl_sf;
        	elseif (strcmp(choice_1(i,:),' unv stop'))
        		md(i) = ust_md;
			sf(i) = ust_sf;
		elseif (strcmp(choice_1(i,:),' unv fric'))
             		md(i) = ufr_md;
			sf(i) = ufr_sf;
        	elseif (strcmp(choice_1(i,:),' voicfric'))	
			md(i) = vfr_md;
			sf(i) = vfr_sf;
       		elseif (strcmp(choice_1(i,:),' voicebar'))
			md(i) = bar_md;
			sf(i) = bar_sf;
        	elseif (strcmp(choice_1(i,:),'semivowel'))
           		md(i) = smv_md;
			sf(i) = smv_sf;
        	end;

	elseif (man_override_flag(i) == 1)
		
		sf(i) = man_sf(i);

        	if (strcmp(choice_1(i,:),'   silent'))	
			md(i) = sil_md;
		elseif (strcmp(choice_1(i,:),'    nasal'))
			md(i) = nas_md;
       	 	elseif (strcmp(choice_1(i,:),'    vowel'))
            		md(i) = vwl_md;
        	elseif (strcmp(choice_1(i,:),' unv stop'))
        		md(i) = ust_md;
		elseif (strcmp(choice_1(i,:),' unv fric'))
             		md(i) = ufr_md;
        	elseif (strcmp(choice_1(i,:),' voicfric'))	
			md(i) = vfr_md;
       		elseif (strcmp(choice_1(i,:),' voicebar'))
			md(i) = bar_md;
        	elseif (strcmp(choice_1(i,:),'semivowel'))
           		md(i) = smv_md;
        	end;
	end;

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

	% process each segment

	if (initial_dur(i) > md(i))   
			ndur(i) = dur(i) * sf(i);
			if (ndur(i) < md(i))
				md_flag_2 = 1;
				ndur(i) = md(i); 
			end;
	else
			md_flag_1 = 1;
			ndur(i) = dur(i) * sf(i);
			if (ndur(i) < md(i))
				ndur(i) = initial_dur(i); 
			end;
	end;

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

	dur(i) = round(ndur(i));		% round to nearest sample number

	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	% calculate/read/sort index vector (instead of using outside function)

	[r,indx]=sort(MASTERMAP(seg_frame(i,1):seg_frame(i,2)));

	indx=indx + seg_frame(i,1) - 1;
	%disp([indx' r']);

	% save ranking for later display
	
	for k=1:length(indx),
		ranking(indx(k)) = r(k);
	end;

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

	% if frames are to be CUT do this part only
	
	if (dur(i) <= initial_dur(i) )

		reqd_cut = initial_dur(i) - dur(i); % number of samples that are
					   	 % required to be cut
		total_cut = 0;			% counter to keep track of 
						% number of samples cut
		done = 0;			% flag

		while (~done)
			% temp count
			new_cut = range(indx(1),2) - range(indx(1),1) + 1; 
				

			if ( (total_cut + new_cut) < reqd_cut)
				total_cut = total_cut + new_cut;
				N = length(indx);
				indx = indx(2:N);	% remove first frame of
 							% list
				done = 0;

			elseif ( (total_cut + new_cut) == reqd_cut)
				total_cut = total_cut + new_cut;
				N = length(indx);
				indx = indx(2:N);
				done = 1;
	
			elseif ( (total_cut + new_cut) > reqd_cut)
				d1 = abs(total_cut - reqd_cut);
				d2 = abs(total_cut+new_cut - reqd_cut);
				if (d1 <= d2)
					done = 1;
				else
					total_cut = total_cut + new_cut;
					N = length(indx);
					indx = indx(2:N);
					done = 1;
				end;
			end;
		end;

		Excite = sort([Excite indx]);	% update Excitation record
		total_mod = (-1 * total_cut);


	end;	% end CUT routine
	
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	

	% if frames are to be ADDED do this part only
	
	if (dur(i) > initial_dur(i) )

		% reverse order of indx (put highest scores first)
		
		indx = rev_1a(indx);
		
		reqd_add = dur(i)-initial_dur(i); % number of samples that are
					   	 % required to be added
		total_add = 0;			% counter to keep track of 
						% number of samples added
		done = 0;			% flag
		indx_cnt = 0;

		while (~done)
			% temp count
			indx_cnt = indx_cnt + 1;
		    new_add= range(indx(indx_cnt),2)-range(indx(indx_cnt),1)+1;	
			if ( (total_add + new_add) < reqd_add)
				total_add = total_add + new_add;
				indx = [indx indx(indx_cnt)];	
				done = 0;

			elseif ( (total_add + new_add) == reqd_add)
				total_add = total_add + new_add;
				indx = [indx indx(indx_cnt)];	
				done = 1;
	
			elseif ( (total_add + new_add) > reqd_add)
				d1 = abs(total_add - reqd_add);
				d2 = abs(total_add+new_add - reqd_add);
				if (d1 <= d2)
					done = 1;
				else
					total_add = total_add + new_add;
					indx = [indx indx(indx_cnt)];
					done = 1;
				end;
			end;
		end;

		Excite = sort([Excite indx]);	% update Excitation record
		total_mod = total_add;
		
	end;	% end ADD routine

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

	% display results for either add or cut

	s1=sprintf('%2d',i);
	s2=sprintf('    %s',choice_1(i,:));
	s3=sprintf('\t%7d',initial_dur(i));
	s4=sprintf('\t%7d',md(i));
	%s5=sprintf('\t%7d',dur(i));
	s5=sprintf('\t%7d',initial_dur(i) + total_mod);
	s6=sprintf('\t    %4.2f  ',sf(i));
	s7=sprintf('    %4.2f', (initial_dur(i) +total_mod)/(initial_dur(i)));
	
	s8 = []; s9 = []; s10 = [];

	if (~isempty(md_flag_1))
		s8 = sprintf('\t1');
	else
		s8 = sprintf('\t');
	end;

	if (~isempty(md_flag_2))
		s9 = sprintf(' 2');
	end;

	if (man_override_flag(i) == 1)
		s10=sprintf('\t yes');
	else
		s10=sprintf('\t no');
	end;

	serror= [s8 s9 s10];
	disp([s1 s2 s3 s4 s5 s6 s7 serror]);
	
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	% compute mapped parameters for recording (for either add or cut)

	if (isempty(indx))
		% segment was completely removed - skip it
		;
	else
		map_seg_cnt = map_seg_cnt + 1;

		map_seg_choice(map_seg_cnt,:)=choice_1(i,:);

		map_seg_dur(map_seg_cnt) = initial_dur(i)+total_mod;
		d=map_seg_dur(map_seg_cnt)-1;

		map_seg_range(map_seg_cnt,1) = map_seg_range(map_seg_cnt-1,2)+1;
		map_seg_range(map_seg_cnt,2) = map_seg_range(map_seg_cnt,1)+d;
	end;
	
end;	% end loop for each input segment

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

% enter last segment's values in mapping data to be saved

map_seg_cnt = map_seg_cnt + 1;
map_seg_choice(map_seg_cnt,:)=choice_1(seg_cnt,:);
map_seg_dur(map_seg_cnt) = initial_dur(seg_cnt);
map_seg_dur = map_seg_dur'; 
map_seg_range(map_seg_cnt,1) = map_seg_range(map_seg_cnt-1,2)+1;
d=map_seg_dur(map_seg_cnt)-1;
map_seg_range(map_seg_cnt,2) = map_seg_range(map_seg_cnt,1)+d;

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

% save results

disp(' ');

s=sprintf('saving ./%s_Excite.mat to hard disk ...', name);
disp(s);
s=sprintf('save temp/%s_Excite Excite ', name);
eval(s);

s=sprintf('saving ./%s_MapData.mat to hard disk ...', name);
disp(s);
s1=sprintf('map_seg_dur map_seg_choice map_seg_range map_seg_cnt');
s2=sprintf('save temp/%s_MapData s1', name);
eval(s2);

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

%  create message window and write message in that window also
   message_window=figure('Unit','normalized',...
           'Position',[0.05 0.2 0.9 0.2],...
           'Resize','off',...
           'Color',BACK_COLOR,...
           'Numbertitle','off',...
           'Name','Message');
axis('off');        
ss=sprintf('The Map calculations are finished.  Press Synthesis.');
text(-0.05,1,ss,'color',[0 0 1],'FontSize',10);
pause(3.);
close(message_window);
clear message_window;
%%%%%%%%%%%%%%%%%%%%%%%%%


%return;

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

% clean up time

clear N                   i                   sil_sf              
clear bar_sf              initial_dur         smv_sf              
clear choice_1                                total_cut           
clear choice_2            nas_sf              ufr_sf              
clear d1                  new_cut             ust_sf              
clear d2                  reliability_1       vfr_sf              
clear done                reliability_2       vwl_sf              
clear dur                 reqd_cut 
clear Excite              num_frames          seg_cnt             
clear VUS_voicetype       power               %seg_frame           
clear cofa                r                   seg_range           
clear file_string         range               seg_type            
clear indx                residue             voicetype           
clear s3                    s 		      s1
clear s2                
clear map_seg_choice      map_seg_dur         seg_frame           
clear map_seg_cnt 
clear d map_seg_range  
clear indx_cnt new_add reqd_add total_add     
clear bar_md          sil_md    ufr_md    vfr_md    
clear md_flag_2   nas_md    smv_md    ust_md    vwl_md   ndur 
clear s12 s13 s14 s15 s16 s17 s1a s4 s5 s6 s7 s8 s9 serror sf md md_flag_1
clear s11a total_mod
clear a h k ranking 
clear s10 s18 man_sf man_override_flag MASTERMAP

s=sprintf('clear %s', name);
eval(s);
clear s

%clear a h k ranking signal

⌨️ 快捷键说明

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