ECG数据压缩V1,尽可能保留特征点(纯干货)(算法逻辑+C++源码)

算法逻辑如下:

  1. 初始化:

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

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

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

算法目的:

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


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

int ECGDownSampler::applay(int inLenght, float *inValues, float *outValues)
{
    int i,j,max_j;
    float max_loss;
    float temp;
    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;j<n;j++){
            temp = abs(last - history[j]);
            if(temp > max_loss){
                max_loss = temp;
                max_j = j;
            }
        } 
        last = history[max_j];
        outValues[count] = last;
        count ++;
    }
    return count;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值