感谢各位的解答。目前问题暂时解决,用的是EWMA滤波公式
把得到的ADC都减去零点值,取他们的平恒值
/**********************************滤 波**********************************************/
float alpha = 0.9; // 初始滤波系数
float blpha = 0.9; // 初始第二次滤波系数
float min_alpha = 0.1; // 最小滤波系数
float min_blpha = 0.1; // 最小第二次滤波系数
float alpha_decay = 0.1; // 系数衰减步长
float blpha_decay = 0.1; // 第二次系数衰减步长
float filtered_value = 0, red_value = 0; // 初始化滤波值
float previous_value = 0; // 存储上一个值,用于计算变化量
/************************************************************************/
// EWMA滤波公式
int process_integer_data(int new_value)
{
// 计算当前值与上一个值的差异
uint16_t change = fabs(new_value-previous_value);
previous_value = new_value;
// 动态调整滤波系数
if (change < 0.1) { // 假设小于0.01表示稳定
alpha = 0.09;
blpha = 0.09;
} else {
alpha = 0.8; // 可以增加一些系数以便于快速响应变化
blpha = 0.8;
}
// 应用滤波
filtered_value = alpha * new_value + (1 - alpha) * filtered_value;
red_value = blpha * filtered_value + (1 - blpha) * red_value;
return (int)(red_value + 0.5); // 返回滤波后的值
} |