3、信号与噪声模型:加性噪声模型、乘性噪声模型、信噪比(SNR)计算

各位同学,咱们今天聊聊噪声模型。说实话,搞传感器数据处理这么多年,我最大的体会就是——噪声这东西,你躲不掉,但可以摸透它。

我记得刚入行那会儿,在一个振动监测项目里,传感器采集到的信号总是忽大忽小。我折腾了三天,换了三款滤波器,结果发现——噪声的模型都没搞对。你说这能有好结果吗?

所以今天咱们把噪声模型这件事彻底讲清楚。你想想看,只有知道敌人长什么样,才能精准打击,对吧?

3.1 加性噪声模型

加性噪声,说白了就是「叠加」上去的噪声。它跟原始信号没关系,独立存在。

数学上很简单:

y(t) = x(t) + n(t)

其中 y(t) 是观测信号,x(t) 是真实信号,n(t) 是噪声。

我做过一个温度传感器项目,环境中的热噪声就是典型的加性噪声。无论你测的是 20°C 还是 100°C,那个噪声的幅度基本不变。嗯,这就是加性噪声的特点——与信号无关。

加性噪声的典型来源:

  • 热噪声(Johnson-Nyquist 噪声)
  • 散粒噪声(Shot noise)
  • 量化噪声(ADC 量化误差)
  • 环境电磁干扰

处理加性噪声,我个人习惯用均值滤波或者低通滤波。为什么?因为加性噪声的均值通常为零,多采几次平均一下,噪声就自己抵消了。

实战小技巧: 我在一个工业现场项目中,发现加性噪声的频率往往高于信号频率。这时候用截止频率合适的低通滤波器,效果立竿见影。但要注意——别把信号的高频成分也滤掉了。

3.2 乘性噪声模型

乘性噪声就有点意思了。它跟信号「相乘」,信号越大,噪声越大。

数学表达式:

y(t) = x(t) · (1 + m(t))

或者更一般的形式:

y(t) = x(t) · n(t)

为什么会这样?你想想看,有些传感器的灵敏度会随着环境变化而波动。比如光电传感器,光源老化会导致输出信号整体衰减,但噪声也跟着衰减——这就是乘性噪声。

我曾经做过一个超声波测距项目,温度变化导致声速变化,回波信号的幅度也跟着变。信号强的时候噪声也强,信号弱的时候噪声也弱。这就是典型的乘性噪声。

注意! 乘性噪声比加性噪声难处理得多。你不能简单地用均值滤波,因为噪声跟信号耦合在一起。我建议先做对数变换,把乘性噪声变成加性噪声,再用常规方法处理。

对数变换的原理:

log(y(t)) = log(x(t)) + log(n(t))

你看,乘性变成了加性,是不是清爽多了?

3.3 信噪比(SNR)计算

信噪比,这是衡量信号质量的核心指标。说白了就是「信号有多强」除以「噪声有多强」。

定义式:

SNR = P_signal / P_noise

其中 P_signal 是信号功率,P_noise 是噪声功率。

工程上更常用的是 dB 单位:

SNR(dB) = 10 · log10(P_signal / P_noise)

如果是电压信号,功率跟电压平方成正比:

SNR(dB) = 20 · log10(V_signal / V_noise)

我建议你记住这个公式,面试经常考。

实际计算步骤:

  1. 采集一段只有噪声的信号(无激励)
  2. 计算噪声的均方根值(RMS)
  3. 采集一段有信号的波形
  4. 计算信号的均方根值
  5. 代入公式计算 SNR

来看一个实际代码示例:

import numpy as np

# 模拟信号
fs = 1000  # 采样率 1kHz
t = np.arange(0, 1, 1/fs)
signal = 2.0 * np.sin(2 * np.pi * 50 * t)  # 50Hz 正弦波

# 加性噪声
noise = 0.5 * np.random.randn(len(t))

# 观测信号
y = signal + noise

# 计算 SNR
P_signal = np.mean(signal**2)
P_noise = np.mean(noise**2)
SNR_linear = P_signal / P_noise
SNR_dB = 10 * np.log10(SNR_linear)

print(f"信号功率: {P_signal:.4f}")
print(f"噪声功率: {P_noise:.4f}")
print(f"SNR (线性): {SNR_linear:.2f}")
print(f"SNR (dB): {SNR_dB:.2f} dB")

输出结果:

信号功率: 2.0000
噪声功率: 0.2512
SNR (线性): 7.96
SNR (dB): 9.01 dB

你看,9dB 的信噪比,意味着信号功率是噪声功率的 8 倍左右。这个水平在传感器应用中算中等偏上。

我的经验: 实际项目中,SNR 低于 10dB 就要小心了。我曾经在一个振动监测项目中,SNR 只有 6dB,结果特征提取完全失败。后来换了更高精度的传感器,SNR 提升到 15dB,问题迎刃而解。

3.4 两种噪声模型的对比

特性 加性噪声 乘性噪声
与信号关系 独立 与信号幅度成正比
数学形式 y = x + n y = x · n
典型来源 热噪声、量化噪声 传感器灵敏度漂移、信道衰落
处理方法 均值滤波、低通滤波 对数变换、自适应滤波
对 SNR 的影响 低信号时 SNR 差 高信号时噪声也大

嗯,这里要注意——实际传感器中,两种噪声往往同时存在。比如一个 MEMS 加速度计,既有热噪声(加性),又有温度漂移导致的灵敏度变化(乘性)。

我建议的处理策略是:先做对数变换处理乘性噪声,再用滤波处理加性噪声。顺序别搞反了,否则效果会打折扣。

避坑指南: 我曾经在一个项目中,先做了低通滤波,然后才做对数变换。结果乘性噪声的低频成分被滤掉了,对数变换后反而引入了新的畸变。正确的顺序应该是:先对数变换,再滤波。

最后总结一下今天的内容:

  • 加性噪声:独立叠加,用滤波搞定
  • 乘性噪声:与信号耦合,用对数变换
  • SNR:量化信号质量,低于 10dB 要警惕

下节课咱们聊滤波器设计,到时候我会分享一个我踩过的坑——用错滤波器导致信号相位失真,整个系统都崩了。敬请期待。