信号处理算法(2):样本熵(SampEn)

  本文主要介绍样本熵的物理意义、算法以及Matlab里代码实现。

1.物理意义

  样本熵(Sample Entropy,SampEn)与近似熵的物理意义相似(近似熵参见博客【近似熵理论相关知识与代码实现】),都是通过度量信号中产生新模式的概率大小来衡量时间序列复杂性,新模式产生的概率越大,序列的复杂性就越大。
  与近似熵相比,样本熵具有两个优势:样本熵的计算不依赖数据长度样本熵具有更好的一致性,即参数m和r的变化对样本熵的影响程度是相同的。
  样本熵的值越低,序列自我相似性就越高;样本熵的值越大,样本序列就越复杂。目前样本熵在评估生理时间序列(EEG,sEMG等)的复杂性和诊断病理状态等方面均有应用。

2.计算方法

  样本熵的计算方法如下:

3.代码实现

  在Matlab里实现样本熵函数,计算一段时间序列的样本熵值,代码如下:

function SampEnVal = SampEn(data, m, r)
% SampEn  计算时间序列data的样本熵
% 输入:data是数据一维行向量
%      m重构维数,一般选择1或2,优先选择2,一般不取m>2
%      r 阈值大小,一般选择r=0.1~0.25*Std(data)
% 输出:SampEnVal样本熵值大小

data = data(:)';
N = length(data);
Nkx1 = 0;
Nkx2 = 0;

for k = N - m:-1:1
    x1(k, :) = data(k:k + m - 1);
    x2(k, :) = data(k:k + m);
end

for k = N - m:-1:1
    x1temprow = x1(k, :);
    x1temp    = ones(N - m, 1)*x1temprow;   
    dx1(k, :) = max(abs(x1temp - x1), [], 2)';   
    Nkx1 = Nkx1 + (sum(dx1(k, :) < r) - 1)/(N - m - 1);    
    x2temprow = x2(k, :);
    x2temp    = ones(N - m, 1)*x2temprow;
    dx2(k, :) = max(abs(x2temp - x2), [], 2)';
    Nkx2      = Nkx2 + (sum(dx2(k, :) < r) - 1)/(N - m - 1);
end
Bmx1 = Nkx1/(N - m);
Bmx2 = Nkx2/(N - m);
SampEnVal = -log(Bmx2/Bmx1);
end

  包含更详细注释的代码,可以点击这里下载【样本熵Matlab函数】
  enjoy!

你可能感兴趣的:(Algorithm)