⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpana1.m

📁 这是一个用于语音信号处理的工具箱
💻 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 + -