gusucode.com > 语音信号处理工具箱 - Voicebox源码程序 > Voicebox\lpccovar.m
function [ar,e,dc]=lpccovar(s,p,t,w) %LPCCOVAR performs covariance LPC analysis [AR,E,DC]=(S,P,T) % % Inputs: S(NS) is the input signal % P is the order (default: 12) % T(NF,:) specifies the frames size details: each row specifies one frame % T can be a cell array if rows have unequal numbers of values % T(:,1) gives the start of the analysis interval: must be >P % T(:,2) gives the end of the anaylsis interval [default: t(:+1,1)-1] % subsequent pairs can be used to specify multiple disjoint segments % If T is omitted, T(1,1)=P+1, T(1,2)=NS; % The elements of t need not be integers. % W(NS) The error at each sample is weighted by W^2 (default: 1) % % Outputs: AR(NF,P+1) are the AR coefficients with AR(:,1) = 1 % E(NF) is the energy in the residual. % sqrt(E) is often called the 'gain' of the LPC filter. % DC is the DC component of the signal S. If this output is included, % the LPC equations are modified to include a DC offset. % Notes: % % (1) For speech processing P should be at least 2*F*L/C where F is the sampling % frequency, L the vocal tract length and C the speed of sound. For a typical % male (l=17 cm) this gives f/1000. % % (2) Each analysis frame should contain at least 2P samples. If note (1) is followed % this implies at least 2 ms of speech signal per frame. % % (3) It can be advantageous to restrict the analysis regions to time intervals % when the glottis is closed (closed-phase analysis). This can be achieved by % setting the T input parameter appropriately. If the closed-phase is shorter than % 2 ms then two or more successive closed-phases should be used by defining 4 or more % elements in the corresponding row of T. % % (4) A previous version of this routine allowed T() to have a single row which would % be replicated for the entire file length. This has be removed because it gave rise % to an ambiguity. % Bugs: sould really detect a singular matrix and reduce the order accordingly % Copyright (C) Mike Brookes 1995 % % Last modified Fri Sep 24 17:51:43 1999 % % VOICEBOX is a MATLAB toolbox for speech processing. Home page is at % http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You can obtain a copy of the GNU General Public License from % ftp://prep.ai.mit.edu/pub/gnu/COPYING-2.0 or by writing to % Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% s = s(:); % make it a column vector if nargin < 2 p=12; end; if nargin < 3 t=[p+1 length(s)]; end; wq = nargin>3; [nf,ng]=size(t); if iscell(t) t{nf+1}=length(s)+1; else if rem(ng,2) t(:,end+1)=[t(2:nf,1)-1; length(s)]; end end ar=zeros(nf,p+1); ar(:,1)=1; e=zeros(nf,1); dc=zeros(nf,1); d0=nargout >2; rs=(1:p); for jf=1:nf if iscell(t) tj=t{jf}; if rem(ntj,2) tj(end+1)=t{jf+1}(1)-1; end else tj=t(jf,:); end ta = ceil(tj(1)); tb = floor(tj(2)); cs = (ta:tb).'; for js=3:2:length(tj) ta = ceil(tj(js)); tb = floor(tj(js+1)); cs = [cs; (ta:tb).']; end %disp(cs([logical(1); (cs(2:end-1)~=cs(1:end-2)+1)|(cs(2:end-1)~=cs(3:end)-1); logical(1)])'); nc = length(cs); pp=min(p,nc-d0); dm=zeros(nc,pp); % predefine shape dm(:) = s(cs(:,ones(1,pp))-rs(ones(nc,1),1:pp)); if nargout>2 if wq dm = [ones(nc,1) dm].*w(cs(:,ones(1,1+pp))); sc=(s(cs).*w(cs)); aa = (dm\sc).'; else dm = [ones(nc,1) dm]; sc=s(cs); aa = (dm\sc).'; end ar(jf,2:pp+1) = -aa(2:pp+1); e(jf)=sc.'*(sc - dm*aa.'); dc(jf)=aa(1)/sum(ar(jf,:)); else if wq dm = dm.*w(cs(:,ones(1,pp))); aa = (dm\(s(cs).*w(cs))).'; else aa = (dm\s(cs)).'; end; ar(jf,2:pp+1) = -aa; if nargout>1 e(jf)=sc.'*(sc - dm*aa.'); end end end if ~nargout lpcar2db(ar,127); end