时间序列谐波分析(HANTS)的MATLAB实现

时间序列谐波分析(HANTS)的MATLAB实现

一、简介

对于HANTS方法的介绍,在此参考此文章http://wap.sciencenet.cn/blog-466120-508372.html?mobile=1&ivk_sa=1024320u
时间序列谐波分析(HANTS)的MATLAB实现_第1张图片

二、MATLAB实现

其中
输入值:
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')

结果如下所示
时间序列谐波分析(HANTS)的MATLAB实现_第2张图片

你可能感兴趣的:(MATLAB应用,数据处理,matlab)