本篇继 [[信号处理之频域分析]] ,重点讲讲如何建立起这套“先诊断、后手术”的能力
第一步:高频抓取 (Capture Fast) —— “要想看见鬼,快门得够快”
这是新手最容易死的地方。你想诊断 50Hz 的干扰,却用 10Hz 的速度去采样,那你一辈子也找不到原因。
- 指导思想: 奈奎斯特采样定理 (Nyquist Theorem)。
- 原则: 你的采样频率 ($fs$) 必须至少是你怀疑的干扰频率的 2 倍以上。
- 实战建议:如果你怀疑有工频干扰 (50Hz),你的采样率至少要设到 200Hz 或 500Hz。
- 为什么:只有采样够快,原本模糊的“幽灵”才能在数据里显形。
- 动作: 在单片机或采集卡上,暂时关掉所有的平均算法,把采样率拉满,抓取一段**“裸数据” (Raw Data)** 存下来。
第二步:频谱侦查 (FFT Diagnosis) —— “把果汁还原成配方”
拿到裸数据后,不要盯着时域波形发呆。立刻做 FFT。
- 指导思想: 能量集中原则。
- 逻辑: 噪声和信号的区别在于,信号通常是缓慢变化的(低频),而能够被“手术切除”的干扰,通常在频域上表现为“尖峰”**。
- 判读字典(经验之谈):
- 50Hz / 60Hz 尖峰: 电源干扰、接地不良。
- 100Hz / 120Hz 尖峰: 全波整流后的纹波(电源板滤波电容坏了)。
- 几十 kHz 尖峰: 开关电源 (Switching Power Supply) 的频率。
- 特定低频 (如 0.5Hz): 泵的脉动、机械震动。
- 平坦的底噪 (Carpet): 白噪声(热噪声),这个没法切,只能用平均法压下去。
第三步:手术方案 (Filter Design) —— “对症下药”
根据 FFT 看到的“病灶”,选择刀具。
- 指导思想: 保留信号,切除干扰,代价最小。
- 决策树:
- 如果你看到了“孤立的尖峰” (如 50Hz):
- 方案: 陷波器 (Notch Filter)。
- 理由: 精准打击,不伤及无辜(不影响反应速度)。
- 如果你看到“高频全是乱草”:
- 方案: 低通滤波器 (Low Pass, LPF)。
- 理由: 只要低频的信号,高频的一刀切。
- 如果你看到“0Hz 附近有个巨大的直流偏置” (基线漂移):
- 方案: 高通滤波器 (High Pass) 或 去直流 (Detrend)。
- 理由: 只看变化量,不看绝对值。
- 如果你看到了“孤立的尖峰” (如 50Hz):
第四步:仿真验证 (Simulation) —— “在虚拟病人身上试刀”
千万不要直接把滤波代码写进 CEMS 仪器里去运行。
- 指导思想: 所见即所得 (WYSIWYG)。
- 动作:
- 把第一步抓到的“裸数据”导入电脑(Python/Matlab)。
- 用代码设计滤波器(就像我们刚才做的)。
- 把滤波器作用在裸数据上,观察效果。
- 关键检查点:
- 干扰去掉了吗?
- 信号变慢了吗? (所有滤波器都会带来相位延迟,你要确认这个延迟是否会导致 T90 超标)。
- 信号过冲了吗? (有些滤波器会产生振铃效应)。
第五步:移植落地 (Deployment) —— “把 Python 变成 C”
最后一步才是写单片机代码。
- 指导思想: 资源换算。
- 逻辑: Python 里的
scipy.signal.filtfilt是双向滤波,单片机做不到(因为单片机不能预知未来数据)。 - 动作:
- 将设计好的滤波器系数 ($b, a$ 数组) 复制到 C 代码中。
- 使用标准的 IIR 滤波公式:$$y[n] = b0 x[n] + b1 x[n-1] … - a1 y[n-1] - a2 y[n-2]…$$
总结:你的实战路线图
如果你想从零开始练习,我建议你按照这个低成本路线去玩:
Level 1: 纯软件练习(现在就可以做)
- 数据来源: 自己用 Python 生成(像我们刚才那样),或者去网上下载公开的 CSV 传感器数据集(Kaggle 上有很多)。
- 任务: 故意往里加各种频率的噪声,然后练习用 FFT 把它们找出来,再设计滤波器滤掉。
- 目标: 熟悉
numpy和scipy.signal库,建立“频域直觉”**。
Level 2: 手机实战(零成本硬件)
- 数据来源: 你的手机里有加速度传感器。下载一个能导出 CSV 数据的 APP (如 “Sensor Logger”)。
- 任务:
- 把手机放在桌上(静止)。
- 把手机放在嗡嗡响的电脑机箱上(震动)。
- 手拿着手机走路(周期性摆动)。
- 分析: 把数据导出来做 FFT。你会清晰地看到“步频”、“机箱震动频率”。尝试把走路的晃动滤掉,只保留重力方向。
Level 3: 单片机实战(进阶)
- 硬件: STM32 + 一个光敏电阻(接 ADC)。
- 任务: 对着家里的 LED 灯采样(采样率设高点,比如 200Hz)。
- 分析: 哪怕你肉眼看着灯是常亮的,FFT 会告诉你,它其实在以 100Hz 闪烁(市电整流后的频率)。然后你在 STM32 里写一个陷波器,把这个 100Hz 滤平。
记住这八个字: “高频抓取,频域诊断”。这就是处理看不见的信号问题的核心心法。