www.gusucode.com > MATLAB高阶累积量工具箱 > MATLAB高阶累积量工具箱/MATLAB高阶累积量工具箱/hosa/cum4x.m
function y_cum = cum4x (w,x,y,z, maxlag, nsamp, overlap, flag, k1, k2) %CUM4X Fourth-order cross-cumulants. % y_cum = cum4x (w,x,y,z, maxlag, samp_seg, overlap, flag, k1, k2) % w,x,y,z - data vectors/matrices with identical dimensions % if w,x,y,z are matrices, rather than vectors, columns are % assumed to correspond to independent realizations, % overlap is set to 0, and samp_seg to the row dimension. % maxlag - maximum lag to be computed [default = 0] % samp_seg - samples per segment [default = data_length] % overlap - percentage overlap of segments [default = 0] % overlap is clipped to the allowed range of [0,99]. % flag : 'biased', biased estimates are computed [default] % 'unbiased', unbiased estimates are computed. % k1,k2 : the fixed lags in C4(m,k1,k2); defaults to 0 % y_cum: estimated fourth-order cross cumulant, % c4(t1,t2,t3) := cum( w^*(t), x(t+t1), y(t+t2), z^*(t+t3) ) % Copyright (c) 1991-98 by United Signals & Systems, Inc. and The MathWorks, Inc. % $Revision: 1.4 $ % A. Swami January 20, 1995 % 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. % c4(t1,t2,t3) := cum( x^*(t), w(t+t1), y(t+t2), z^*(t+t3) ) % cum(w,x,y,z) := E(wxyz) - E(wx)E(yz) - E(wy)E(xz) - E(wz)E(xy) % and, w,x,y,z are assumed to be zero-mean. % ---- Parameter checks are done in CUMEST ---------------------- [lx,nrecs] = size(w); if ([lx,nrecs] ~= size(x) | [lx,nrecs] ~= size(y) | [lx,nrecs] ~= size(z)) error('w,x,y,z should have identical dimensions') end if (lx == 1) lx = nrecs; nrecs = 1; end if (exist('maxlag') ~= 1) maxlag = 0; end if (maxlag < 0) error ('"maxlag" must be non-negative ') end if (exist('nsamp') ~= 1) nsamp = lx; end if (nrecs > 1) nsamp = lx; end if (nsamp <= 0 | nsamp > lx) nsamp = lx; end if (exist('overlap') ~= 1) overlap = 0; end if (nrecs > 1) overlap = 0; end overlap = max(0,min(overlap,99)); if (exist('flag') ~= 1) flag = 'biased' ; end if (flag(1:1) ~= 'b' & flag(1:1) ~= 'B') flag = 'unbiased'; else, flag = 'biased'; end overlap0 = overlap; overlap = fix(overlap/100 * nsamp); nadvance = nsamp - overlap; if (nrecs == 1) nrecs = fix( (lx - overlap)/nadvance ) ; end if (exist('k1') ~= 1) k1 = 0; end if (exist('k2') ~= 1) k2 = 0; end % ------ scale factors for unbiased estimates -------------------- nlags = 2 * maxlag + 1; zlag = 1 + maxlag; tmp = zeros(nlags,1); if (flag(1:1) == 'b' | flag(1:1) == 'B') scale = ones(nlags,1) / nsamp; sc1 = 1/nsamp; sc2 = sc1; sc12 = sc1; else ind = [-maxlag:maxlag]'; kmin = min(0,min(k1,k2)); kmax = max(0,max(k1,k2)); scale = nsamp - max(ind,kmax) + min(ind,kmin); scale = ones(nlags,1) ./ scale; sc1 = 1/(nsamp-abs(k1)); sc2 = 1/(nsamp-abs(k2)); sc12 = 1/(nsamp-abs(k1-k2)); end % ----------- estimate second- and fourth-order moments; combine ------ y_cum = zeros(2*maxlag+1,1) ; rind = -maxlag:maxlag; ind = 1:nsamp; for i=1:nrecs tmp = y_cum * 0; R_zy = 0; R_wy = 0; M_wz = 0; ws = w(ind); ws = ws(:) - mean(ws); xs = x(ind); xs = xs(:) - mean(xs); ys = y(ind); ys = ys(:) - mean(ys); cys = conj(ys); zs = z(ind); zs = zs(:) - mean(zs); ziv = xs * 0; % create the "IV" matrix: offset for second lag if (k1 >= 0) ziv(1:nsamp-k1) = ws(1:nsamp-k1) .* cys(k1+1: nsamp); R_wy = R_wy + ws(1:nsamp-k1)' * ys(k1+1:nsamp); else ziv(-k1+1:nsamp) = ws(-k1+1:nsamp) .* cys(1:nsamp+k1); R_wy = R_wy + ws(-k1+1:nsamp)' * ys(1:nsamp+k1); end % create the "IV" matrix: offset for third lag if (k2 >= 0) ziv(1:nsamp-k2) = ziv(1:nsamp-k2) .* zs(k2+1: nsamp); ziv(nsamp-k2+1:nsamp) = zeros(k2,1); M_wz = M_wz + ws(1:nsamp-k2).' * zs(k2+1:nsamp); else ziv(-k2+1:nsamp) = ziv(-k2+1:nsamp) .* zs(1:nsamp+k2); ziv(1:-k2) = zeros(-k2,1); M_wz = M_wz + ws(-k2+1:nsamp).' * zs(1:nsamp-k2); end if (k1-k2 >= 0) R_zy = R_zy + zs(1:nsamp-k1+k2)' * ys(k1-k2+1:nsamp); else R_zy = R_zy + zs(-k1+k2+1:nsamp)' * ys(1:nsamp-k2+k1); end tmp(zlag) = tmp(zlag) + ziv' * xs ; for k = 1:maxlag tmp(zlag-k) = tmp(zlag-k) + ziv([k+1:nsamp])' * xs([1:nsamp-k]); tmp(zlag+k) = tmp(zlag+k) + ziv([1:nsamp-k])' * xs([k+1:nsamp]); end y_cum = y_cum + tmp .* scale ; % fourth-order moment estimates done R_wx = cum2x(ws, xs, maxlag, nsamp, overlap0, flag); R_zx = cum2x(zs, xs, maxlag+abs(k2), nsamp, overlap0, flag); M_yx = cum2x(cys, xs, maxlag+abs(k1), nsamp, overlap0, flag); y_cum = y_cum - R_zy * R_wx * sc12 ... - R_wy * R_zx(rind - k2 + maxlag+abs(k2)+ 1) * sc1 ... - M_wz'* M_yx(rind - k1 + maxlag+abs(k1)+ 1) * sc2 ; ind = ind + nadvance ; end y_cum = y_cum / nrecs; return % mods Sept 7, 1998 % fixed conjugation errors in computing R_wy, R_zy, M_yx