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

📄 cumtrue.m

📁 计算高阶统计量的程序
💻 M
字号:
function   cmat = cumtrue (ma, ar, norder, nlags, k)
%CUMTRUE Theoretical cumulants of an ARMA model
%	cmat = cumtrue (ma, ar, norder, nlags, k)
%	    ma - MA parameter vector
%	    ar - AR parameter vector;  defaults to [1] (pure MA model)
%	norder - cumulant order: should be 2, 3 or 4;  defaults to 3
%	 nlags - maximum number of cumulant lags to compute.
%	         default value is p+q, where p and q are the AR and MA orders
%	     k - if norder=4, k specifies the 3rd lag of the cumulant;
%	         default value is 0.
%	  cmat - computed cumulant vector or matrix.
%	If norder=2, cmat is a column vector of length 2*nlags + 1,
%	     and consists of C2(m), m=-nlags, .... , nlags
%	If norder=3, cmat is a (2*nlags + 1) by (2*nlags + 1) matrix;
%	      C3(i,j) is returned in cmat(i+nlags+1,j+nlags+1),
%	              i,j = -nlags, ... , nlags
%	      note that the axes point down and right; origin is at center
%	If norder=4, cmat is a (2*nlags + 1) by (2*nlags + 1) matrix;
%	      C4(i,j,k) is returned in cmat(i+nlags+1,j+nlags+1),
%	              i,j = -nlags, ... , nlags
%	      note that the axes point down and right; origin is at center

%
%  Copyright (c) 1991-2001 by United Signals & Systems, Inc. 
%       $Revision: 1.3 $
%  A. Swami   January 20, 1993.

%     RESTRICTED RIGHTS LEGEND
% Use, duplication, or disclosure by the Government is subject to
% restrictions as set forth in subparagraph (c) (1) (ii) of the
% Rights in Technical Data and Computer Software clause of DFARS
% 252.227-7013.
% Manufacturer: United Signals & Systems, Inc., P.O. Box 2374,
% Culver City, California 90231.
%
%  This material may be reproduced by or for the U.S. Government pursuant
%  to the copyright license under the clause at DFARS 252.227-7013.

% ----------------- Parameter checks -------------------------
   if (exist('ma') ~= 1)
        error('ma parameter vector must be supplied')
   end
   if (min(size(ma)) ~= 1)
        error('variable ma must be a vector')
   end
   q = length(ma) - 1;
   if (exist('ar') ~= 1) ar = [1]; end
   if (min(size(ar)) ~= 1)
        error('variable ar must be a vector')
   end
   p = length(ar) - 1;

   if (exist('norder') ~= 1) norder = 3; end
   if (norder < 2 | norder > 4)
      error ('norder should be 2, 3 or 4')
   end
   if (exist('nlags') ~= 1) nlags = p+q; end
   if (p == 0) nlags = min(nlags, q); end
   if (exist('k') ~= 1) k = 0; end
   klag3 = k;


% ------------ compute theoretical cumulants ---------------
% c2(i)     = sum_{n} h(n) h(n+i)
% c3(i,j)   = sum_{n} h(n) h(n+i) h(n+j)
% c4(i,j,k) = sum_{n} h(n) h(n+i) h(n+j) h(n+k)

   if (p == 0) h = ma(:);
   else,
       rpoles = abs(roots(ar));
       if (any(rpoles >= 1) )
          error('unstable AR polynomial passed')
       end
       rho = max(rpoles);
       nsamp = max(2*nlags,round(log(0.001)/log(rho)));
       h = filter(ma,ar,[1;zeros(nsamp,1)]);
   end

   maxlag = nlags;
   nlags  = 2*maxlag + 1;
   nlag1  = maxlag + 1;
   nsamp  = length(h);

   if (norder == 2) cmat = zeros(nlags,1);
   else, cmat = zeros(nlags, nlags); end

   if (norder == 2)
      cmat(nlag1) = h'*h;
      for n=1:maxlag
	cmat(nlag1+n) = h(1:nsamp-n)' * h(n+1:nsamp);
        cmat(nlag1-n) = cmat(nlag1+n);
      end
      return
   end

   if (norder == 3)
      for n=-maxlag:maxlag
          z = h*0;
          if (n >= 0) z(1:nsamp-n)  = h(1:nsamp-n) .* h(n+1:nsamp);
          else        z(-n+1:nsamp) = h(-n+1:nsamp) .* h(1:nsamp+n);
          end
          cmat(n+nlag1,nlag1) = h'*z;
          for k=1:maxlag
              cmat(n+nlag1,nlag1+k) = z(1:nsamp-k)' * h(k+1:nsamp);
              cmat(n+nlag1,nlag1-k) = h(1:nsamp-k)' * z(k+1:nsamp);
          end
      end
      return
   end

   if (norder == 4)
      z = h * 0;
      z2 = z;
      k = klag3;
      if (k >= 0) z2(1:nsamp-k) = h(1:nsamp-k) .* h(k+1:nsamp);
      else        z(-k+1:nsamp) = h(-k+1:nsamp) .* h(1:nsamp+k);
      end

      for n=-maxlag:maxlag
          z =  h*0;
          if (n >= 0) z(1:nsamp-n) = z2(1:nsamp-n) .* h(n+1:nsamp);
          else        z(-n+1:nsamp) = z2(-n+1:nsamp) .* h(1:nsamp+n);
          end

          cmat(n+nlag1,nlag1) = h'*z;
          for k=1:maxlag
              cmat(n+nlag1,nlag1+k) = z(1:nsamp-k)' * h(k+1:nsamp);
              cmat(n+nlag1,nlag1-k) = h(1:nsamp-k)' * z(k+1:nsamp);
          end
      end
      return
   end

return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -