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)
我建议你记住这个公式,面试经常考。
实际计算步骤:
- 采集一段只有噪声的信号(无激励)
- 计算噪声的均方根值(RMS)
- 采集一段有信号的波形
- 计算信号的均方根值
- 代入公式计算 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 要警惕
下节课咱们聊滤波器设计,到时候我会分享一个我踩过的坑——用错滤波器导致信号相位失真,整个系统都崩了。敬请期待。