mgif_go.m

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

M
126
字号
%
% Manuall glottal inverse filtering algorithm
% Author : Minkyu Lee
% Date 10-Oct-1994
% Modified by D. G. Childers
%

% get a differentiated glottal wave estimate

% do a fixed pre-emphasis
p_ydata_m=filter([1 -0.9], 1, ydata_m);
Fs_m=fft(p_ydata_m,1024);


LPF3=fir1(3,0.2);
ydata_lp=filter(LPF3,1,ydata_m);
p_ydata_lp=filter(LPF3,1,p_ydata_m);

% Calculate the transfer function from input ( Formants freq. and bandwidth )

if num_poles > 10
	ii=5;
else
	ii=ceil(num_poles/2);
end

for i=1:ii
	C(i)=-exp(-2*pi*fb(i)*Ts);
	B(i)=2*exp(-pi*fb(i)*Ts)*cos(2*pi*ff(i)*Ts);
	A(i)=1-B(i)-C(i);
end

nom=1;
for i=1:ii
	nom=nom*A(i);
end

den=conv([1 -B(1) -C(1)], [1 -B(2) -C(2)]);
for jj=3:ii
	den=conv(den,[1 -B(jj) -C(jj)]);
end

dg_m=filter(den, nom, ydata_lp);
dg_m=filter([1 -1],[1 -.99],dg_m);
if mgif_ps_flag == 0
	DGVV(NEW_LEFT:NEW_RIGHT)=dg_m(ext_left+1:length(dg_m)-ext_right);
elseif mgif_ps_flag == 1
	DGVV(gci_m(cur_gci)+NEW_LEFT:gci_m(cur_gci+1)+NEW_LEFT) = ...
      dg_m(ext_left+1:length(dg_m)-ext_right);
end

re_m=filter(den, nom, p_ydata_lp);
re_m=filter([1 -1],[1 -.99],re_m);
if mgif_ps_flag == 0
   RESIDUE(NEW_LEFT:NEW_RIGHT)=re_m(ext_left+1:length(re_m)-ext_right);
elseif mgif_ps_flag == 1
   RESIDUE(gci_m(cur_gci)+NEW_LEFT:gci_m(cur_gci+1)+NEW_LEFT) = ...
      re_m(ext_left+1:length(re_m)-ext_right);
end

% get a glottal wave estimate
g_m=zeros(size(dg_m));
isum=0;
for i=1:length(dg_m),
   isum=isum+dg_m(i);
   g_m(i)=isum;
end

g_m=filter([1 -1],[1 -.99],g_m);
if mgif_ps_flag == 0
   GVV(NEW_LEFT:NEW_RIGHT)=g_m(ext_left+1:length(g_m)-ext_right);
elseif mgif_ps_flag == 1
   GVV(gci_m(cur_gci)+NEW_LEFT:gci_m(cur_gci+1)+NEW_LEFT) = ...
      g_m(ext_left+1:length(g_m)-ext_right);
end

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

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

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

figure(mgif_out_win_h);
subplot(311),plot(RESIDUE);
title('Residue');
subplot(312),plot(DGVV);
title('Differentiated gvv (dgvv)');
subplot(313),plot(GVV);
title('Glottal volume velocity (gvv)');

figure(mgif_plot_win_h);
vh=1:1024/2;
vh=vh/(1024/2)*1/(2*Ts);
plot(vh, 20*log10(abs(Fs_m(1:512))));
hold on;
[H_m W_m]=freqz(nom, den,512);
plot(vh, 20*log10(abs(H_m))+gain,':');
p_dg_m=filter([1 -0.9], 1, dg_m);
F_m=fft(p_dg_m,1024);
plot(vh, 20*log10(abs(F_m(1:512)))-120,'-.');
hold off;

clc;

⌨️ 快捷键说明

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