function FD=FD_Higuchi(y,len)
% Description:
% 基于曲线长度的测量方法,将每k个采样点分为一段,以段为单位估计曲线的
% 平均长度
%
% INPUT:
% y : 需要计算FD的输入数据
% len : 输入数据的长度(也可以不当作输入参数)
%
% OUTPUTS:
% FD: 输入曲线的FD值
%
% 计算步骤:
% Step 1. 对于长度为N的有限长时间序列y,对于k=1.....kmax,构造k个新的序列
% 对于每一个k值,都构造k个新序列,k为相邻两个数之间的间隔
% 如 k=1时,新序列为: y(1),y(2),y(3)......
% k=2时,新序列1为: y(1),y(3),y(5),y(7)
% 新序列2为:y(2),y(4),y(6),y(8)
% Step 2. 计算所有新序列的长度
% Step 3. 对于每一个k值,计算曲线的平均长度L(k),即该k值时,所有k个新序列的
% 长度之和除以k
% Step 4. 得到一系列的ln(k),ln(L(k))对,用最小二乘法拟合得到的斜率的相反数
% 即为所要求的FD
% 参考文献:doi:10.1088/1741-2560/7/4/046007
%
% V1.0 : 2016/8/20
%
kmax=15;
N=len;
for k=1:kmax
for m=1:k
total=floor((N-m)/k);
index=m:k:(m+total*k);
ym= y(index); %构造新序列
norfa=(N-1)/(total*k);
L(m)=(sum(abs(diff(ym)))*norfa)/k;%计算每个新构造的序列的长度
end
L_K(k)=sum(L)/k;%对于每个k值,计算曲线的平均长度
xfit(k)=log(k);%得到坐标对的x值
yfit(k)=log(L_K(k));%得到坐标对的y值
end
% plot(xfit,yfit,'o')
% figure
p = polyfit(xfit, yfit, 1);%最小二乘拟合
FD=-p(1);
% f = polyval(p,xfit);
% hold on
% plot(xfit,f)
% hold off
% title('Higuchi法求取FD');
end