3、噪声分析:加速度计噪声来源、频谱分析基础、信噪比(SNR)计算、噪声密度指标
好,咱们进入第三章。噪声分析这块,说实话,是很多做手环算法的朋友容易忽略的环节。我刚开始做可穿戴设备时,总觉得算法调一调就能把数据洗干净,结果发现——噪声不搞清楚,后面全是白费功夫。
3.1 加速度计的噪声来源
加速度计的噪声,说白了就是传感器输出里那些你不想要的、随机波动的成分。它不像重力加速度那样稳定,也不像走路、跑步那样有规律。它就像背景里的「沙沙声」,一直在那。
我把它分成三类:
- 热噪声(Thermal Noise):这是物理层面的。MEMS 结构里的分子热运动,会带来微小的机械抖动。温度越高,噪声越大。我在夏天做户外测试时,明显感觉数据比冬天更「毛躁」。
- 量化噪声(Quantization Noise):ADC 把模拟信号转成数字信号时,精度有限。比如 16 位 ADC,最低位跳一下,就是 1 个 LSB 的误差。这个误差没法消除,只能靠过采样来「稀释」。
- 1/f 噪声(闪烁噪声):低频段特别明显。频率越低,噪声越大。你想想看,手环静止时,按理说输出应该是一条直线,但实际看数据,它会在零点附近慢慢漂移。这就是 1/f 噪声在作怪。
3.2 频谱分析基础
为什么要做频谱分析?因为时域里你看不出噪声的「成分」。比如一段走路数据,你只知道它抖得厉害,但不知道是 1Hz 的步频噪声,还是 50Hz 的电源噪声。频谱分析就是把信号从时间域转到频率域,让你看清「哪个频率上有多少能量」。
最常用的工具是 FFT(快速傅里叶变换)。嗯,这里要注意:FFT 的结果是复数,我们通常只看它的幅值谱或功率谱。
我一般这样操作:
import numpy as np
import matplotlib.pyplot as plt
# 假设 data 是采集到的加速度数据,fs 是采样率
fs = 100.0 # 100Hz 采样
N = len(data)
freqs = np.fft.rfftfreq(N, d=1/fs)
fft_vals = np.fft.rfft(data)
amp_spectrum = np.abs(fft_vals) / N # 幅值谱
plt.plot(freqs, amp_spectrum)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值 (g)')
plt.title('加速度计频谱分析')
plt.grid(True)
plt.show()
你看,这样一画,哪个频率上有尖峰,一目了然。我曾经在项目里发现 50Hz 处有个小尖峰,排查了半天,原来是充电器开关电源的干扰。把充电器拔掉,尖峰就消失了。
3.3 信噪比(SNR)计算
信噪比,就是信号功率与噪声功率的比值。单位是 dB。公式很简单:
SNR (dB) = 10 * log10( P_signal / P_noise )
但实际计算时,有个坑——你得先分清楚「信号」和「噪声」。比如手环静止时,信号就是重力加速度(1g),噪声就是传感器输出的波动。但如果是走路时,信号是步频的加速度变化,噪声是其他所有乱七八糟的成分。
我一般这样算:
# 假设静止数据,信号是 1g
signal_power = np.mean(data)**2 # 信号功率
noise_power = np.var(data) # 噪声功率(方差)
snr_db = 10 * np.log10(signal_power / noise_power)
print(f'SNR = {snr_db:.2f} dB')
举个例子:如果静止时数据均值是 1.0g,方差是 0.0001g²,那 SNR 就是 10 * log10(1.0 / 0.0001) = 40dB。这个值越高,说明传感器质量越好。
3.4 噪声密度指标
噪声密度,是衡量传感器噪声水平的「金标准」。它表示每单位带宽内的噪声大小,单位是 μg/√Hz(微 g 每根号赫兹)。
为什么用这个单位?因为白噪声的功率是均匀分布在各个频率上的。你采样率越高,总噪声就越大。但噪声密度是归一化的,跟采样率无关,方便不同传感器之间对比。
计算方法是:
# 从功率谱密度计算噪声密度
psd = np.abs(fft_vals)**2 / (N * fs) # 功率谱密度 (g²/Hz)
noise_density = np.sqrt(np.mean(psd[10:])) # 避开低频段,取高频白噪声区
print(f'噪声密度 = {noise_density*1e6:.2f} μg/√Hz')
我习惯取 10Hz 以上的频段做平均,因为低频段有 1/f 噪声干扰,算出来的值会偏大。实际项目中,我见过好的传感器噪声密度在 100 μg/√Hz 以下,差一点的能到 300-500 μg/√Hz。
| 传感器等级 | 噪声密度 (μg/√Hz) | 典型应用 |
|---|---|---|
| 工业级 | 10 - 50 | 惯性导航、精密测量 |
| 消费级(高端) | 50 - 150 | 高端手环、运动手表 |
| 消费级(普通) | 150 - 400 | 普通手环、计步器 |
好了,噪声分析这块就聊到这儿。下一章咱们讲滤波器的设计,到时候会用到今天讲的频谱分析和噪声密度概念。记得把代码跑一跑,看看你的手环数据噪声有多大。