在主动降噪、声音检测、语音信号处理等领域,脉冲噪声对系统构建和算法设计都有着特别大的影响,本文章主要总结一下目前主流的脉冲噪声检测方法,为后续主动降噪学习做一些准备工作。
1. 归一化功率序列的脉冲噪声检测
与正常信号相比,脉冲尖峰具有明显更大的幅度值。因此,可以利用一定时间长度的信号功率来检测脉冲噪声。
首先,数字化信号可以分为多个帧,每个帧包含特定时间段的几个样本。因此第 k 帧的功率计算如下公式(1):
然后,我们按块计算归一化功率,每个块的长度为 L,如下公式(2):
接着计算一个块内归一化功率的方差 pv,如下公式(3)所示:
最后结合设定的阈值判断是否有脉冲噪声。
公式(1)详解:
第一步主要进行分帧,把长信号分成一小段一小段的。
N:每一帧里包含的“采样点”数量。采样点是数字信号的最小单位,就像电影是一帧一帧画面拼起来的,数字信号是一个一个数值点拼起来的,一帧里有 N 个点。
k:第 k 帧,也就是第几个小段,k=0 是第一帧,k=1 是第二帧,以此类推。
x(i+kN):第 k 帧里第 i 个采样点的数值,可以理解成“第 k 个小段里,第 i 个位置的信号大小”。
第二步算每一帧的功率,把这一帧里每个采样点的数值先平方,再全部加起来,得到的结果 p(k) 就是第 k 帧的功率。
公式(2)详解:
第一步先做分块,把好多帧打包成一个大组,我们把 L 个帧(也就是 L 个小段)拼成一个更大的组,叫一个块。
- j:第 j 个块,也就是第几个大组;
- pw(j,k):第 j 个块里第 k 帧的功率(就是第一步算出来的 p(k),只是归到了第 j 个块里)。
第二步进行归一化。归一化就是:把这个块里所有帧的功率,统一换算到 0 到 1 之间的数值。举个例子:离麦克风近的信号整体音量就大,离得远的整体音量小,直接比功率不公平。归一化之后,我们只看这个块里,每一帧能量的相对高低,不受整体音量大小的影响。
公式是怎么算的?
- 分子:当前这一帧的功率,减去这个块里最小的功率值;
- 分母:这个块里功率的总范围 = 这个块里最大的功率值 - 最小的功率值。
- 算出来的 pn(j,k),就是归一化之后的功率:按比例落在 0~1 之间。
公式(3)详解:该公式就是标准的无偏样本方差离散公式。
2. 条件中值滤波器检测脉冲噪声
首先讲解一下中值滤波器,中值滤波器广泛用于消除图像和音频文件中包含的脉冲噪声。中值滤波器的输出是有序输入序列的中值,如下公式所示:
中值滤波器消除脉冲噪声的原理就是:对极端异常值完全不敏感。
举个最直观的例子:一个窗口里的 5 个信号点是:[2.1, 2.3, 100, 2.2, 2.4],其中第三个点 100 是脉冲噪声尖峰。
- 从小到大排序后:
[2.1, 2.2, 2.3, 2.4, 100] - 中位数是正中间的
2.3
条件中值检测脉冲噪声是怎么实现的呢?
完整的检测流程分 3 步:
- 滑动窗口取数:窗口从信号开头往后滑动,每次移动 1 个采样点,每次取窗口内的 L 个连续信号点。
- 计算窗口中值:对窗口内的数排序取中位数 mf(k),作为正常信号的参考值。
- 条件判断(检测噪声):设定一个噪声阈值 Th,计算当前点原始值和中值的差值绝对值,做判断:
3. 信号相关的阶序均值算法检测脉冲噪声
SD-ROM 全称是信号依赖型排序均值算法(Signal-Dependent Rank-Order Mean),它是普通中值滤波 / 条件中值滤波的改进版。
前面讲的中值滤波方法,遇到持续时间长、密度高的强脉冲噪声时,窗口里的噪声点会变多,计算量会大幅上升,检测准确率也会下降。SD-ROM 最早是用来给图片去除脉冲噪声(比如照片的椒盐噪点)的,这里改成了 1 维信号版本,用固定的 5 点滑动窗口,计算量小,对高密度脉冲噪声的检测效果比普通中值法更好。
它的核心思路:不直接拿当前点和中位数比大小,而是先把窗口里的数按大小排序,根据信号的局部分布自动选择差值的计算方式,通过排序后的差值大小判断中间的点是不是异常脉冲。
具体的实现过程如下:
步骤 1:取 5 点滑动窗口
窗口每次取连续的 5 个信号点,记为 X1, X2, X3, X4, X5,其中 X3 是窗口正中间的点,也就是我们当前要检测的目标点。窗口每次向后滑动 1 个位置,下一个窗口就变成 X2, X3, X4, X5, X6,继续检测新的中间点 X4,以此类推滑完整个信号。
步骤 2:排序得到
把这 5 个数从小到大排序,得到排序后的序列 r1, r2, r3, r4, r5。
步骤 3:计算排序差值 di
步骤四:脉冲噪声检测
如果满足以下两个条件中的任何一个,则算法检测到脉冲噪声X3