📄 lpana1.m
字号:
% Function: perform 1st stage of the Formant Based Linear Prediction Analysis
% ==> classify the voicetype
function [voicetype,cofa,rsd,ntotal,nframe]=lpana1(signal,basic);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% %%
%%%%%%% Fixed-frame linear prediction analysis %%
%%%%%%% %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The first step creates the following variables:
%
% cofa = LP coefficients.
% energy = energy of the signal in the analyzed frame
% rsd = resultant residue signal
% emp = first-order reflection coefficient.
% npow = square root of residue power.
% voicetype = 1 ==> voiced,
% = 0 ==> unvoiced/silence.
% nframe = number of frames.
% ntotal = number of samples.
%retrieve the basic specification
F_len=basic(5);
O_lap=basic(6);
Order=basic(4);
M_len=F_len-O_lap;
if (length(signal)<=Order)
disp('Error in [fbana] function');
error('Sorry, the length of signal must be longer than Order.');
end;
ntotal=length(signal);
nframe=floor(ntotal/M_len);
% allocate the vector space
cofa=zeros(nframe,Order+1);
energy=zeros(1,nframe);
emp=zeros(1,nframe);
compa=1e7; % define compa
sso=signal(1:F_len+Order);
[cofa1,emp(1),energy(1),rsd1,npow(1)]=lpc_h(sso,Order);
rsd1=sqrt(energy(1)/(rsd1*rsd1'))*rsd1;
cofa(1,:)=cofa1;
rsd(Order+1:F_len+Order)=rsd1;
ss1=rsd1(M_len+1:F_len);
for k=2:nframe-1
sso=signal((k-1)*M_len+1:k*M_len+Order+O_lap);
[cofa1,emp(k),energy(k),rsd1,npow(k)]=lpc_h(sso,Order);
%*** backward prediction ***%
%[cofa2,tmp]=lpc_h(rev(sso),Order);
%cofa1=polystab( (cofa1+cofa2)/2 );
%emp(k)=(emp(k)+tmp)/2;
%*** backward prediction ***%
rsd1=sqrt(energy(k)/(rsd1*rsd1'))*rsd1; % Normalize the LP gain
% Set the energy as the geometric mean of the energy terms for two
% individual subframes, each of which is of 100 samples (10ms).
energy1=sum( sso(1+Order:M_len/2+Order).^2 );
energy2=sum( sso(1+M_len/2+Order:M_len+Order).^2 );
energyidx(k)=sqrt(energy1*energy2);
ss2=rsd1(1:O_lap);
ss=(ss1.*(O_lap:-1:1)+ss2.*(1:O_lap))/(O_lap+1);
% Smooth the transition within the overlapped region
rsd((k-1)*M_len+Order+1:k*M_len+O_lap+Order)=[ss rsd1(O_lap+1:F_len)];
ss1=rsd1(1+M_len: M_len+O_lap);
cofa(k,1:length(cofa1))=cofa1;
end;
k=nframe;
sso=signal((k-1)*M_len+1:k*M_len+Order);
[cofa1,emp(k),energy(k),rsd1,npow(k)]=lpc_h(sso,Order);
rsd1=sqrt(energy(k)/(rsd1*rsd1'))*rsd1;
energy1=sum( sso(1+Order:M_len/2+Order).^2 );
energy2=sum( sso(1+M_len/2+Order+1: M_len+Order).^2 );
energyidx(k)=sqrt(energy1*energy2);
ss2=rsd1(1:O_lap);
ss=(ss1.*(O_lap:-1:1)+ss2.*(1:O_lap))/(O_lap+1);
rsd((k-1)*M_len+Order+1:k*M_len+Order)=[ss rsd1(O_lap+1:M_len)];
cofa(k,1:length(cofa1))=cofa1;
%------------------------
% Classify the voice type
%------------------------
voicetype(1)=0;
for kf=2:nframe-1
if emp(kf) > .3 & energyidx(kf) > 1.85*compa
voicetype(kf)=1;
else
voicetype(kf)=0;
end;
end;
voicetype(nframe)=0;
for k=2:nframe-1
if sum(voicetype(k-1:k+1)) > 1
voicetype(k)=1;
else
voicetype(k)=0;
end;
end;
%disp(' First-pass (frame-based) analysis is OK! '); toc;
%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -