65.9K
CodeProject 正在变化。 阅读更多。
Home

近似熵和样本熵复杂度度量

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.18/5 (8投票s)

2008年6月17日

GPL3

1分钟阅读

viewsIcon

24249

本文介绍了用于生物信号分析的近似熵和样本熵估计的 C++ 代码

引言

有无数信号可以使用谱分析方法进行分析:医学(HRV、ECG、EEG、EMG)、地质、音乐等。在不同的分析方法中,有一组旨在估计信号复杂度的复杂度指标。考虑正弦波和随机噪声。显然,正弦波是一种简单的信号形式,而噪声则更复杂。近似熵(ApEn)和样本熵(SmEn)指标可以提供这种信号复杂度程度的定量估计。ApEnSmEn 更适合于短期噪声信号的复杂度估计。它们具有优势,即它们分析原始信号,因为一些复杂度指标需要将原始信号量化为非常小的字母表。因此,它们在医学上广泛用于 HRV 数据分析。对于 EEG 数据分析,它们可用于估计一些复杂的神经元活动。

背景

您应该阅读我的 文章,关于应用 ApEnSmEn 分析 HRV 数据以预测阵发性心房颤动。在那里,提供了更详细的解释。这里只是 ApEnSmEn 的公式。

ApEn

SmEn

Using the Code

ApEn 代码如下所示

double ApEn(const double* data, unsigned int m, double r, unsigned int N, double std)
{
        int Cm = 0, Cm1 = 0;
        double err = 0.0, sum = 0.0;

        err = std * r;

        for (unsigned int i = 0; i < N - (m + 1) + 1; i++) {
                Cm = Cm1 = 0;
                for (unsigned int j = 0; j < N - (m + 1) + 1; j++) {
                        bool eq = true;
                        //m - length series
                        for (unsigned int k = 0; k < m; k++) {
                                if (abs(data[i+k] - data[j+k]) > err) {
                                        eq = false;
                                        break;
                                }
                        }
                        if (eq) Cm++;

                        //m+1 - length series
                        int k = m;
                        if (eq && abs(data[i+k] - data[j+k]) <= err)
                                Cm1++;
                }

                if (Cm > 0 && Cm1 > 0)
                        sum += log((double)Cm / (double)Cm1);                
        }

        return sum / (double)(N - m);
}

SmEn 代码接下来展示

double SmEn(const double* data, unsigned int m, double r, unsigned int N, double std)
{
        int Cm = 0, Cm1 = 0;
        double err = 0.0, sum = 0.0;

        err = std * r;

        for (unsigned int i = 0; i < N - (m + 1) + 1; i++) {
                for (unsigned int j = i + 1; j < N - (m + 1) + 1; j++) {      
                        bool eq = true;
                        //m - length series
                        for (unsigned int k = 0; k < m; k++) {
                                if (abs(data[i+k] - data[j+k]) > err) {
                                        eq = false;
                                        break;
                                }
                        }
                        if (eq) Cm++;

                        //m+1 - length series
                        int k = m;
                        if (eq && abs(data[i+k] - data[j+k]) <= err)
                                Cm1++;
                }
        }

        if (Cm > 0 && Cm1 > 0)
                return log((double)Cm / (double)Cm1);
        else
                return 0.0; 

}

Ndata 指向的信号的大小,std 是信号的离散程度,r 通常用作 0.2。SmEnApEn 衡量的是长度为 m 时与长度为 m+1 时有多少相似模式(在误差 r * std 内)。

历史

  • 2008 年 6 月 17 日:初始发布
© . All rights reserved.