news 2026/6/23 4:31:14

别再怕公式!用C语言在STM32上实现一阶低通滤波器(附完整代码与波形分析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再怕公式!用C语言在STM32上实现一阶低通滤波器(附完整代码与波形分析)

用C语言在STM32上实现一阶低通滤波器的实战指南

1. 为什么选择一阶低通滤波器?

在嵌入式开发中,传感器数据往往伴随着各种噪声干扰。想象一下,你正在开发一个基于STM32的智能温控系统,温度传感器的读数却因为电源波动而不断跳动——这时候,一个简单有效的低通滤波器就能让数据变得平滑可靠。

一阶低通滤波器特别适合资源有限的单片机场景,它具有几个显著优势:

  • 计算量极小:仅需一次乘法和一次加法运算
  • 内存占用少:只需存储前一个输出值
  • 参数调节直观:通过单个系数即可控制滤波强度
  • 实时性好:适合高频采样的嵌入式系统
// 典型的一阶低通滤波器实现 float lowPassFilter(float input, float prev_output, float alpha) { return alpha * input + (1 - alpha) * prev_output; }

提示:对于采样频率1kHz的系统,alpha值通常在0.01-0.3之间,具体取决于需要的滤波强度。

2. 关键参数计算与实战配置

2.1 理解滤波系数α

滤波系数α(alpha)决定滤波器的"惰性"程度:

α值滤波效果响应速度适用场景
0.9几乎不过滤极快几乎不需要滤波的场合
0.5适度过滤轻度噪声环境
0.1明显过滤中等典型工业环境
0.01强过滤高噪声环境

计算公式:

α = 2πf_c × T_s

其中:

  • f_c:截止频率(Hz)
  • T_s:采样周期(s)

2.2 实际配置示例

假设我们需要在STM32F103上实现一个50Hz截止频率的滤波器,采样率为1kHz:

  1. 计算采样周期:T_s = 1/1000 = 0.001s
  2. 计算α值:α = 2×3.1416×50×0.001 ≈ 0.314
  3. 转换为定点数(优化性能):Q15格式 α = 0.314×32768 ≈ 10289
// 定点数实现(Q15格式) int16_t lowPassFilterFixed(int16_t input, int16_t prev_output) { int32_t temp = (10289L * input) + ((32768 - 10289) * prev_output); return (int16_t)(temp >> 15); // 右移15位得到Q15结果 }

3. STM32上的完整实现方案

3.1 硬件准备

所需组件:

  • STM32开发板(如STM32F103C8T6)
  • 传感器模块(如MPU6050加速度计)
  • 示波器或串口绘图工具

3.2 软件实现

#include "stm32f1xx_hal.h" #define SAMPLE_RATE 1000 // 1kHz采样率 #define CUTOFF_FREQ 50 // 50Hz截止频率 float alpha = 0.0f; float prev_output = 0.0f; void initFilter() { float Ts = 1.0f / SAMPLE_RATE; alpha = 2 * 3.1415926f * CUTOFF_FREQ * Ts; } float applyFilter(float input) { prev_output = alpha * input + (1 - alpha) * prev_output; return prev_output; } // 在ADC中断中调用 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { float raw_value = (float)HAL_ADC_GetValue(hadc); float filtered = applyFilter(raw_value); // 通过串口发送原始值和滤波值用于对比 printf("%.2f,%.2f\n", raw_value, filtered); }

3.3 性能优化技巧

  1. 使用查表法:预先计算常用α值的(1-α)乘积
  2. 定点数运算:对于无FPU的MCU,使用Q格式定点数
  3. DMA传输:结合ADC的DMA功能减少CPU开销
  4. 环形缓冲区:实现多通道滤波时提高效率

4. 实际效果评估与调试

4.1 波形对比分析

通过串口将原始数据和滤波后数据发送到PC,使用Python绘制对比曲线:

import matplotlib.pyplot as plt import numpy as np # 模拟含噪声的信号 t = np.linspace(0, 1, 1000) signal = np.sin(2*np.pi*5*t) # 5Hz有用信号 noise = 0.3*np.random.randn(1000) # 高斯噪声 raw_data = signal + noise # 应用一阶低通滤波 alpha = 0.1 filtered = np.zeros_like(raw_data) filtered[0] = raw_data[0] for i in range(1, len(raw_data)): filtered[i] = alpha*raw_data[i] + (1-alpha)*filtered[i-1] # 绘制结果 plt.figure(figsize=(10,4)) plt.plot(t, raw_data, label='Raw Data') plt.plot(t, filtered, label='Filtered', linewidth=2) plt.legend() plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Low Pass Filter Effect') plt.show()

4.2 常见问题排查

  1. 滤波效果不明显

    • 检查α值计算是否正确
    • 确认采样率与截止频率关系合理
  2. 信号延迟过大

    • 尝试增大α值(更接近1)
    • 考虑是否需要改用IIR或FIR滤波器
  3. 数值溢出问题

    • 检查变量范围是否足够
    • 定点数实现时注意移位操作

注意:在调试时,建议先用已知频率的正弦波测试,再逐步引入真实传感器数据。

5. 进阶应用与扩展

5.1 动态调整截止频率

对于需要适应不同环境的系统,可以实现动态α值:

void setCutoffFrequency(float new_freq) { float Ts = 1.0f / SAMPLE_RATE; alpha = 2 * 3.1415926f * new_freq * Ts; }

5.2 多传感器滤波方案

当需要处理多个传感器数据时,可以采用结构体封装:

typedef struct { float alpha; float prev_output; } LowPassFilter; void initFilter(LowPassFilter* filter, float cutoff_freq) { float Ts = 1.0f / SAMPLE_RATE; filter->alpha = 2 * 3.1415926f * cutoff_freq * Ts; filter->prev_output = 0.0f; } float applyFilter(LowPassFilter* filter, float input) { filter->prev_output = filter->alpha * input + (1 - filter->alpha) * filter->prev_output; return filter->prev_output; }

5.3 与其它滤波技术结合

  1. 先均值滤波再低通滤波:适用于脉冲噪声
  2. 低通滤波后滑动窗口:进一步平滑数据
  3. 配合阈值检测:实现异常值剔除
// 组合滤波示例 float combinedFilter(float input) { static float buffer[5] = {0}; static uint8_t index = 0; // 滑动窗口均值 buffer[index] = input; index = (index + 1) % 5; float mean = (buffer[0]+buffer[1]+buffer[2]+buffer[3]+buffer[4]) / 5; // 低通滤波 return applyFilter(mean); }

在实际项目中,我发现对于缓慢变化的物理量(如温度),α值设为0.05-0.1效果最佳;而对于快速变化量(如加速度),可能需要0.2-0.3的α值才能既保持信号特征又有效滤除噪声。调试时务必结合实际信号特征和系统需求进行参数微调。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 2:12:36

Ucupaint修改器系统深度解析:7大工具如何重塑Blender纹理工作流

Ucupaint修改器系统深度解析:7大工具如何重塑Blender纹理工作流 【免费下载链接】ucupaint Ucupaint is Blender addon to manage texture layers for Eevee and Cycles renderer. 项目地址: https://gitcode.com/gh_mirrors/uc/ucupaint 在Blender的纹理创作…

作者头像 李华
网站建设 2026/6/12 2:19:30

制造业图纸数据安全现状与防护体系建设

# 制造业图纸数据安全现状与防护体系建设 制造业是国民经济的主体,也是数据安全的重点领域。对于机械加工、装备制造、精密模具等行业来说,CAD图纸、UG模型、工艺参数等技术资料是企业最核心的无形资产。然而,随着数字化办公的普及和产业链协…

作者头像 李华
网站建设 2026/6/12 2:50:00

AGI、Agent、Skill、MCP:AI应用开发必知四大金刚如何协同作战!

你肯定听过这些词——RAG、Agent、Skill、MCP。网上讲得天花乱坠,但看完还是一头雾水:它们到底有啥区别?是怎么配合工作的?为什么一个复杂的 AI 应用要把它们全用上? 别急,这篇就是来给你把这四个概念串成一…

作者头像 李华
网站建设 2026/6/11 16:14:35

从空调温控到信号调理:聊聊身边那些‘隐藏’的一阶低通滤波器

从空调温控到信号调理:聊聊身边那些‘隐藏’的一阶低通滤波器清晨被闹钟唤醒时,手机屏幕的触控滑动异常跟手;走进恒温25℃的办公室,空调出风口的风速变化几乎察觉不到;甚至接水时发现饮水机的水流总是平稳如常——这些…

作者头像 李华