电控系统信号采集与滤波实战指南
📚 文档概述
本指南面向电气工程师、自动化工程师和嵌入式系统开发者,系统讲解电控系统中信号采集与滤波的核心技术和工程实践。内容涵盖从传感器选型、模拟前端设计、数字滤波算法到多通道同步采集的完整知识链。
📖 目录结构
电控系统信号采集与滤波实战指南/
├── README.md # 本文件
├── 第 1 章_模拟信号采集电路设计.md # 传感器与模拟前端
├── 第 2 章_数字滤波算法实现.md # 数字滤波算法详解
├── 第 3 章_模拟滤波电路设计.md # 模拟滤波器与 PCB 布局
├── 第 4 章_多通道信号同步采集.md # 多通道同步采集方案
└── code/ # 代码示例
├── digital_filter_mean.c # 均值滤波实现
├── digital_filter_moving_average.c # 滑动窗口滤波实现
├── digital_filter_kalman.c # 卡尔曼滤波实现
├── adc_multi_channel_poll.c # ADC 多通道轮询示例
└── adc_dma_continuous.c # ADC+DMA 连续采集示例
🎯 核心内容
第 1 章:模拟信号采集电路设计
主要内容:
- ✅ 传感器选型指南(热电偶、霍尔传感器、电压测量)
- ✅ 信号调理电路设计(放大、分压、隔离)
- ✅ 典型传感器应用实例(K 型热电偶、ACS712、高压采样)
关键技能:
- 根据测量范围、精度、成本选择合适传感器
- 设计仪表放大器电路处理微弱信号
- 计算电阻分压网络并考虑功率余量
- 光电隔离与隔离放大器应用
第 2 章:数字滤波算法实现
主要内容:
- ✅ 均值滤波算法原理与实现
- ✅ 滑动窗口滤波算法(环形缓冲区优化)
- ✅ 卡尔曼滤波算法(一维简化版)
- ✅ 算法性能对比与适用场景分析
代码示例:
c
// 滑动窗口滤波 - 实时性最佳选择
MovingAverageFilter filter;
moving_avg_init(&filter, 8); // 窗口大小=8
float filtered = moving_avg_update(&filter, new_sample);
算法选择建议:
| 应用场景 | 推荐算法 | 窗口大小 | 理由 |
|---|---|---|---|
| 温度测量 | 滑动窗口 | N=8~16 | 计算简单,效果好 |
| 电机电流 | 均值滤波 | N=4~8 | 周期性信号适合 |
| 姿态解算 | 卡尔曼滤波 | - | 多传感器融合 |
| 电池电压 | 中值 + 滑动 | N=8 | 去除脉冲干扰 |
第 3 章:模拟滤波电路设计与 PCB 布局
主要内容:
- ✅ RC 低通/高通滤波器参数计算
- ✅ 巴特沃斯滤波器设计(1~4 阶)
- ✅ 电容/电阻选型原则
- ✅ PCB 布局技巧(地分割、去耦、走线规则)
设计工具:
RC 滤波器快速计算:
已知截止频率 fc = 1kHz,选择 C = 10nF
则 R = 1 / (2π × fc × C) = 15.9kΩ → 选择 16kΩ
验证:fc = 1 / (2π × 16k × 10nF) ≈ 995Hz ✓
PCB 布局黄金法则:
- 模拟地与数字地单点连接
- 去耦电容距 IC 引脚 < 5mm
- 差分对等长等距走线
- 敏感信号加保护环
- 电源使用π型滤波
第 4 章:多通道信号同步采集
主要内容:
- ✅ ADC 多通道轮询架构与时序分析
- ✅ DMA 批量传输技术(CPU 负载降低 99%+)
- ✅ 数据拼接与结构化处理
- ✅ 同步触发与抗混叠设计
性能对比:
| 采集方式 | CPU 占用率 | 同步性 | 适用场景 |
|---|---|---|---|
| 中断轮询 | >50% | 差 | 低速 (<1kSPS) |
| DMA 传输 | <1% | 一般 | 中高速 (>10kSPS) |
| 多 ADC 同步 | <2% | 优秀 | 高速精密测量 |
STM32 配置要点:
c
// DMA 循环模式配置
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
💻 代码示例说明
编译与运行
所有代码示例均为 C 语言实现,可在以下平台编译运行:
Windows (MinGW):
bash
gcc digital_filter_mean.c -o mean_filter.exe -lm
mean_filter.exe
Linux:
bash
gcc digital_filter_kalman.c -o kalman_filter -lm
./kalman_filter
嵌入式平台 (STM32):
- 使用 STM32CubeIDE 或 Keil MDK
- 替换 HAL 库调用
- 配置对应外设(ADC、DMA、定时器)
示例代码清单
1. digital_filter_mean.c
- 功能: 均值滤波算法实现与测试
- 特点: 包含基础均值和递推优化两种版本
- 测试信号: 50Hz 正弦波 + 高斯白噪声
- 输出: 信噪比改善统计
2. digital_filter_moving_average.c
- 功能: 滑动窗口滤波(环形缓冲区)
- 特点: O(1) 时间复杂度,适合实时系统
- 测试信号: 带脉冲干扰的温度曲线
- 输出: 脉冲抑制率分析
3. digital_filter_kalman.c
- 功能: 一维卡尔曼滤波实现
- 特点: 结构体封装,参数可配置
- 测试信号: 线性升温过程
- 输出: RMSE 误差统计、参数敏感性分析
4. adc_multi_channel_poll.c
- 功能: 8 通道 ADC 轮询采集
- 特点: 双缓冲设计,包含数据转换
- 采样率: 每通道 1.25kSPS
- 输出: 电压值、归一化数据
5. adc_dma_continuous.c
- 功能: DMA 连续采集 + 统计分析
- 特点: 双缓冲切换、RMS/频率计算
- 采样率: 100kSPS
- 输出: 完整统计报告(均值/最大/最小/RMS/频率)
🔧 工程设计检查清单
原理图设计阶段
- 传感器量程和精度满足要求
- 信号调理电路增益计算正确
- 滤波器截止频率合理
- 运放供电电压匹配系统
- 参考电压源精度足够
- 过压/过流保护完善
PCB 布局阶段
- 模拟/数字地分割合理
- 去耦电容靠近 IC 引脚
- 敏感信号有保护环
- 差分对阻抗控制
- 发热元件散热充分
- 测试点位置合理
软件设计阶段
- ADC 采样定理满足(fs > 2×fmax)
- 数字滤波参数经过验证
- DMA 优先级配置正确
- 数据溢出保护
- 校准功能完善
📊 关键公式汇总
模拟电路
RC 截止频率:fc = 1 / (2πRC)
分压公式:Vout = Vin × R2 / (R1 + R2)
仪表放大增益:G = 1 + 100kΩ/RG
电阻功率:P = V²/R = I²×R
数字滤波
均值滤波:y[n] = Σx[i] / N (i=n-N+1 to n)
滑动窗口:y[n] = y[n-1] + (x[n] - x[n-N]) / N
卡尔曼增益:K = P / (P + R)
状态更新:x = x + K × (z - x)
数据采集
奈奎斯特准则:fs > 2 × fmax
每通道采样率:fch = fADC_max / N
过采样提升分辨率:ENOB_new = ENOB_old + log4(OSR)
🎓 学习路径建议
入门级(1-2 周)
- 阅读第 1 章,了解传感器基础知识
- 搭建简单 RC 滤波电路并测试
- 运行均值滤波代码示例
进阶级(2-4 周)
- 深入学习第 2 章数字滤波算法
- 对比不同滤波器的效果
- 实现 STM32 单通道 ADC 采集
高级(1-2 月)
- 研究第 3 章 PCB 布局技巧
- 设计完整信号链(传感器→ADC→MCU)
- 实现多通道 DMA 采集系统
专家级(2-3 月)
- 掌握第 4 章同步采集技术
- 优化时序,实现微秒级同步
- 开发工业级产品原型
🛠️ 常用工具推荐
仿真软件
- LTspice - 模拟电路仿真(免费)
- TINA-TI - 滤波器设计(免费)
- MATLAB/Simulink - 系统建模(商业)
设计工具
- KiCad - 原理图/PCB 设计(免费)
- Altium Designer - 专业 PCB 设计(商业)
- STM32CubeMX - MCU 配置工具(免费)
测试仪器
- 示波器 - 时域波形观测
- 频谱分析仪 - 频域特性分析
- 数据采集卡 - 多通道同步采集
🔗 相关资源
电控系统信号采集与滤波实战指南
目录
-
模拟信号采集电路设计\](#第 1 章-模拟信号采集电路设计) * 1.1 传感器选型指南 * 1.2 信号调理电路设计 * 1.3 典型传感器应用实例
- 2.1 均值滤波算法
- 2.2 滑动窗口滤波算法
- 2.3 卡尔曼滤波算法
- 2.4 算法性能对比与适用场景
-
模拟滤波电路设计与 PCB 布局\](#第 3 章-模拟滤波电路设计与 pcb 布局) * 3.1 RC 低通/高通滤波器设计 * 3.2 巴特沃斯滤波器设计 * 3.3 参数计算方法 * 3.4 PCB 布局技巧与注意事项
- 4.1 ADC 多通道轮询采集
- 4.2 DMA 批量传输技术
- 4.3 数据拼接与处理
- 4.4 同步采集时序优化
第 1 章 模拟信号采集电路设计
1.1 传感器选型指南
1.1.1 温度测量 - 热电偶传感器
适用场景:
- 工业过程控制中的高温测量(-200°C ~ +1800°C)
- 汽车发动机温度监测
- 家用电器温控系统
选型要点:
- K 型热电偶:性价比高,测温范围宽(-200°C~+1250°C)
- PT100 铂电阻:精度高,适合中低温测量(-200°C~+850°C)
- NTC 热敏电阻:成本低,适用于常温范围(-50°C~+150°C)
关键参数:
- 精度等级:A 级(±0.15°C)或 B 级(±0.3°C)
- 响应时间:τ63 < 1s(快速响应)或 τ63 > 5s(稳定测量)
- 封装形式:探针式、表面贴装、螺纹安装
1.1.2 电流测量 - 霍尔传感器
适用场景:
- 电机驱动系统电流监测
- 电池管理系统(BMS)充放电电流检测
- 逆变器输出电流采样
选型要点:
- 开环霍尔传感器:成本低,带宽高(>100kHz),精度±1%
- 闭环霍尔传感器:精度高(±0.5%),线性度好,成本高
- 分流器 + 运放:小电流测量(<50A),成本低,有功率损耗
关键参数:
- 额定电流:根据最大工作电流选择(留 20% 余量)
- 供电电压:单电源(+5V)或双电源(±12V)
- 输出类型:电压型(0-5V)或电流型(4-20mA)
- 隔离电压:≥2500V(高压系统)
1.1.3 电压测量
适用场景:
- 电池组单体电压监测
- 直流母线电压采样
- 交流电网电压检测
选型方案:
- 电阻分压网络:简单经济,适合低压(<100V)
- 电压互感器:隔离测量,适合交流高压
- 光耦隔离放大器:高精度隔离测量
1.2 信号调理电路设计
1.2.1 放大电路设计
仪表放大器应用:
对于微弱信号(mV 级),如热电偶、应变片输出,需使用仪表放大器进行放大。
设计要点:
- 高输入阻抗(>1GΩ)减少负载效应
- 高共模抑制比(CMRR > 80dB)抑制干扰
- 低噪声、低漂移保证精度
- 增益可调范围:10~1000 倍
典型电路:
传感器 → 仪表放大器(AD620/INA128) → 低通滤波 → ADC
1.2.2 分压电路设计
电阻分压网络计算:
对于高压测量,使用电阻分压将高电压转换为 ADC 可接受的范围(0-3.3V 或 0-5V)。
计算公式:
Vout = Vin × R2 / (R1 + R2)
分压比 = R2 / (R1 + R2)
设计原则:
- 选择精密电阻(±0.1% 或±1%)
- 考虑电阻功率余量(≥2 倍实际功耗)
- 加入 TVS 管或稳压管过压保护
- 并联电容滤除高频噪声
1.2.3 隔离电路设计
光电隔离:
- 使用光耦(TLP521、6N137)隔离数字信号
- 隔离电压:≥2500Vrms
- 传输速率:低速(<10kbps)或高速(>1Mbps)
隔离放大器:
- ISO124、AMC1301等隔离运放
- 用于模拟信号隔离传输
- 隔离电压:≥5kV
- 线性度:<0.01%
1.3 典型传感器应用实例
1.3.1 K 型热电偶温度采集电路
系统要求:
- 测温范围:0°C ~ 1000°C
- 测量精度:±1°C
- 分辨率:0.1°C
电路设计方案:
- 冷端补偿: 使用数字温度传感器(DS18B20)测量冷端温度
- 信号放大: 仪表放大器 AD620,增益 G=100
- 滤波电路: RC 低通滤波器,截止频率 fc=10Hz
- ADC 转换: 16 位Σ-Δ型 ADC(ADS1115)
硬件连接:
K 型热电偶 → 冷端补偿电路 → AD620(G=100) → RC 低通滤波 → ADS1115 → MCU
热电偶输出电压计算:
E(t) = a0 + a1×t + a2×t² + ... + an×tⁿ
其中 t 为温度,系数 a0~an查 K 型热电偶分度表
灵敏度约为 41μV/°C
AD620 增益设置:
RG = 49.4kΩ / (G - 1)
当 G=100 时,RG ≈ 500Ω
1.3.2 霍尔电流传感器应用电路
型号: ACS712-30A(双向,±30A)
技术参数:
- 供电电压:5V
- 灵敏度:66mV/A
- 零点输出:2.5V
- 带宽:80kHz
- 响应时间:5μs
接口电路:
ACS712 VOUT → RC 滤波(fc=10kHz) → 运放跟随器 → ADC
电流计算:
I = (Vout - 2.5V) / 0.066
例如:Vout = 3.16V 时,I = (3.16 - 2.5) / 0.066 = 10A
1.3.3 高压直流母线电压采样
系统要求:
- 输入电压:0-500V DC
- 输出电压:0-3.3V(适配 3.3V 系统 ADC)
- 隔离要求:基本隔离
分压电阻计算:
分压比 = 3.3V / 500V = 0.0066
选择 R1 = 750kΩ, R2 = 5kΩ
验证:500V × 5k / (750k + 5k) = 3.31V ✓
电阻功率:
PR1 = (500V)² / 750kΩ = 0.33W → 选择 1W 电阻
PR2 = (3.3V)² / 5kΩ = 0.002W → 1/4W 电阻足够
保护电路:
- R1 串联两个 390kΩ电阻分担电压
- R2 并联 3.3V 稳压管过压保护
- 输入端串联 100Ω限流电阻 + TVS 管
第 2 章 数字滤波算法实现
2.1 均值滤波算法
2.1.1 算法原理
均值滤波是最简单的数字滤波方法,通过计算 N 个采样点的算术平均值来平滑信号,抑制随机噪声。
数学表达式:
y[n] = (x[n] + x[n-1] + ... + x[n-N+1]) / N
其中:
y[n]:第 n 次滤波输出x[n]:第 n 次采样值N:参与平均的采样点数
2.1.2 适用场景
✅ 适合:
- 消除随机噪声(高斯噪声)
- 传感器数据平滑处理
- 对实时性要求不高的场合
❌ 不适合:
- 快速变化的信号(相位滞后大)
- 脉冲干扰严重的场合
- 需要保留信号细节的应用
2.1.3 代码实现
详见代码文件:digital_filter_mean.c
2.2 滑动窗口滤波算法
2.2.1 算法原理
滑动窗口滤波是均值滤波的改进版本,维护一个固定长度的队列,每次只移除最旧数据并添加最新数据,提高计算效率。
递推公式:
y[n] = y[n-1] + (x[n] - x[n-N]) / N
2.2.2 适用场景
✅ 适合:
- 实时信号处理
- 嵌入式系统资源受限场合
- 需要连续滤波的场景
❌ 不适合:
- 存在大幅值脉冲干扰
- 需要自适应调整的场合
2.2.3 代码实现
详见代码文件:digital_filter_moving_average.c
2.3 卡尔曼滤波算法
2.3.1 算法原理
卡尔曼滤波是一种最优状态估计算法,通过预测 - 校正循环,结合系统模型和测量值,得到系统状态的最优估计。
核心方程:
-
预测阶段:
状态预测:x̂ₖ|ₖ₋₁ = F × x̂ₖ₋₁|ₖ₋₁ + B × uₖ
协方差预测:Pₖ|ₖ₋₁ = F × Pₖ₋₁|ₖ₋₁ × Fᵀ + Q -
更新阶段:
卡尔曼增益:Kₖ = Pₖ|ₖ₋₁ × Hᵀ × (H × Pₖ|ₖ₋₁ × Hᵀ + R)⁻¹
状态更新:x̂ₖ|ₖ = x̂ₖ|ₖ₋₁ + Kₖ × (zₖ - H × x̂ₖ|ₖ₋₁)
协方差更新:Pₖ|ₖ = (I - Kₖ × H) × Pₖ|ₖ₋₁
2.3.2 参数说明
x̂:状态估计值P:估计协方差矩阵(不确定性度量)F:状态转移矩阵Q:过程噪声协方差R:测量噪声协方差K:卡尔曼增益z:实际测量值
2.3.3 适用场景
✅ 适合:
- 多传感器数据融合
- 动态系统状态估计(如目标跟踪)
- GPS/IMU组合导航
- 电池 SOC 估算
❌ 不适合:
- 非线性系统(需使用扩展卡尔曼 EKF)
- 计算资源极度受限的 8 位 MCU
- 简单的一维信号滤波(杀鸡用牛刀)
2.3.4 代码实现
详见代码文件:[digital_filter_kalman.c](./code/digital_filter_kalman.``
2.4 算法性能对比与适用场景
2.4.1 性能对比表
算法类型 计算复杂度 内存占用 滤波效果 相位延迟 实时性
均值滤波 O(N) O(1) ★★☆☆☆ 大 一般
滑动窗口 O(1) O(N) ★★★☆☆ 中等 好
中值滤波 O(NlogN) O(N) ★★★★☆ 中等 一般
限幅滤波 O(1) O(1) ★★★☆☆ 小 好
卡尔曼滤波 O(n³) O(n²) ★★★★★ 小 较好
2.4.2 选择建议
简单温度测量(如恒温箱):
推荐:滑动窗口滤波(N=8~16)
理由:计算简单,效果够用
电机转速测量:
推荐:均值滤波(N=4~8)
理由:转速信号周期性强,均值滤波效果好
无人机姿态解算:
推荐:卡尔曼滤波
理由:需要融合加速度计、陀螺仪、磁力计多源数据
电池电压采样:
推荐:中值滤波 + 滑动窗口
理由:去除偶发毛刺,平滑波动
工业传感器接口:
推荐:限幅滤波 + 滑动窗口
理由:快速响应,有效抑制尖峰脉冲
2.4.3 组合滤波策略
实际工程中常采用多级滤波:
ADC 采样 → 中值滤波(去毛刺) → 滑动窗口滤波(平滑) → 工程单位转换
示例代码结构:
// 三级滤波处理流程
raw_adc = ADC_Read();
median_filtered = MedianFilter(raw_adc); // 第一级:去脉冲干扰
moving_avg = MovingAverage(median_filtered); // 第二级:平滑处理
voltage = ADC2Voltage(moving_avg); // 第三级:单位转换
2.5 中值滤波算法
2.5.1 算法原理
中值滤波是一种非线性滤波方法,通过取滑动窗口内所有采样值的中位数来替代当前值,对脉冲噪声(椒盐噪声)有极佳的抑制效果。
数学表达式:
y[n] = median(x[n], x[n-1], ..., x[n-N+1])
其中 median() 函数返回窗口内 N 个采样值排序后的中间值。
2.5.2 适用场景
✅ 适合:
消除脉冲干扰(尖峰噪声)
传感器偶发异常值剔除
图像处理中的去噪
❌ 不适合:
高斯噪声(效果不如均值滤波)
实时性要求极高的场合(排序耗时)
需要保留信号边缘细节
2.5.3 代码实现
/**
- @brief 中值滤波实现
- @param window 采样值窗口数组
- @param size 窗口大小(建议奇数,如 3、5、7)
- @return 中值结果
*/
#include <stdlib.h>
// 比较函数用于 qsort
int compare(const void a, const void b) {
return ((float )a > (float )b) ? 1 : -1;
}
float median_filter(float *window, int size) {
// 创建副本进行排序,不破坏原始数据
float temp = (float )malloc(size * sizeof(float));
if (temp == NULL) return window[size / 2]; // 内存分配失败时返回中间值
for (int i = 0; i < size; i++) {
temp[i] = window[i];
}
// 快速排序
qsort(temp, size, sizeof(float), compare);
// 取中位数
float result = temp[size / 2];
free(temp);
return result;
}
// 使用示例
void median_filter_example(void) {
// 模拟传感器数据(含脉冲干扰)
float samples[] = {25.0, 25.1, 25.2, 100.5, 25.0, 24.9, 25.1, 25.0};
int window_size = 5; // 窗口大小
float window[5];
printf("原始数据:\n");
for (int i = 0; i < 8; i++) {
printf("%.1f ", samples[i]);
}
printf("\n\n中值滤波结果(窗口=5):\n");
for (int i = 0; i < 8; i++) {
// 填充窗口
for (int j = 0; j < window_size; j++) {
int idx = i - window_size / 2 + j;
if (idx < 0) idx = 0;
if (idx >= 8) idx = 7;
window[j] = samples[idx];
}
float filtered = median_filter(window, window_size);
printf("采样%d: 原始=%.1f, 滤波后=%.1f\n", i, samples[i], filtered);
}
}
输出示例:
原始数据:
25.0 25.1 25.2 100.5 25.0 24.9 25.1 25.0
中值滤波结果(窗口=5):
采样0: 原始=25.0, 滤波后=25.0
采样1: 原始=25.1, 滤波后=25.1
采样2: 原始=25.2, 滤波后=25.2
采样3: 原始=100.5, 滤波后=25.1 ← 脉冲被有效抑制
采样4: 原始=25.0, 滤波后=25.1
采样5: 原始=24.9, 滤波后=25.0
采样6: 原始=25.1, 滤波后=25.0
采样7: 原始=25.0, 滤波后=25.0
2.6 限幅滤波算法
2.6.1 算法原理
限幅滤波(又称程序判断滤波)通过限制相邻两次采样值的最大变化幅度来抑制脉冲干扰。如果当前采样值与上次有效值的差值超过阈值,则丢弃当前值。
数学表达式:
if |x[n] - y[n-1]| <= Δ:
y[n] = x[n]
else:
y[n] = y[n-1]
其中 Δ 为最大允许变化量(限幅阈值)。
2.6.2 适用场景
✅ 适合:
快速响应的实时系统
传感器信号中的偶发尖峰抑制
保护性滤波(防止异常值导致系统误动作)
❌ 不适合:
连续噪声环境(需要配合其他滤波)
信号本身变化剧烈的场合
需要平滑输出的场景
2.6.3 代码实现
/**
-
@brief 限幅滤波实现
-
@param new_sample 当前采样值
-
@param last_valid 上次有效值(指针,会被更新)
-
@param threshold 最大允许变化量
-
@return 滤波后的有效值
*/
float limiting_filter(float new_sample, float *last_valid, float threshold) {
float delta = new_sample - *last_valid;
// 取绝对值
if (delta < 0) delta = -delta;
if (delta <= threshold) {
// 变化在允许范围内,接受新值
*last_valid = new_sample;
return new_sample;
} else {
// 变化超出阈值,保留上次值
return *last_valid;
}
}
// 使用示例
void limiting_filter_example(void) {
// 模拟温度传感器数据(含偶发尖峰)
float samples[] = {25.0, 25.1, 25.3, 50.0, 25.2, 25.0, 24.8, 25.1};
float last_valid = samples[0]; // 初始值
float threshold = 2.0; // 最大允许变化 ±2°C
printf("限幅滤波示例(阈值=±%.1f°C):\n", threshold);
printf("采样\t原始值\t滤波后\t状态\n");
printf("--------------------------------\n");
for (int i = 0; i < 8; i++) {
float filtered = limiting_filter(samples[i], &last_valid, threshold);
const char *status = (filtered == samples[i]) ? "接受" : "丢弃";
printf("%d\t%.1f\t%.1f\t%s\n", i, samples[i], filtered, status);
}
}
// 限幅+滑动窗口组合滤波
typedef struct {
float last_valid;
float threshold;
float buffer[16];
int index;
int count;
float sum;
} ComboFilter;
void combo_filter_init(ComboFilter *f, float threshold, int window_size) {
f->last_valid = 0;
f->threshold = threshold;
f->index = 0;
f->count = 0;
f->sum = 0;
}
float combo_filter_update(ComboFilter *f, float sample, int window_size) {
// 第一级:限幅滤波
float limited = limiting_filter(sample, &f->last_valid, f->threshold);
// 第二级:滑动窗口滤波
if (f->count < window_size) {
f->sum += limited;
f->buffer[f->index] = limited;
f->index = (f->index + 1) % window_size;
f->count++;
return f->sum / f->count;
} else {
f->sum -= f->buffer[f->index];
f->buffer[f->index] = limited;
f->sum += limited;
f->index = (f->index + 1) % window_size;
return f->sum / window_size;
}
}
输出示例:
限幅滤波示例(阈值=±2.0°C):
采样 原始值 滤波后 状态
0 25.0 25.0 接受
1 25.1 25.1 接受
2 25.3 25.3 接受
3 50.0 25.3 丢弃 ← 尖峰被剔除
4 25.2 25.2 接受
5 25.0 25.0 接受
6 24.8 24.8 接受
7 25.1 25.1 接受
2.7 综合应用示例:多级滤波在温度采集系统中的应用
2.7.1 系统需求
设计一个工业温度采集模块,要求:
测温范围:0°C ~ 200°C(PT100 传感器)
采样频率:10Hz
滤波要求:有效抑制工频干扰(50Hz)和偶发脉冲
输出更新率:2Hz(每 500ms 输出一次滤波结果)
2.7.2 滤波方案设计
ADC 原始数据
↓
限幅滤波\] → 剔除偶发脉冲(阈值=5°C)
↓
\[滑动窗口\] → 平滑处理(窗口=10,对应 1 秒数据)
↓
\[均值抽取\] → 每 5 个滑动窗口结果取平均(对应 500ms 输出周期)
↓
最终输出
2.7.3 完整代码实现
#include \