一、频域滤波
频域滤波的核心思想是将时域信号转换到频域,利用信号与噪声在频率分布上的差异,通过设计滤波器削弱或滤除噪声成分。
常见算法:
- 传统滤波器:低通、高通、带通、带阻滤波器(陷波滤波器,和带通作用相反)。
- 谱减法:假设噪声为加性且平稳,利用无信号段估计噪声功率谱,在频域直接减去噪声谱。
缺点:谱减法容易引入Musical Noise,因为噪声估计存在随机波动,减法后频域会出现零散的短时孤立峰值,还原到时域听起来像高频金属音或音乐声。
解决办法:过减法、设置噪声下限或结合平滑掩码。
-
过减法
既然按"平均噪声"减不够,容易留下残留噪声峰,那就人为放大噪声估计量,进行"过度扣除"。其频域幅度更新公式通常写作:∣S^(f)∣2=∣Y(f)∣2−α⋅P^n(f)\vert{}\hat{S}(f)\vert{}^2 = \vert{}Y(f)\vert{}^2 - \alpha \cdot \hat{P}_n(f)∣S^(f)∣2=∣Y(f)∣2−α⋅P^n(f)
其中,∣Y(f)∣2\vert{}Y(f)\vert{}^2∣Y(f)∣2为带噪信号谱功率,P^n(f)\hat{P}_n(f)P^n(f)为估计的噪声平均功率,α\alphaα为过减因子 (Over-subtraction Factor),通常取 α>1\alpha > 1α>1(例如 2∼42 \sim 42∼4)。通过乘以 α\alphaα,抬高了要减去的噪声基线,能够把绝大多数高于平均值的瞬时噪声峰值彻底"盖掉"或彻底减完,极大减少了孤立峰值的出现。但如果 α\alphaα 过大,可能会误伤信号能量较弱的频段。
-
设置噪声下限
音乐噪声之所以听起来明显,不仅是因为有"孤立峰值",还因为峰值周围是绝对的静音(零值),这种极端的能量反差让耳朵对孤立峰值非常敏感。"设置噪声下限"就是给减法后的频谱设定一个最低保护阈值 β\betaβ:∣S^(f)∣2=max(∣Y(f)∣2−α⋅P^n(f), β⋅P^n(f))\vert{}\hat{S}(f)\vert{}^2 = \max \left( \vert{}Y(f)\vert{}^2 - \alpha \cdot \hat{P}_n(f), \;\; \beta \cdot \hat{P}_n(f) \right)∣S^(f)∣2=max(∣Y(f)∣2−α⋅P^n(f),β⋅P^n(f))其中,β\betaβ为噪声下限系数(Spectral Floor Factor),通常取较小的数(如 0.01∼0.050.01 \sim 0.050.01∼0.05)。即使某个频点经过过减法后变成了 0 甚至负数,算法也会强制将其恢复到 β⋅P^n(f)\beta \cdot \hat{P}_n(f)β⋅P^n(f) 的微小能量值,这相当于用一层极低且平缓的"舒适噪声(Comfort Noise)"。人耳对连续、平缓的背景底噪容忍度极高,这种做法掩盖了剩余的孤立峰值,极大地消除音乐噪声。
-
结合平滑掩码
音乐噪声在时频图(Spectrogram)上表现为时域和频域上突兀的跳变(前一帧在这个频点有峰值,后一帧突然变成 0)。平滑掩码的核心思想是利用相邻帧(时域)和相邻频点(频域)的相关性,对增益掩码(Gain Mask)做平滑滤波。基本步骤如下:
a. 计算原始增益: 根据谱减法算出一个初始频域增益 G(t,f)=∣S^(t,f)∣∣Y(t,f)∣G(t, f) = \frac{\vert{}\hat{S}(t, f)\vert{}}{\vert{}Y(t, f)\vert{}}G(t,f)=∣Y(t,f)∣∣S^(t,f)∣。
b. 时频平滑(如一阶递归滤波):Gsmooth(t,f)=λ⋅Gsmooth(t−1,f)+(1−λ)⋅G(t,f)G_{\text{smooth}}(t, f) = \lambda \cdot G_{\text{smooth}}(t-1, f) + (1 - \lambda) \cdot G(t, f)Gsmooth(t,f)=λ⋅Gsmooth(t−1,f)+(1−λ)⋅G(t,f)其中,λ\lambdaλ为时域平滑系数(例如 0.8∼0.90.8 \sim 0.90.8∼0.9)。防止增益系数在时间和频率维度上发生剧烈抖动,强行将孤立的突变峰值拉平,使其在时间和空间上连续化,从而彻底消除闪烁状的音乐噪声。如果平滑过度(λ\lambdaλ 接近 1),会导致语音或信号的前沿/后沿出现"拖尾(Blurring)",降低信号的瞬态响应能力。
- 维纳滤波:维纳滤波本质上就是在每一个频点 上算出一个 0∼10 \sim 10∼1 之间的增益系数 H(f)H(f)H(f),按比例对信号进行"打折/加权"。基于均方误差最小化(MMSE)原则,导出频域最佳传递函数:H(f)=Pss(f)Pss(f)+Pnn(f)H(f) = \frac{P_{ss}(f)}{P_{ss}(f) + P_{nn}(f)}H(f)=Pss(f)+Pnn(f)Pss(f)其中,Pss(f)P_{ss}(f)Pss(f)为信号在这个频率上的功率谱(自相关函数),Pnn(f)P_{nn}(f)Pnn(f)为噪声在这个频率上的功率,Pss(f)+Pnn(f)P_{ss}(f) + P_{nn}(f)Pss(f)+Pnn(f)是实际接收到的总信号功率。
a.信噪比极高(信号远大于噪声,Pss≫PnnP_{ss} \gg P_{nn}Pss≫Pnn):H(f)≈PssPss=1H(f) \approx \frac{P_{ss}}{P_{ss}} = 1H(f)≈PssPss=1信号很干净,直接放行。
b.信噪比极低(噪声远大于信号,Pnn≫PssP_{nn} \gg P_{ss}Pnn≫Pss):H(f)≈0Pnn=0H(f) \approx \frac{0}{P_{nn}} = 0H(f)≈Pnn0=0全是噪声,直接关掉。
c.信号和噪声一样大(Pss=PnnP_{ss} = P_{nn}Pss=Pnn):H(f)=PssPss+Pss=0.5H(f) = \frac{P_{ss}}{P_{ss} + P_{ss}} = 0.5H(f)=Pss+PssPss=0.5保留一半。按照上面这个公式算出来的 H(f)H(f)H(f),能保证过滤后的信号 s^\hat{s}s^ 与真正原始信号 sss 之间的整体误差平方和最小。但实际中我们往往无法提前精确知道原始信号的功率谱 PssP_{ss}Pss(因为信号已经被噪声污染了)。因此工程上通常用"先验信噪比估计 "(如 Decision-Directed 算法,DD算法/决策定向算法)来近似计算它。
DD算法 将"上一帧降噪后的结果"与"当前帧的观测"结合起来,先验信噪比估计如下
ξ^(k,m)=α⋅∣S^(k,m−1)∣2Pn(k,m)⏟记忆:上一帧降噪后的 SNR+(1−α)⋅max(γ(k,m)−1, 0)⏟现实:当前帧算出的 SNR\hat{\xi}(k, m) = \alpha \cdot \underbrace{\frac{\vert{}\hat{S}(k, m-1)\vert{}^2}{P_n(k, m)}}{\text{记忆:上一帧降噪后的 SNR}} + (1 - \alpha) \cdot \underbrace{\max\left( \gamma(k, m) - 1, \; 0 \right)}{\text{现实:当前帧算出的 SNR}}ξ^(k,m)=α⋅记忆:上一帧降噪后的 SNR Pn(k,m)∣S^(k,m−1)∣2+(1−α)⋅现实:当前帧算出的 SNR max(γ(k,m)−1,0)其中,α\alphaα为平滑因子/平滑系数,通常取值很高(如 0.92∼0.980.92 \sim 0.980.92∼0.98)。∣S^(k,m−1)∣2\vert{}\hat{S}(k, m-1)\vert{}^2∣S^(k,m−1)∣2为上一帧维纳滤波输出的纯信号估计功率。γ(k,m)=∣Y(k,m)∣2Pn(k,m)\gamma(k, m) = \frac{\vert{}Y(k, m)\vert{}^2}{P_n(k, m)}γ(k,m)=Pn(k,m)∣Y(k,m)∣2为后验信噪比,用当前接收到的带噪信号功率,除以估算出的噪声功率。依靠第一项可消除音乐噪声,权重高达 0.950.950.95 的第一项充分利用了时域平滑性,把噪声的随机波动强行拉平,彻底杜绝了增益的剧烈跳变。
频域滤波的计算复杂度优于时域滤波,but,频域滤波需要分帧和傅里叶变换,会引入额外的块延迟,不适合对极低延迟有硬性要求的实时系统。
二、自适应干扰抑制
当噪声或干扰的统计特性(频率、到达角等)随时间变化,或者频带与有用信号严重重叠时,固定参数的滤波器失效,需要使用自适应滤波器。自适应滤波器利用反馈 机制,根据误差信号 实时更新 滤波器的系数,使输出误差在某种准则下最小。
自适应滤波器的核心不是"怎么滤波",而是"如何根据误差不断修正自己"。 一个标准的自适应滤波系统包含以下 4 个核心要素:
- 输入信号 x(n)x(n)x(n):需要被滤波的原始输入数据。
- 滤波器系数 w(n)w(n)w(n):决定滤波器特性的权重向量(通常采用 FIR 结构的抽头延迟线)。
- 期望信号 d(n)d(n)d(n):我们希望滤波器输出达到的目标信号
- 误差信号 e(n)e(n)e(n):滤波器的实际输出 y(n) 与期望信号 d(n) 之间的差距:y(n)=wT(n)x(n)y(n)=w^T (n)x(n)y(n)=wT(n)x(n),e(n)=d(n)−y(n)e(n)=d(n)-y(n)e(n)=d(n)−y(n),自适应算法的目的,就是找到一组最优的权重 w(n)w(n)w(n),使得误差信号 e(n)e(n)e(n)的能量(均方误差 MSE)达到最小。
LMS 算法(Least Mean Squares,最小均方算法)
LMS 算法由 Widrow 和 Hoff 于 1960 年提出,是自适应滤波领域的"基石"。 它的核心思想是利用最速下降法(Steepest Descent),沿着误差梯度的反方向逐步更新滤波器的系数。传统的均方误差(MSE)定义为期望与输出误差平方的期望值:J=Ee2(n)J=Ee\^2 (n)J=Ee2(n),由于在实时计算中无法求出全局的统计期望 E⋅E⋅E⋅,LMS 算法做了一个极具智慧的简化------直接用瞬时平方误差 e2(n)e^2 (n)e2(n) 替代统计均方误差:J^(n)=e2(n)\hat{J} (n)=e^2 (n)J^(n)=e2(n)为了让误差 J^(n)\hat{J} (n)J^(n)最小,求它对权重向量 w(n)w(n)w(n)的梯度:∇J^(n)=(∂e2(n))/∂w(n)=2e(n)∂e(n)/∂w(n)=−2e(n)x(n)∇\hat{J }(n)=(∂e^2 (n))/∂w(n) =2e(n) ∂e(n)/∂w(n) =-2e(n)x(n)∇J^(n)=(∂e2(n))/∂w(n)=2e(n)∂e(n)/∂w(n)=−2e(n)x(n)按照最速下降法,新系数等于旧系数加上"负梯度方向"乘以一个步长因子:w(n+1)=w(n)−1/2μ∇J^(n)w(n+1)=w(n)-1/2 μ∇\hat{J }(n)w(n+1)=w(n)−1/2μ∇J^(n)忽略常量,即可得到 LMS 算法极其简练的核心更新公式:w(n+1)=w(n)+μ⋅e(n)⋅x(n)w(n+1)=w(n)+μ⋅e(n)⋅x(n)w(n+1)=w(n)+μ⋅e(n)⋅x(n)当误差 e(n)=0e(n)=0e(n)=0 时,权重停止更新(系统已收敛)。当误差 e(n)≠0e(n)≠0e(n)=0 时,系数调整的方向取决于输入信号 x(n)x(n)x(n)的符号,调整的幅度取决于误差的大小和步长 μμμ。步长因子 μμμ 的双刃剑效应。步长 μμμ 过大:算法收敛速度快,但容易引起系统发散或失稳。步长 μμμ 过小:系统极其稳定,但收敛速度极慢,无法跟上信号的变化。稳定条件:为了保证 LMS 算法收敛,步长必须满足0<μ<2/λmax0<μ<2/λ_{max} 0<μ<2/λmax其中 λmaxλ_{max}λmax 为输入信号自相关矩阵的最大特征值,通常工程上要求 μ<2/Tr(Rxx)μ<2/Tr(R_{xx} )μ<2/Tr(Rxx) ,即与输入信号的总功率成反比。
LMS算法的计算量小,但收敛速度较慢,对输入信号相关矩阵的条件数敏感 。
对于输入信号向量 x(n)\mathbf{x}(n)x(n),其自相关矩阵定义为 R=Ex(n)xH(n)\mathbf{R} = E\\mathbf{x}(n)\\mathbf{x}\^H(n)R=Ex(n)xH(n)。矩阵 R\mathbf{R}R 的条件数 (Condition Number) 定义为它的最大特征值与最小特征值之比(也称特征值分散度 Eigenvalue Spread)。
条件数接近 1 , 信号接近白噪声,频谱很平坦,各个频率分量的能量均匀,误差曲面的等高线是漂亮的圆。梯度方向正好指向圆心(最小值),梯度下降直接沿直线冲向谷底,收敛极快。
条件数远大于 1 (强敏感), 信号存在很强的自相关性(例如有强窄带干涉、正弦波组合或高阶 AR 信号),不同频率分量能量悬殊,误差曲面的等高线被拉伸成极其扁平的"长椭圆"(椭圆峡谷),垂直于峡谷方向斜率极大(对应 λmax\lambda_{\max}λmax),稍微动一下梯度就很大,沿着峡谷方向斜率极平缓(对应 λmin\lambda_{\min}λmin),梯度矢量几乎总是垂直于等高线,导致下降路线在两壁之间来回"Z 轴/锯齿状"剧烈震荡,而在前进方向上推进得极其缓慢。
解决方法 :
a. 归一化LMS(Normalized LMS,NLMS),用当前输入的能量对步长做归一化,动态调整 μ\muμ,缓解能量波动的影响。NLMS 算法对步长进行了动态归一化------用输入向量的能量(欧氏范数的平方)来归一化步长 μμμ。NLMS 的系数更新公式为:w(n+1)=w(n)+μ/(‖x(n)‖2+ϵ)⋅e(n)⋅x(n)w(n+1)=w(n)+μ/(‖x(n)‖^2+ϵ)⋅e(n)⋅x(n)w(n+1)=w(n)+μ/(‖x(n)‖2+ϵ)⋅e(n)⋅x(n)其中,‖x(n)‖2=xT(n)x(n)‖x(n)‖^2=x^T (n)x(n)‖x(n)‖2=xT(n)x(n)为当前输入向量的能量(即所有抽头信号的能量和)。μμμ为归一化步长因子(无量纲常数,通常取 0<μ<20<μ<20<μ<2)。ϵϵϵ为一个极小的正常数(防止输入信号为零时除以 zero 报错)。输入信号能量大时,分母变大,自动减小更新步长,防止爆音/发散;输入信号能量小时,分母变小,自动放大步长,保持快速收敛。无需先验信息:LMS 需要提前预估信号的最大特征值来设定 μμμ,而 NLMS 只要把 μμμ 设在 (0,2) 之间即可稳定工作,工程落地性更高。
b. 频域/变换域LMS,先用 DCT 或 FFT 对输入信号做预白化(把相关信号解耦),逼近对角矩阵,强制降低条件数后再做 LMS。
c. RLS
- RLS(Recursive Least Squares)。基于最小二乘法,R\mathbf{R}R 代表输入信号的相关性(把等高线拉成长椭圆的"罪魁祸首"),用 R−1\mathbf{R}^{-1}R−1 对梯度做了"预条件化",相当于在数学上把那个扁平的"长椭圆"峡谷重新变回了规则的"正圆"(消除了条件数的影响),因此收敛速度完全不受条件数限制,收敛速度极快,但计算复杂度高,且存在数值稳定性问题 。
数值稳定性问题。RLS 算法虽然收敛极快,但在有限字长(有限浮点精度,如单精度 32-bit 或定点 DSP)的硬件上运行一段时间后,经常会计算发散(崩溃)。根本原因,更新 P(n)\mathbf{P}(n)P(n)(即 R−1(n)\mathbf{R}^{-1}(n)R−1(n)) 时所使用的矩阵逆引理(Matrix Inversion Lemma / Woodbury Identity):P(n)=1λP(n−1)−P(n−1)x(n)xH(n)P(n−1)λ+xH(n)P(n−1)x(n)\mathbf{P}(n) = \frac{1}{\lambda} \left \\mathbf{P}(n-1) - \\frac{\\mathbf{P}(n-1) \\mathbf{x}(n) \\mathbf{x}\^H(n) \\mathbf{P}(n-1)}{\\lambda + \\mathbf{x}\^H(n) \\mathbf{P}(n-1) \\mathbf{x}(n)} \\rightP(n)=λ1P(n−1)−λ+xH(n)P(n−1)x(n)P(n−1)x(n)xH(n)P(n−1)理论上,自相关矩阵的逆 P(n)\mathbf{P}(n)P(n) 必须严格是埃尔米特正定矩阵(Hermitian Positive-Definite),这意味着它的所有特征值都必须是正数。但在上面的更新公式中,右边包含了减法。在计算机的有限精度舍入误差(Rounding Error)不断累积下,计算出来的 P(n)\mathbf{P}(n)P(n) 可能会失去对称性,甚至算出一个非正定矩阵(出现负特征值)。一旦 P(n)\mathbf{P}(n)P(n) 失去正定性,算法就会发生非物理的剧烈震荡,最终直接发散崩溃。此外,为了跟踪时变系统,RLS 引入了遗忘因子 λ\lambdaλ(通常为 0.98∼0.9990.98 \sim 0.9990.98∼0.999)。公式开头的 1λ\frac{1}{\lambda}λ1 相当于一个大于 1 的增益(如 10.99≈1.0101\frac{1}{0.99} \approx 1.01010.991≈1.0101)。如果在某一段时间内输入信号 x(n)\mathbf{x}(n)x(n) 持续接近于 0,减法项几乎为 0,那么 P(n)\mathbf{P}(n)P(n) 就会不停地乘以 1λ\frac{1}{\lambda}λ1,导致矩阵元素指数级膨胀爆炸。
解决方法 :
a. 平方根 RLS:不直接迭代更新 P(n)\mathbf{P}(n)P(n),而是更新 P(n)\mathbf{P}(n)P(n) 的平方根因子 P1/2(n)\mathbf{P}^{1/2}(n)P1/2(n)。计算的是平方根,P=P1/2(P1/2)H\mathbf{P} = \mathbf{P}^{1/2} (\mathbf{P}^{1/2})^HP=P1/2(P1/2)H 必定保证了矩阵的对称性与正定性,从根本上杜绝了数值发散问题,动态范围扩大了一倍。
b. 限制 P(n)\mathbf{P}(n)P(n) 的迹(Trace/Diagonal Loading):对 P(n)\mathbf{P}(n)P(n) 的对角线元素进行上下限截断,防止输入信号持续接近0时的矩阵数值无限膨胀。
硬件资源有限(如嵌入式、DSP)或环境变化较慢时选 LMS(或 NLMS/归一化 LMS);对收敛速度要求极高且计算资源充足时选 RLS。
三、脉冲压缩
脉冲压缩 (Pulse Compression) 不像传统滤波器那样直接把噪声"过滤掉",而是通过匹配滤波(Matched Filter)对信号与噪声的不同响应,实现信号能量的相干聚焦,从而大幅提升信噪比(SNR)。
-
发射端
如果直接发射一个很窄的强脉冲,虽然距离分辨率高,但受限于峰值功率限制,总能量低,容易被噪声淹没;如果发射宽脉冲,能量足够但分辨率极差。脉冲压缩的破解方法是:发射一个大时宽(TTT)、大带宽(BBB)的调制信号(最常见的是线性调频 Chirp 信号 s(t)s(t)s(t))。发射信号持续时间长(TTT 大),因而总能量高(E=P⋅TE = P \cdot TE=P⋅T),信号频率随时间变化,占据了很宽的频带(BBB 大)。
-
接收端
接收到的信号是 y(t)=s(t)+n(t)y(t) = s(t) + n(t)y(t)=s(t)+n(t)(目标回波 + 白噪声)。接收机使用一个与发射信号共轭倒置的匹配滤波器 h(t)=s∗(Tdelay−t)h(t) = s^*(T_{delay} - t)h(t)=s∗(Tdelay−t) 进行处理,本质上是计算接收信号与发射信号的互相关 。匹配滤波器会将分布在长时宽 TTT 内的所有有用信号能量,在同一个时刻(相位对齐)相干叠加(Coherent Addition),压缩成一个峰值极高、持续时间极短(≈1/B\approx 1/B≈1/B)的窄脉冲。噪声在时间上是随机无序、不相干的。通过匹配滤波器时,噪声只能进行非相干叠加,能量在时域上被均匀拉平,不会形成高峰值。信号相干叠加、噪声非相干叠加,最终使输出峰值信噪比达到最大。
-
处理增益
对于常见的等幅调频(Chirp)或正弦脉冲信号,其峰值功率是平均功率的 2 倍(即 Ppeak=2PavgP_{\text{peak}} = 2 P_{\text{avg}}Ppeak=2Pavg),加性白噪声功率谱密度为 N0N_0N0,接收带宽为 BBB,则输入噪声功率为 Pn=N0⋅BP_n = N_0 \cdot BPn=N0⋅BSNRin, peak=Ps,peakN0⋅B=2Ps,avgN0⋅B\text{SNR}{\text{in, peak}} = \frac{P{s,\text{peak}}}{N_0 \cdot B} = \frac{2 P_{s,\text{avg}}}{N_0 \cdot B}SNRin, peak=N0⋅BPs,peak=N0⋅B2Ps,avg经过匹配滤波压缩后,信号的峰值功率放大了 T⋅BT \cdot BT⋅B 倍,而输出噪声功率依然与能量成正比:SNRout, peak=2Ps,avg⋅TN0\text{SNR}{\text{out, peak}} = \frac{2 P{s,\text{avg}} \cdot T}{N_0}SNRout, peak=N02Ps,avg⋅T脉冲压缩处理增益 (GpG_pGp):Gp=SNRout, peakSNRin, peak=2Ps,avgTN02Ps,avgN0B=T⋅BG_p = \frac{\text{SNR}{\text{out, peak}}}{\text{SNR}{\text{in, peak}}} = \frac{\frac{2 P_{s,\text{avg}} T}{N_0}}{\frac{2 P_{s,\text{avg}}}{N_0 B}} = \mathbf{T \cdot B}Gp=SNRin, peakSNRout, peak=N0B2Ps,avgN02Ps,avgT=T⋅B用分贝(dB)表示,脉冲压缩带来的信噪比提升(即噪声抑制效果)为:Gp,dB≈10log10(T⋅B)G_{p,\text{dB}} \approx 10 \log_{10}(T \cdot B)Gp,dB≈10log10(T⋅B)