Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/computeperiodogram.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ao/computeperiodogram.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,134 @@ +% COMPUTEPERIODOGRAM Periodogram spectral estimation. +% This function is used to calculate the Power Spectrum Sxx, and the +% Cross Power Spectrum Sxy. +% +% Sxx = COMPUTEPERIODOGRAM(X,WIN,NFFT) where x is a vector returns the +% Power Spectrum over the whole Nyquist interval, [0, 2pi). +% +% Sxy = COMPUTEPERIODOGRAM({X,Y},WIN,NFFT) returns the Cross Power +% Spectrum over the whole Nyquist interval, [0, 2pi). +% +% Inputs: +% X - Signal vector or a cell array of two elements containing +% two signal vectors. +% WIN - Window +% NFFT - Number of frequency points (FFT) or vector of +% frequencies at whicch periodogram is desired (Goertzel) +% WINCOMPFLAG - A string indicating the type of window compensation to +% be done. The choices are: +% 'ms' - compensate for Mean-square (Power) Spectrum; +% maintain the correct power peak heights. +% 'psd' - compensate for Power Spectral Denstiy (PSD); +% maintain correct area under the PSD curve. +% +% Output: +% Sxx - Power spectrum [Power] over the whole Nyquist interval. +% or +% Sxy - Cross power spectrum [Power] over the whole Nyquist +% interval. +% +% A direct copy of MATLAB's function for LTPDA +% +% M Hewitson 08-05-08 +% +% $Id: computeperiodogram.m,v 1.2 2008/08/01 13:19:42 ingo Exp $ +% + +% Author(s): P. Pacheco +% Copyright 1988-2006 The MathWorks, Inc. +% $Revision: 1.2 $ $Date: 2008/08/01 13:19:42 $ + +function [P,f] = computeperiodogram(x,win,nfft,esttype,varargin) + + error(nargchk(3,5,nargin,'struct')); + if nargin < 4, + esttype = 'psd'; % Default, compenstate for window's power. + end + + if nargin < 5 || isempty(varargin{1}), + Fs = 2*pi; + else + Fs = varargin{1}; + end + + % Validate inputs and convert row vectors to column vectors. + [x,Lx,y,is2sig,win,errid,errmsg] = validateinputs(x,win,nfft); + if ~isempty(errmsg), error(errid, errmsg); end + + % Determine if FFT or Goertzel + freqVectorSpecified = false; + if (length(nfft)> 1), freqVectorSpecified = true; end + + % Window the data + xw = x.*win; + if is2sig, yw = y.*win; end + + % Evaluate the window normalization constant. A 1/N factor has been + % omitted since it will cancel below. + if strcmpi(esttype,'ms'), + % The window is convolved with every power spectrum peak, therefore + % compensate for the DC value squared to obtain correct peak heights. + U = sum(win)^2; + else + U = win'*win; % compensates for the power of the window. + end + + % Compute the periodogram power spectrum [Power] estimate + % A 1/N factor has been omitted since it cancels + + [Xx,f] = ao.computeDFT(xw,nfft,Fs); + if is2sig, [Yy,f] = ao.computeDFT(yw,nfft,Fs); end + + P = Xx.*conj(Xx)/U; % Auto spectrum. + if is2sig, + P = Xx.*conj(Yy)/U; % Cross spectrum. + end + +end + +%-------------------------------------------------------------------------- +function [x,Lx,y,is2sig,win,errid,errmsg] = validateinputs(x,win,nfft) + % Validate the inputs to computexperiodogram and convert the input signal + % vectors into column vectors. + + errid = ''; + errmsg = ''; % in case of early return. + + % Set defaults and convert to row vectors to columns. + y = []; + Ly = 0; + is2sig= false; + win = win(:); + Lw = length(win); + + % Determine if one or two signal vectors was specified. + Lx = length(x); + if iscell(x), + if length(x) > 1, + y = x{2}; + y = y(:); + is2sig = true; + end + x = x{1}; + Lx = length(x); + end + x = x(:); + + if is2sig, + Ly = length(y); + if Lx ~= Ly, + errid = generatemsgid('invalidInputSignalLength'); + errmsg = 'The length of the two input vectors must be equal to calculate the cross spectral density.'; + return; + end + end + + if Lx ~= Lw, + errid = generatemsgid('invalidWindow'); + errmsg = 'The WINDOW must be a vector of the same length as the signal.'; + return; + end + +end + +