ECG数据压缩V2,(纯干货)(算法逻辑+C++源码)

本文介绍了一种改进的ECG信号下采样算法,与使用差值的旧版本不同,新算法利用两次输入值的斜率差值来减小输出值的跳变。文章分析了两种算法的优缺点,并强调根据应用场景选择合适的方法。
摘要由CSDN通过智能技术生成

该代码与之前的代码(数据压缩V1)相比,主要有以下两个区别:

  • 在 history 数组中,保存了最近两个输入值。
  • 在选择输出值时,使用了两次输入值的斜率差值来衡量差异。

算法逻辑如下:

  1. 初始化:

    • 设置 count 为 0,用于记录输出元素的数量。
    • 设置 n 为 0,用于记录当前历史值的索引。
    • 初始化 history 数组,用于存储最近的两个输入值。
    • 设置 last[0] 为 0,表示上一次输出的值。
    • 设置 last[1] 为 0,表示上一次输出值的前一个值。
  2. 遍历输入数据:

    • 依次读取每个输入值 inValues[i]
    • 将输入值存储到 history 数组中,并更新 n 的值。
    • 如果 n 不为 0,则跳过下一次迭代,因为还没有收集到足够的历史值。
    • 如果 n 为 0:
      • 计算两次输入值的斜率差值 k1 - k2
      • 找到斜率差值最大的元素的索引 k
      • 将 history[k] 的值赋给 last[1],并将其输出到 outValues 数组中。
      • 将 last[0] 赋值为 last[1]
      • 将 count 加 1,表示输出了一个元素。
  3. 返回输出元素的数量:

    • 返回 count,表示输出元素的数量。

算法目的:

该算法与之前的算法类似,也是一种下采样方法,用于降低 ECG 信号的采样率。它通过在每个采样周期内选择与上一次输出值的斜率差值最大的历史值作为新的输出值,来保留 ECG 信号的形态特征,同时减少数据量。

比较分析:

两种算法的主要区别在于,第一种算法使用了与上一次输出值的差值来衡量差异,而第二种算法使用了两次输入值的斜率差值来衡量差异。

两种算法的优缺点如下:

  • 第一种算法的优点是简单易实现,计算量小。缺点是可能会导致输出值出现跳变。
  • 第二种算法的优点是可以减少输出值的跳变。缺点是计算量稍大。

具体选择哪种算法,需要根据具体的应用场景来决定。


#define abs(x) (x) < 0 ? -(x) : (x)

class ECGDownSampler
{
    int rate; // 多少个点采集一个值
    int n; // 距离上一次采样过了多久 
    int history[100]; // 缓存的数据 
    int last[2]; // 前2个采集点 
public:
    ECGDownSampler(int r=8); // 8 倍下采样 
    int applay(int inLenght, float *inValues, float *outValues); // 返回采样后的数据长度
};

ECGDownSampler::ECGDownSampler(int r)
{
    this->rate = r; // 多少个点采集一个值
    this->n = 0;    // 距离上一次采样过了多久
    for (int i = 0; i < 2; i++)
    {
        this->last[i] = 0;
    }
}

int ECGDownSampler::applay(int inLenght, float *inValues, float *outValues)
{
    int i, j, k;
    float max_loss;
    float temp;
    float k1, k2; 
    int count = 0;

    for (i = 0, count = 0; i < inLenght; i++)
    {
        history[n] = inValues[i];
        n = (n + 1) % rate; // 计算新的 n
        if (n != 0)
            continue;

        for (j = 0, max_loss = -1, k1 = (last[1] - last[0]) / rate, k=0;
             j < n;
             j++)
        {
            k2 = (last[1] - history[j]) / (rate / 2 + j);  // 求斜率
            temp = abs(k1 - k2); // 求斜率差
            if (temp > max_loss) // 最差大差异的斜率
            {
                max_loss = temp; 
                k = j; // 记录当前的k
            }
        }
        last[0] = last[1];        // 删除
        last[1] = history[k];     // 添加
        outValues[count] = last[1];
        count++;
    }
    return count;
}

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值