agif_it.m

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

M
157
字号
%
% iterative GIF analysis
%


PV=[270 44 515 268];
s2 = 'Iterative GIF - Output';

% Open analysis window
while exist('agif_iter_win_h')==1
   try1 = 'get(agif_iter_win_h,''position'');';
   eval(try1,catch2);
   if check ==0
      clear agif_iter_win_h;
      check = 1;
      break;
   end
   s1 = get(agif_iter_win_h,'Name');
   if ~strcmp(s1,s2)
      clear agif_iter_win_h;
      break;
   end
   figure(agif_iter_win_h);
   break;
end;

if exist('agif_iter_win_h')~=1;
	agif_iter_win_h=figure('Position',PV,...
			'Resize','on',...
			'Numbertitle','off',...
			'Name',s2);
end

GVV=zeros(size(SPEECH));
DGVV=zeros(size(SPEECH));
RESIDUE=zeros(size(SPEECH));

analy_1c;
pkpk_1c;

num_gci=length(gci);

clear gci_a;
gci_a = gci;
num_gci=length(gci_a);

dg_final=[];
g_final=[];
ext_left=0;
ext_right=0;
LPF3=fir1(3,0.5);
ff=zeros(num_gci,5);
fb=zeros(num_gci,5);

for cur_gci=1:num_gci-1
   ydata_a=SPEECH(gci_a(cur_gci):gci_a(cur_gci+1));
   ydata_b=SPEECH(gci_a(cur_gci)-ext_left:...
      gci_a(cur_gci+1)+ext_right);
   ydata_p=diff(ydata_a);
	ydata_lp=filter(LPF3,1,ydata_b);

	% Estimate glottal effect to speech
	ydata_w=hamming(length(ydata_a)).*ydata_a;
	%Hg1=lpc_cov(ydata_a,1);
	Hg1=lpc(ydata_w,1);
	
	% Eliminate the estimated glottal contribution
	tmp=filter(Hg1, 1, ydata_lp);
	tmp_w=hamming(length(tmp)).*tmp;
	
	% The first estimate for the vocal tract
   Hvt1=lpc(tmp_w,num_poles);
	
	% Eliminate the effect of vocal tract
	tmp=filter(Hvt1,1,ydata_lp);
   
	% The first estimate for the glottal excitation
	g1=integ_1a(tmp);
	g1_w=hamming(length(g1)).*g1;
	
	% Second iteration begins here
   Hg2=lpc(g1_w,4);
	
	% Eliminate the estimated glottal contribution
	tmp=filter(Hg2,1,ydata_lp);
	tmp_w=hamming(length(tmp)).*tmp;
	
	% The final model for the vocal tract
   Hvt2=lpc(tmp_w,num_poles);
	[Fs Ws]=freqz(1,Hvt2,2048);
	[ff(cur_gci,:) fb(cur_gci,:)]=frm_trk2(Hvt2, Ts);
	
   % Eliminate the effect of vocal tract
   dg2=filter(Hvt2,1,ydata_lp);
	dg2=filter([1 -1],[1 -.99],dg2);
	
	% The final estimate for the glottal excitation
	g2=integ_1a(dg2);
	g2=filter([1 -1],[1 -.99],g2);
	
   % Connect each analysis frame
   dg_final=[dg_final ; dg2(ext_left+1:length(dg2)-ext_right)];
   g_final=[g_final ; g2(ext_left+1:length(g2)-ext_right)];
end
dg_final = filter([1 -1],[1 -.99],dg_final);
subplot(211);
plot(dg_final);
title('Differentialted GVV');
subplot(212);
plot(g_final);
title('GVV by Iterative Analysis');

PV = [2 255 185 118];
s2 = 'Iterative Analysis';
% Open analysis window
while exist('agif_it_ana_win_h')==1
   try1 = 'get(agif_it_ana_win_h,''position'');';
   eval(try1,catch2);
   if check ==0
      clear agif_it_ana_win_h;
      check = 1;
      break;
   end
   s1 = get(agif_it_ana_win_h,'Name');
   if ~strcmp(s1,s2)
      clear agif_it_ana_win_h;
      break;
   end
   figure(agif_it_ana_win_h);
   break;
end;

if exist('agif_it_ana_win_h')~=1;
   agif_it_ana_win_h=figure('Position',PV,...
      'Resize','on',...
      'Numbertitle','off',...
      'Name',s2);
   
   agif_it_sa = uicontrol('Style','Pushbutton',...
      'Position',[10 70 130 30],...
      'String','Save(dgvv)',...
      'Callback','agif_auto_save');
   agif_it_cancel = uicontrol('Style','Pushbutton',...
      'Position',[10 20 130 30],...
      'String','Cancel',...
      'Callback','agif_it_ca');
end

if gif_mark_flag == 1;
   SPEECH = SPEECH_OLD_A;   
   gif_mark_flag = 0;
   NEW_LEFT = 1;
   NEW_RIGHT = length(SPEECH);
   NEW_LEN = length(SPEECH);
end

⌨️ 快捷键说明

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