Skip to content

基础滤波#

基础滤波算法用于去除信号中的噪声、平滑数据或提取特定频率成分。

线性滤波#

线性滤波通过卷积运算处理信号,输出是输入的加权和。

移动平均滤波 (Moving Average Filter)#

算法思路#

移动平均滤波将窗口内的数据点求平均,用平均值替代当前点,从而平滑高频噪声。该滤波器属于有限冲激响应 (FIR) 滤波器。窗口越大,平滑效果越强,但信号延迟也越大。

数学公式#

设输入信号为 \(x[n]\),窗口大小为 \(N\),输出为 \(y[n]\)

\[y[n] = \frac{1}{N} \sum_{i=0}^{N-1} x[n-i]\]

也可以写成卷积形式:

\[y[n] = x[n] * h[n]\]

其中离散脉冲响应为:

\[h[n] = \begin{cases} \frac{1}{N}, & 0 \le n \le N-1 \\ 0, & \text{其他} \end{cases}\]

参数说明#

参数 含义 建议范围
\(N\) 窗口大小 3~20,根据噪声强度与采样率调整
\(N\) 越大 平滑效果越强 噪声较大、信号变化慢时取大值
\(N\) 越小 响应速度越快 信号变化快、实时性要求高时取小值

限制#

  1. 相位延迟:由于是一阶因果系统,窗口越大延迟越大,群延迟约为 \(\frac{N-1}{2}\) 个采样点。
  2. 边缘效应:信号开头的 \(N-1\) 个点无法完全滤波,需要进行 Padding(如零填充、边界复制等)。
  3. 信号失真:由于对所有点一视同仁,会严重平滑掉信号中的有用尖峰或快速阶跃成分。

低通滤波 (Low-Pass Filter)#

算法思路#

一阶低通滤波(亦称指数平滑)允许低频信号通过,抑制高频噪声,属于无限冲激响应 (IIR) 滤波器。当前输出是当前输入与上一次输出的加权平均。

数学公式#

一阶低通滤波的递推形式:

\[y[n] = \alpha \cdot x[n] + (1-\alpha) \cdot y[n-1]\]

其中 \(\alpha \in (0, 1]\) 是平滑系数。它由连续一阶系统 \(\tau \frac{dy}{dt} + y = x\) 经后向差分时域离散化得到,系数关系为:

\[\alpha = \frac{\Delta t}{\tau + \Delta t}\]

其中 \(\Delta t\) 为采样周期,\(\tau\) 为系统时间常数。截止频率 \(f_c\) 的精确计算公式为:

\[f_c = \frac{\alpha}{2\pi \Delta t (1-\alpha)} \text{ Hz}\]

注意:当 \(\alpha \ll 1\) 时,可近似为 \(f_c \approx \frac{\alpha}{2\pi \Delta t}\)

参数说明#

参数 含义 建议范围
\(\alpha\) 平滑系数 0.01~0.5
\(\alpha\) 越小 截止频率越低,平滑越强 噪声严重、允许延迟时取小值
\(\alpha\) 越大 截止频率越高,响应越快 需要跟踪快速变化时取大值

限制#

  1. 相位滞后:低通滤波会带来明显的动态相位延迟。
  2. 建立时间:面对阶跃输入时,需要约 \(\frac{3}{\alpha}\) 个采样点才能达到稳定值的 95% 左右。
  3. 频带重叠无法分离:若有用信号与噪声的频带重叠,低通滤波会在去噪的同时严重削弱信号。

高通滤波 (High-Pass Filter)#

算法思路#

一阶高通滤波允许高频成分通过,抑制低频漂移和直流分量。常用于消除传感器基线漂移、趋势项或零点偏置。

数学公式#

一阶高通滤波的递推形式为:

\[y[n] = \alpha \cdot y[n-1] + \alpha \cdot (x[n] - x[n-1]) = \alpha \cdot (y[n-1] + x[n] - x[n-1])\]

其对应的 Z 传递函数为:

\[H(z) = \frac{\alpha (1 - z^{-1})}{1 - \alpha z^{-1}}\]

其中 \(\alpha = \frac{\tau}{\tau + \Delta t}\)。截止频率 \(f_c\)\(\alpha\) 的关系为:

\[f_c = \frac{1-\alpha}{2\pi \Delta t \alpha} \text{ Hz}\]

参数说明#

参数 含义 建议范围
\(\alpha\) 滤波系数 0.80~0.99
\(\alpha\) 越大 截止频率越低,保留更多低频 仅需去除极低频(如基线漂移)时取大值
\(\alpha\) 越小 截止频率越高,滤除更多低频 需要提取高频突变或完全剔除低频趋势时取小值

限制#

  1. 放大高频噪声:高通特性会导致输入信号中的高频随机噪声被进一步放大。
  2. 边界跳变敏感:在信号初始阶段或输入突变时,输出端会出现较大的暂态跳变。
  3. 数值累积误差:递推结构对浮点数精度有一定要求,极长期运行可能存在微小的数值漂移。

高斯滤波 (Gaussian Filter)#

算法思路#

高斯滤波使用高斯概率密度函数构建卷积核。相比于移动平均的均匀权重,高斯核的权重从中心向边缘呈指数衰减,能在平滑噪声的同时,更好地保留信号的中心特征与边缘轮廓。

数学公式#

一维未归一化的高斯核权重为:

\[h'[i] = \exp\left(-\frac{i^2}{2\sigma^2}\right), \quad i = -k, \dots, k\]

为了保证信号总能量不变,必须进行归一化处理:

\[h[i] = \frac{h'[i]}{\sum_{j=-k}^{k} h'[j]}\]

滤波输出为:

\[y[n] = \sum_{i=-k}^{k} x[n-i] \cdot h[i]\]

为了完整覆盖高斯分布的绝大部分能量(\(\pm 3\sigma\) 窗口),通常定义滤波核的宽度 \(N = 2k + 1\),其中 \(k = \lceil 3\sigma \rceil\)

参数说明#

参数 含义 建议范围
\(\sigma\) 高斯标准差(决定核的平滑宽度) 0.5~5.0
\(\sigma\) 越大 权重向两侧扩散,平滑效果越强 噪声分布较广时取大值
\(\sigma\) 越小 权重向中心集中,保边性越好 需保留波形细节与边缘时取小值

限制#

  1. 计算复杂度高:属于滑动窗口卷积,单点计算量为 \(O(N)\),窗口较大时比一阶 IIR 滤波器更耗时。
  2. 边缘信息模糊:若 \(\sigma\) 选取过大,波形的尖峰与突变边缘仍会被不可逆地模糊。

非线性滤波#

非线性滤波不满足线性系统的叠加原理,通常基于排序、统计等非线性映射操作。

中值滤波 (Median Filter)#

算法思路#

中值滤波在滑动窗口内对所有数据点进行排序,并输出序列的中位数。它对脉冲噪声(如椒盐噪声、离群点 Outlier) 具有极强的抑制能力,因为极端异常值在排序时会被移到序列的两端,无法影响中位数的输出。

数学公式#

设窗口大小为 \(N\)(通常为奇数 \(N = 2k + 1\)),输入信号为 \(x[n]\)

\[y[n] = \text{median}\{x[n-k], \dots, x[n], \dots, x[n+k]\}\]

参数说明#

参数 含义 建议范围
\(N\) 窗口大小 3~11(必须为奇数)
\(N\) 越大 抑制连续脉冲或大幅度离群值的能力越强 异常值密集时取大值
\(N\) 越小 信号边缘与尖峰细节保持得越好 异常值稀疏、需保留突变时取小值

限制#

  1. 单点计算复杂度:标准实现的滑动窗口单点排序复杂度为 \(O(N \log N)\),在大窗口下运行效率低于线性滤波。
  2. 真实尖峰被抹杀:若信号本身带有合理的窄脉冲(如心电信号的 QRS 波),中值滤波会将其误认为噪声并直接剔除。
  3. 引起波形阶梯化:频繁使用大窗口中值滤波会导致平滑的斜坡信号变成不连续的“阶梯”状。

参数调优指南#

通用调试对策#

滤波异常现象 可能原因 调整方向
滤波后仍有高频白噪声 截止频率过高或窗口太小 增大窗口 \(N\) / 减小低通 \(\alpha\) / 增大高斯 \(\sigma\)
滤波后信号波形延迟、滞后严重 滤波响应过慢、相位滞后大 减小窗口 \(N\) / 增大低通 \(\alpha\)
基线漂移、缓慢趋势未能除尽 高通截止频率太低 减小高通 \(\alpha\)(提升截止频率)
突发性尖峰/毛刺噪声无法消除 线性滤波对离群点钝感 引入中值滤波,并适当加大中值窗口 \(N\)
波形边缘、陡峭阶跃被严重模糊 过度平滑 减小高斯 \(\sigma\) 或缩小移动平均窗口 \(N\)

场景选型矩阵#

目标应用场景 噪声特点 推荐滤波器 选型理由
白噪声平滑 连续、高频随机噪声 移动平均滤波 结构最简单,对平稳噪声有很好的均值抑制作用。
微控制器实时去噪 内存有限、实时性要求极高 一阶低通滤波 空间复杂度 \(O(1)\),无需缓存历史数组。
保留波形特征的平滑 传统平滑容易导致峰值塌陷 高斯滤波 钟形权重分配,中心点响应高,兼顾平滑与保真。
去除工业刺针、离群点 脉冲、椒盐噪声、传感器偶发跳变 中值滤波 非线性统计特性,可 100% 免疫孤立离群点。
消除传感器零漂/基线起伏 缓慢的直流漂移或低频呼吸干扰 一阶高通滤波 有效截断低频直流成分,快速恢复动态基线。

参考实现#

具体代码仿真与对比验证见:01.basic_filters_sim.ipynb