本文最后更新于42 天前,其中的信息可能已经过时,如有错误请留言告知
核心任务:为您基于 ESP32-S3 和 KS1081 采集的原始心电(ECG)信号添加 DSP 算法滤波,去除干扰,以供上位机绘制清晰真实的波形。
- 编译器 Bug 规避与降级处理
- 问题:在引入
espressif/esp-dsp官方组件时,您的本地编译器发生了核心级崩溃(GCC 15.2.0 ICE: Segfault)。 - 解决:果断抛弃第三方库黑盒,改为在
main.c中直接使用纯 C 代码写出原生的滑动窗口和二阶差分方程,成功避开了编译器 Bug。
- 问题:在引入
- 寄存器溢出导致的“波形直线死亡”事件
- 问题:部署程序后上位机的红线一开始疯狂下跳,随后变成死死不变的直线。
- 原因:ESP-DSP 的陷波函数需要接收 归一化频率(50Hz / 250Hz = 0.2),但我错误地塞入了原始值
250。这导致三角函数(Sin/Cos)生成了灾难性的滤波器系数,信号量瞬间放大了数万倍导致浮点数运算越界得到NaN乱码,传回上位机呈现为死锁死线。 - 解决:手动利用 Python 修正系数并固化在代码中,确保了绝对的安全和稳定。
- 乱码现象认知
- 终端里
idf_monitor.py出现的类似于.l @等乱码是正常的。因为为了配合上位机,ESP32 正在通过 UART 发送高效率的十六进制纯二进制流帧(以0xFF开头),这在纯文本解析器眼里就是乱码。
- 终端里
🧠 核心 DSP 信号学知识点提炼
1. 为什么需要这套“黄金滤波组合”?
- 50Hz 陷波器 (Notch Filter) —— 剔除“大石头”: 人体相当于一个移动大天线,极易吸收周围插座和电灯的 220V/50Hz 交流电磁辐射。这会给极微小的 ECG 叠加上巨大的 50Hz 工频波纹。陷波器就是在 50Hz 的频带上挖出一个垂直的坑,将这个频率“赶尽杀绝”。
- <40Hz 低通滤波 (Low-pass) —— 扫除“小灰尘”: 有用的心跳信号通常徘徊在
0.5 ~ 40Hz。高于 40Hz 的主要是肌电信号(人呼吸或紧张导致的肌肉颤动细刺)和芯片微电流硬件底噪。低通滤波从 40Hz 起画出下坡路,频率越高阻碍越大,梳理杂乱底噪。
2. FIR 与 51阶 到底是什么?
- FIR(有限脉冲响应): 纯看历史输入的“滑动平均算分法”。
- 最大优势(对于心电图致命重要):线性相位。所有频率不管通过该滤波器慢了多少,慢的时间全都是一致的。因此心脏 QRS 波型的尖峰和间隔时间形状不会有一丝一毫的扭曲变形(保真度极高)!
- 为何叫“有限”:因为它不包含反馈公式,一旦一个糟糕の极端电平(比如拍了一下传感器)随着时间位移超出了滑动窗口范围,它就彻底被计算公式遗忘了,永不影响未来。
- 51阶 (Order / Taps): 也就是计算当前的瞬间波形点时,“回头参考记录了多少个旧的采样点”。
- 阶数越大:过滤效果越好,阻隔悬崖越陡峭;但单片机算力压力大,且波形在屏幕上显示出来的延迟就越大。
- 51阶:在您的 250Hz 采样率设置下,它是一个完美的“甜点位”:平滑度足够,且延迟只有不到
0.1s,完美实现医学级实时监控。


