对于HANTS方法的介绍,在此参考此文章http://wap.sciencenet.cn/blog-466120-508372.html?mobile=1&ivk_sa=1024320u
其中
输入值:
ni——样本的总数
nb——样本的基本周期长度
nf——要考虑的高于零频率的频率数
y——输入样本值数组(例如NDVI值)
ts——时间样本指标的尺寸为ni的数组(表示相对于基准期的虚拟样本数),数组ts中的数可能大于nb,如果没有使用时间样本,假设ts(i)= i,i=1,…,ni
Hi/Lo——2个字符的字符串,表示拒绝高或低异常值
low——有效范围最小值
high——有效范围的最大值
fet——拟合误差容限(超过场效应晶体管与曲线拟合的偏差将被拒绝)
dod——超决定度(点数达到曲线拟合所需的最小值时停止迭代,加上Dod)。这是一项安全措施
delta——小的正数(如0.1)来抑制高振幅
输出值:
amp——返回的振幅数组,第一个元素是曲线的平均值
phi——返回的相位数组,第一个元素为零
yr——数组保存重建的时间序列
函数文件:
function [amp,phi,yr]=HANTS(ni,nb,nf,y,ts,HiLo,low,high,fet,dod,delta)
mat=zeros(min(2*nf+1,ni),ni,'single');
amp=zeros(nf+1,1,'single');
phi=zeros(nf+1,1,'single');
yr=zeros(ni,1,'double');
sHiLo = 0;
if (strcmp(HiLo,'Hi'))
sHiLo =-1;
end
if (strcmp(HiLo,'Lo'))
sHiLo = 1;
end
nr=min(2*nf+1,ni);
noutmax=ni-nr-dod;
dg=180.0/pi;
mat(1,:)=1.0;
ang=2.*pi*(0:nb-1)/nb;
cs=cos(ang);
sn=sin(ang);
i=1:nf;
for j=1:ni
index=1+mod(i*(ts(j)-1),nb);
mat(2*i ,j)=cs(index);
mat(2*i+1,j)=sn(index);
end
p=ones(ni,1);
p(or(yhigh))=0;
nout=sum(p==0);
if (nout>noutmax)
return
end
ready=false;
nloop=0;
nloopmax=ni;
while ((~ready)&&(nloopmaxerr*0.5)&&(nout
%% 导入数据
y= [5.0, 2.0, 5.0, 10.0, 12.0, 18.0, 20.0, 23.0, 27.0, ...
30.0, 40.0, 60.0, 66.0, 70.0, 90.0,120.0,160.0,190.0, ...
105.0,210.0,104.0,200.0, 90.0,170.0, 50.0,120.0, 80.0, ...
60.0, 50.0, 40.0, 30.0, 28.0, 24.0, 20.0, 15.0, 10.0 ];
y=y';
%%
ni=36;
nb=36;
nf=3;
ts=1:36;
low=0.0;
high=255;
fet=5.0;
dod=1;
delta=0.1;
Opt.FirstRun=true;
%%
[amp_none,phi_none,yr_none]=HANTS(ni,nb,nf,y,ts,'none',low,high,fet,dod,delta);
%%
[amp_Lo,phi_Lo,yr_Lo]=HANTS(ni,nb,nf,y,ts,'Lo',low,high,fet,dod,delta);
%%
[amp_Hi,phi_Hi,yr_Hi]=HANTS(ni,nb,nf,y,ts,'Hi',low,high,fet,dod,delta);
%% 绘图
plot(y,'b.-');
hold on;
plot(yr_Lo,'r.-');
plot(yr_Hi,'k.-');
plot(yr_none,'g.-');
legend('Original Data','HANTS - Lo','HANTS - Hi','HANTS - none');
title('Testing HANTS Algorithm')