加权递推平均滤波法

加权递推平均滤波法可以有效抑制噪声并提高数据稳定性。以下是分步实现的详细说明:


1. 滤波原理

加权递推平均滤波法通过为不同时刻的数据分配不同的权重,使新数据对结果影响更大,旧数据影响逐渐减小。公式如下:

Y_n = \frac{\sum_{i=0}^{N-1} (W_i \cdot X_{n-i})}{\sum_{i=0}^{N-1} W_i}

  • (Yn):滤波后输出
  • (Xn-i):第(n-i)次采样值
  • (Wi):权重系数(通常按时间递减)

2. STM32实现步骤

2.1 配置ADC与DMA
// 示例:STM32CubeMX配置
ADC_HandleTypeDef hadc;
DMA_HandleTypeDef hdma_adc;

// 启用ADC连续扫描模式,使用DMA传输数据
HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buffer, BUFFER_SIZE);
2.2 定义滤波参数
#define FILTER_WINDOW_SIZE 5  // 滤波窗口大小(N)

// 权重数组(总和建议为1.0,或调整计算时的分母)
static const float weights[FILTER_WINDOW_SIZE] = {0.4, 0.3, 0.2, 0.08, 0.02};

// 历史数据缓冲区
static float history[FILTER_WINDOW_SIZE] = {0};
static uint8_t data_index = 0;  // 当前数据位置
2.3 更新数据并计算滤波值
float WeightedMovingAverage(float new_sample) {
    // 更新历史数据(先进先出)
    history[data_index] = new_sample;
    data_index = (data_index + 1) % FILTER_WINDOW_SIZE;

    // 计算加权和
    float filtered_value = 0;
    for (int i = 0; i < FILTER_WINDOW_SIZE; i++) {
        int idx = (data_index + i) % FILTER_WINDOW_SIZE; // 从旧到新遍历
        filtered_value += history[idx] * weights[i];
    }

    return filtered_value;  // 假设权重总和为1,否则需除以总和
}
2.4 主循环或中断中调用
float adc_value, result;

// 在DMA完成中断或主循环中读取ADC值
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    adc_value = adc_buffer[0];  // 假设单通道采样
    result = WeightedMovingAverage(adc_value);
}

3. 优化建议

  1. 定点数优化:若无FPU,改用整数运算(如将权重放大1000倍)。

    const int32_t weights[5] = {400, 300, 200, 80, 20}; // 0.4, 0.3, 0.2...
    int32_t filtered_value = 0;
    filtered_value += history[idx] * weights[i]; // 结果需除以1000
    
  2. 循环缓冲区索引:使用位掩码代替取模运算(窗口大小为2的幂时)。

    #define FILTER_WINDOW_SIZE 4  // 必须是2^n
    #define BUFFER_MASK (FILTER_WINDOW_SIZE - 1)
    data_index = (data_index + 1) & BUFFER_MASK;
    
  3. 实时性保障:确保单次滤波计算时间小于采样间隔。


4. 权重选择示例

  • 快速响应{0.6, 0.3, 0.1}
  • 强平滑{0.25, 0.25, 0.25, 0.25}
  • 指数衰减:通过公式生成权重,如
    -![(W_i = \alpha \cdot (1-\alpha)^i)](https://i-blog.csdnimg.cn/direct/c4ab1a4df686498db341ee2192d2991d.png)(类似一阶低通滤波)。

5. 测试与调试

  1. 静态测试:输入模拟数据(如阶跃信号),观察滤波后响应。
  2. 动态测试:通过PWM生成模拟传感器信号,验证实时性。
  3. 调整参数:根据噪声频率和系统响应需求优化窗口大小和权重。

通过上述步骤,您可以在STM32上高效实现加权递推平均滤波,显著提升数据采集质量。

你可能感兴趣的:(单片机算法,算法)