算法逻辑如下:
初始化:
- 设置
count
为 0,用于记录输出元素的数量。- 设置
n
为 0,用于记录当前历史值的索引。- 初始化
history
数组,用于存储最近的rate
个输入值。- 设置
last
为 0,表示上一次输出的值。遍历输入数据:
- 依次读取每个输入值
inValues[i]
。- 将输入值存储到
history
数组中,并更新n
的值。- 如果
n
不为 0,则跳过下一次迭代,因为还没有收集到足够的历史值。- 如果
n
为 0:
- 遍历
history
数组,找到与last
差值最大的元素的索引max_j
。- 将
history[max_j]
的值赋给last
,并将其输出到outValues
数组中。- 将
count
加 1,表示输出了一个元素。返回输出元素的数量:
- 返回
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;
}