嵌入式系统滤波算法大全:从原理到代码实现

嵌入式系统滤波算法大全:从原理到代码实现

在嵌入式系统开发中,滤波算法是处理传感器数据、抑制噪声、提高系统稳定性的关键技术。本文将全面介绍嵌入式开发中常用的滤波算法,包括PID控制、卡尔曼滤波、一阶/二阶滤波等,提供可直接调用的通用代码实现,并详细分析各种算法的适用场景和核心区别。

一、基础滤波算法

1. 移动平均滤波(Moving Average Filter)

适用场景:适用于缓慢变化的信号,如温度、压力等环境参数的平滑处理。能有效抑制随机噪声,但对脉冲干扰和快速变化信号响应滞后。

代码实现

#define WINDOW_SIZE 10

typedef struct {
   
   
    float buffer[WINDOW_SIZE];
    uint8_t index;
    float sum;
} MovingAverageFilter;

float moving_average_update(MovingAverageFilter* filter, float new_value) {
   
   
    // 减去即将被替换的旧值
    filter->sum -= filter->buffer[filter->index];
    // 添加新值并更新总和
    filter->sum += new_value;
    filter->buffer[filter->index] = new_value;
    filter->index = (filter->index + 1) % WINDOW_SIZE;
    
    return filter->sum / WINDOW_SIZE;
}

// 初始化函数
void moving_average_init(MovingAverageFilter* filter) {
   
   
    memset(filter->buffer, 0, sizeof(filter->buffer));
    filter->index = 0;
    filter->sum = 0;
}

特点分析

  • 优点:实现简单,计算量小,适合资源有限的嵌入式系统
  • 缺点:引入滞后,窗口越大平滑效果越好但滞后越明显
  • 变体:加权移动平均(给近期数据更高权重)

2. 中值滤波(Median Filter)

适用场景:有效去除脉冲干扰(如开关噪声、传感器偶发错误),适用于存在突发异常值的信号处理,如按键检测、工业设备状态监测等。

代码实现

#define MEDIAN_WINDOW 5 // 建议使用奇数

float median_filter(float* input) {
   
   
    float sorted[MEDIAN_WINDOW];
    memcpy(sorted, input, sizeof(sorted));
    
    // 冒泡排序
    for(int i = 0; i < MEDIAN_WINDOW-1; i++) {
   
   
        for(int j = 0; j < MEDIAN_WINDOW-i-1; j++) {
   
   
            if(sorted[j] > sorted[j+1]) {
   
   
                float temp = sorted[j];
                sorted[j] = sorted[j+1];
                sorted[j+1] = temp;
            }
        }
    }
    
    return sorted[MEDIAN_WINDOW/2]; // 返回中值
}

// 使用示例
float sensor_readings[MEDIAN_WINDOW] = {
   
   23.4, 22.8, 130.5, 23.1, 22.9}; // 假设130.5是异常值
float valid_value = median_filter(sensor_readings); // 返回23.1

优化技巧

  • 对于实时系统,可采用更高效的排序算法(如插入排序)
  • 结合移动平均滤波使用,先中值去脉冲再平均平滑

3. 限幅滤波(Limit Filter)

适用场景:已知信号变化速率的场景,如电机转速监测、缓慢变化的物理量测量。可防止因干扰导致的数值突变。

代码实现

typedef struct {
   
   
    float last_value;
    float max_delta;
} LimitFilter;

float limit_filter_update(LimitFilter* filter, float new_value) {
   
   
    float delta = new_value - filter->last_value;
    
    <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值