bform.m

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

M
79
字号
function [form]=bform(area, vlength, no_section)
% use lossless uniform sections to calculate the transfer function, then
% use Nb method to get formants

%	clear all;

%	area=3.*ones(1,60);
%	vlength=0.3.*ones(1,60);
%	load arle.mat;
%	no_section=60;

	area0 = 4.0;
	delta_f = 100.0;
%	delta_f = 300.0;
	interpolate = 0;
	sign_change = 0;
	no_run = 0;
	ind_f = 1;
	fre = 1.0;

	index=1;

while ind_f <=4,
if index==1,
	ind_a = 1;
	ui_uo = 1.0;
	no_run = no_run + 1;
	omega_c = fre / 5618.0;
	temp = -0.8*omega_c*sqrt(area0/pi)/area(1);

	for ind_a = 1:no_section,
		delta_phi = omega_c * vlength(ind_a);
		cos_phi = cos(delta_phi);
		sin_phi = sin(delta_phi);
		ui_uim1 = cos_phi + sin_phi * area(ind_a) * temp;
		ui_uo = ui_uim1 * ui_uo;
		temp = (cos_phi - 1.0/ui_uim1)/area(ind_a)/sin_phi;
	end
	if (interpolate)
		index=4;
	elseif (sign_change)
		index=3;
	else
	sign_change = 1;
	ui_uo_old = ui_uo;
	fre_old = fre;
	fre = fre + delta_f;
	index=1;
	end
elseif index==3
	if (ui_uo*ui_uo_old < 0.0)
		index=4;
	else
	ui_uo_old = ui_uo;
	fre_old = fre;
	fre = fre + delta_f;
	index=1;
	end
elseif index==4,
	inc_f = -ui_uo*(fre-fre_old)/(ui_uo-ui_uo_old);
	if (abs(inc_f) >= 1.0)
		interpolate = 1;
		ui_uo_old = ui_uo;
		fre_old = fre;
		fre = fre + inc_f;
		index=1;
	else
		form(ind_f) = fre + inc_f;
		ind_f = ind_f + 1;
		interpolate = 0;
		sign_change = 0;
		if (ind_f > 4)
			return;
		end
		fre = fre + delta_f;
		index=1;
	end
end
end

⌨️ 快捷键说明

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