|
感謝各位的解答。目前問(wèn)題暫時(shí)解決,用的是EWMA濾波公式
把得到的ADC都減去零點(diǎn)值,取他們的平恒值
/**********************************濾 波**********************************************/
float alpha = 0.9; // 初始濾波系數(shù)
float blpha = 0.9; // 初始第二次濾波系數(shù)
float min_alpha = 0.1; // 最小濾波系數(shù)
float min_blpha = 0.1; // 最小第二次濾波系數(shù)
float alpha_decay = 0.1; // 系數(shù)衰減步長(zhǎng)
float blpha_decay = 0.1; // 第二次系數(shù)衰減步長(zhǎng)
float filtered_value = 0, red_value = 0; // 初始化濾波值
float previous_value = 0; // 存儲(chǔ)上一個(gè)值,用于計(jì)算變化量
/************************************************************************/
// EWMA濾波公式
int process_integer_data(int new_value)
{
// 計(jì)算當(dāng)前值與上一個(gè)值的差異
uint16_t change = fabs(new_value-previous_value);
previous_value = new_value;
// 動(dòng)態(tài)調(diào)整濾波系數(shù)
if (change < 0.1) { // 假設(shè)小于0.01表示穩(wěn)定
alpha = 0.09;
blpha = 0.09;
} else {
alpha = 0.8; // 可以增加一些系數(shù)以便于快速響應(yīng)變化
blpha = 0.8;
}
// 應(yīng)用濾波
filtered_value = alpha * new_value + (1 - alpha) * filtered_value;
red_value = blpha * filtered_value + (1 - blpha) * red_value;
return (int)(red_value + 0.5); // 返回濾波后的值
} |
|