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

📄 wave_signif.m

📁 %WAVETEST Example Matlab script for WAVELET, using NINO3 SST dataset % % See "http://paos.colorado
💻 M
字号:
%WAVE_SIGNIF  Significance testing for the 1D Wavelet transform WAVELET%%   [SIGNIF,FFT_THEOR] = ...%      wave_signif(Y,DT,SCALE,SIGTEST,LAG1,SIGLVL,DOF,MOTHER,PARAM)%% INPUTS:%%    Y = the time series, or, the VARIANCE of the time series.%        (If this is a single number, it is assumed to be the variance...)%    DT = amount of time between each Y value, i.e. the sampling time.%    SCALE = the vector of scale indices, from previous call to WAVELET.%%% OUTPUTS:%%    SIGNIF = significance levels as a function of SCALE%    FFT_THEOR = output theoretical red-noise spectrum as fn of PERIOD%%% OPTIONAL INPUTS:% *** Note *** setting any of the following to -1 will cause the default%               value to be used.%%    SIGTEST = 0, 1, or 2.    If omitted, then assume 0.%%         If 0 (the default), then just do a regular chi-square test,%             i.e. Eqn (18) from Torrence & Compo.%         If 1, then do a "time-average" test, i.e. Eqn (23).%             In this case, DOF should be set to NA, the number%             of local wavelet spectra that were averaged together.%             For the Global Wavelet Spectrum, this would be NA=N,%             where N is the number of points in your time series.%         If 2, then do a "scale-average" test, i.e. Eqns (25)-(28).%             In this case, DOF should be set to a%             two-element vector [S1,S2], which gives the scale%             range that was averaged together.%             e.g. if one scale-averaged scales between 2 and 8,%             then DOF=[2,8].%%    LAG1 = LAG 1 Autocorrelation, used for SIGNIF levels. Default is 0.0%%    SIGLVL = significance level to use. Default is 0.95%%    DOF = degrees-of-freedom for signif test.%         IF SIGTEST=0, then (automatically) DOF = 2 (or 1 for MOTHER='DOG')%         IF SIGTEST=1, then DOF = NA, the number of times averaged together.%         IF SIGTEST=2, then DOF = [S1,S2], the range of scales averaged.%%       Note: IF SIGTEST=1, then DOF can be a vector (same length as SCALEs),%            in which case NA is assumed to vary with SCALE.%            This allows one to average different numbers of times%            together at different scales, or to take into account%            things like the Cone of Influence.%            See discussion following Eqn (23) in Torrence & Compo.%%%----------------------------------------------------------------------------%   Copyright (C) 1995-1998, Christopher Torrence and Gilbert P. Compo%   University of Colorado, Program in Atmospheric and Oceanic Sciences.%   This software may be used, copied, or redistributed as long as it is not%   sold and this copyright notice is reproduced on each copy made.  This%   routine is provided as is without any express or implied warranties%   whatsoever.%----------------------------------------------------------------------------function [signif,fft_theor] = ...	wave_signif(Y,dt,scale1,sigtest,lag1,siglvl,dof,mother,param);if (nargin < 9), param = -1;, endif (nargin < 8), mother = -1;, endif (nargin < 7), dof = -1;, endif (nargin < 6), siglvl = -1;, endif (nargin < 5), lag1 = -1;, endif (nargin < 4), sigtest = -1;, endif (nargin < 3)	error('Must input a vector Y, sampling time DT, and SCALE vector')endn1 = length(Y);J1 = length(scale1) - 1;scale(1:J1+1) = scale1;s0 = min(scale);dj = log(scale(2)/scale(1))/log(2.);if (n1 == 1)	variance = Y;else	variance = std(Y)^2;endif (sigtest == -1), sigtest = 0;, endif (lag1 == -1), lag1 = 0.0;, endif (siglvl == -1), siglvl = 0.95;, endif (mother == -1), mother = 'MORLET';, endmother = upper(mother);% get the appropriate parameters [see Table(2)]if (strcmp(mother,'MORLET'))  %----------------------------------  Morlet	if (param == -1), param = 6.;, end	k0 = param;	fourier_factor = (4*pi)/(k0 + sqrt(2 + k0^2)); % Scale-->Fourier [Sec.3h]	empir = [2.,-1,-1,-1];	if (k0 == 6), empir(2:4)=[0.776,2.32,0.60];, endelseif (strcmp(mother,'PAUL'))  %--------------------------------  Paul	if (param == -1), param = 4.;, end	m = param;	fourier_factor = 4*pi/(2*m+1);	empir = [2.,-1,-1,-1];	if (m == 4), empir(2:4)=[1.132,1.17,1.5];, endelseif (strcmp(mother,'DOG'))  %---------------------------------  DOG	if (param == -1), param = 2.;, end	m = param;	fourier_factor = 2*pi*sqrt(2./(2*m+1));	empir = [1.,-1,-1,-1];	if (m == 2), empir(2:4) = [3.541,1.43,1.4];, end	if (m == 6), empir(2:4) = [1.966,1.37,0.97];, endelse	error('Mother must be one of MORLET,PAUL,DOG')endperiod = scale.*fourier_factor;dofmin = empir(1);     % Degrees of freedom with no smoothingCdelta = empir(2);     % reconstruction factorgamma_fac = empir(3);  % time-decorrelation factordj0 = empir(4);        % scale-decorrelation factorfreq = dt ./ period;   % normalized frequencyfft_theor = (1-lag1^2) ./ (1-2*lag1*cos(freq*2*pi)+lag1^2);  % [Eqn(16)]fft_theor = variance*fft_theor;  % include time-series variancesignif = fft_theor;if (dof == -1), dof = dofmin;, endif (sigtest == 0)    % no smoothing, DOF=dofmin [Sec.4]	dof = dofmin;	chisquare = chisquare_inv(siglvl,dof)/dof;	signif = fft_theor*chisquare ;  % [Eqn(18)]elseif (sigtest == 1)  % time-averaged significance	if (length(dof) == 1), dof=zeros(1,J1+1)+dof;, end	truncate = find(dof < 1);	dof(truncate) = ones(size(truncate));	dof = dofmin*sqrt(1 + (dof*dt/gamma_fac ./ scale).^2 );   % [Eqn(23)]	truncate = find(dof < dofmin);	dof(truncate) = dofmin*ones(size(truncate));   % minimum DOF is dofmin	for a1 = 1:J1+1		chisquare = chisquare_inv(siglvl,dof(a1))/dof(a1);		signif(a1) = fft_theor(a1)*chisquare;	endelseif (sigtest == 2)  % time-averaged significance	if (length(dof) ~= 2)		error('DOF must be set to [S1,S2], the range of scale-averages')	end	if (Cdelta == -1)		error(['Cdelta & dj0 not defined for ',mother, ...			' with param = ',num2str(param)])	end	s1 = dof(1);	s2 = dof(2);	avg = find((scale >= s1) & (scale <= s2));  % scales between S1 & S2	navg = length(avg);	if (navg == 0)		error(['No valid scales between ',num2str(s1),' and ',num2str(s2)])	end	Savg = 1./sum(1 ./ scale(avg));       % [Eqn(25)]	Smid = exp((log(s1)+log(s2))/2.);     % power-of-two midpoint	dof = (dofmin*navg*Savg/Smid)*sqrt(1 + (navg*dj/dj0)^2);  % [Eqn(28)]	fft_theor = Savg*sum(fft_theor(avg) ./ scale(avg));  % [Eqn(27)]	chisquare = chisquare_inv(siglvl,dof)/dof;	signif = (dj*dt/Cdelta/Savg)*fft_theor*chisquare;    % [Eqn(26)]else	error('sigtest must be either 0, 1, or 2')endreturn% end of code

⌨️ 快捷键说明

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