www.gusucode.com > signal 工具箱matlab源码程序 > signal/pburg.m

    function varargout = pburg(x,p,varargin)
%PBURG   Power Spectral Density (PSD) estimate via Burg's method.
%   Pxx = PBURG(X,ORDER) returns the PSD estimate, Pxx, of the
%   discrete-time signal X.  When X is a vector, it is converted to a
%   column vector and treated as a single channel.  When X is a matrix, the
%   PSD is computed independently for each column and stored in the
%   corresponding column of Pxx.  Pxx is the distribution of power per unit
%   frequency. The frequency is expressed in units of radians/sample. ORDER
%   is the order of the autoregressive (AR) model used to produce the PSD.
%
%   For real signals, PBURG returns the one-sided PSD by default; for 
%   complex signals, it returns the two-sided PSD.  Note that a one-sided 
%   PSD contains the total power of the input signal.
%
%   Pxx = PBURG(X,ORDER,NFFT) specifies the FFT length used to calculate
%   the PSD estimates.  For real X, Pxx has (NFFT/2+1) rows if NFFT is
%   even, and (NFFT+1)/2 rows if NFFT is odd.  For complex X, Pxx always
%   has NFFT rows.  If NFFT is specified as empty, NFFT is set to either
%   256 or the next power of two greater than the length X, whichever is
%   larger.
%
%   [Pxx,W] = PBURG(X,ORDER,NFFT) returns the vector of normalized angular 
%   frequencies, W, at which the PSD is estimated.  W has units of 
%   radians/sample.  For real signals, W spans the interval [0,Pi] when 
%   NFFT is even and [0,Pi) when NFFT is odd.  For complex signals, W 
%   always spans the interval [0,2*Pi).  
%
%   [Pxx,W] = PBURG(X,ORDER,W) computes the two-sided PSD at the normalized
%   angular frequencies contained in vector W.  W must have at least two
%   elements.  
%
%   [Pxx,F] = PBURG(X,ORDER,NFFT,Fs) returns a PSD computed as a function
%   of physical frequency.  Fs is the sampling frequency specified in
%   hertz. If Fs is empty, it defaults to 1 Hz.
%
%   F is the vector of frequencies (in hertz) at which the PSD is
%   estimated.  For real signals, F spans the interval [0,Fs/2] when NFFT
%   is even and [0,Fs/2) when NFFT is odd.  For complex signals, F always
%   spans the interval [0,Fs).
%
%   [Pxx,F] = PBURG(X,ORDER,F,Fs) computes the two-sided PSD at the 
%   frequencies contained in vector F.  F must have at least two elements
%   and be expressed in hertz.
%
%   [...] = PBURG(...,FREQRANGE)  returns the PSD over the specified
%   range of frequencies based upon the value of FREQRANGE:
%
%      'onesided' - returns the one-sided PSD of a real input signal X.
%         If NFFT is even, Pxx has length NFFT/2+1 and is computed over the
%         interval [0,pi].  If NFFT is odd, Pxx has length (NFFT+1)/2 and
%         is computed over the interval [0,pi). When Fs is specified, the
%         intervals become [0,Fs/2) and [0,Fs/2] for even and odd NFFT,
%         respectively.
%
%      'twosided' - returns the two-sided PSD for either real or complex
%         input X.  Pxx has length NFFT and is computed over the interval
%         [0,2*Pi). When Fs is specified, the interval becomes [0,Fs).
%
%      'centered' - returns the centered two-sided PSD for either real or
%         complex X.  Pxx has length NFFT and is computed over the interval
%         (-pi, pi] for even length NFFT and (-pi, pi) for odd length NFFT.
%         When Fs is specified, the intervals become (-Fs/2, Fs/2] and
%         (-Fs/2, Fs/2) for even and odd length NFFT, respectively.
%
%      FREQRANGE may be placed in any position in the input argument list
%      after ORDER.  The default value of FREQRANGE is 'onesided' when X
%      is real and 'twosided' when X is complex.
%
%   [Pxx,F,Pxxc] = PBURG(...,'ConfidenceLevel',P) returns the P*100%
%   confidence interval for Pxx, where P is a scalar between 0 and 1. The
%   default value for P is .95.  Confidence intervals are computed using a
%   Gaussian PDF. Pxxc has twice as many columns as Pxx. Odd-numbered
%   columns contain the lower bounds of the confidence intervals;
%   even-numbered columns contain the upper bounds.  Thus, Pxxc(M,2*N-1) is
%   the lower bound and Pxxc(M,2*N) is the upper bound corresponding to the
%   estimate Pxx(M,N).
%
%   PBURG(...) with no output arguments plots the PSD estimate (in decibels
%   per unit frequency) in the current figure window.
%
%   EXAMPLE:
%      x = randn(100,1); 
%      y = filter(1,[1 1/2 1/3 1/4 1/5],x); % Fourth order AR filter.
%      pburg(y,4,[],1000);                  % Uses the default NFFT of 256.
%
%   See also PCOV, PMCOV, PYULEAR, PMTM, PMUSIC, PEIG, PWELCH, PERIODOGRAM, 
%   ARBURG, PRONY.

%   Copyright 1988-2014 The MathWorks, Inc.

narginchk(2,8)
% Precision rules for {x,p} and {NFFT,F,Fs}are enforced inside ARBURG and
% ARSPECTRA respectively
method = @arburg;
[Pxx,freq,msg,units,~,options,msgobj] = arspectra(method,x,p,varargin{:});
if ~isempty(msg), error(msgobj); end

% compute confidence intervals if needed.
if ~strcmp(options.conflevel,'omitted')
  % arconfinterval enforces double precision arithmetic internally
  Pxxc = arconfinterval(options.conflevel, p, Pxx, x);
elseif nargout>2
  Pxxc = arconfinterval(0.95, p, Pxx, x);
else
  Pxxc = [];
end

if nargout==0,
    freq = {freq};
    if strcmpi(units,'Hz'), 
        freq = [freq {'Fs',options.Fs}];
    end
    hpsd = dspdata.psd(Pxx,freq{:},'SpectrumType',options.range);

    % Create a spectrum object to store in the PSD object's metadata.
    hspec = spectrum.burg(p);
    hpsd.Metadata.setsourcespectrum(hspec);
    
    % plot the confidence levels if conflevel is specified.
    if ~isempty(Pxxc)
       hpsd.ConfLevel = options.conflevel;
       hpsd.ConfInterval = Pxxc;
    end
   
    % center dc if needed
    if options.centerdc
       centerdc(hpsd);
    end
    
    plot(hpsd);

else
   if options.centerdc
     [Pxx, freq, Pxxc] = psdcenterdc(Pxx, freq, Pxxc, options);
   end

   % If the input is a vector and a row frequency vector was specified,
   % return output as a row vector for backwards compatibility.
   if size(options.nfft,2)>1 && isvector(x)
     Pxx = Pxx.';
   end
   
   % Assign output arguments.
   
   % Cast to enforce precision rules. Cast frequency only if outputs have
   % been requested, otherwise plot using double frequency vectors. 
   if isa(Pxx,'single')
     freq = single(freq);
   end
        
   varargout = {Pxx,freq,Pxxc};  % Pxx=PSD Pxxc=conf interval
end

% [EOF] pburg.m