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 + -
显示快捷键?