3、传感器模型基础:传感器数学模型、噪声模型、物理特性建模、传感器参数标定

做仿真这么多年,我越来越觉得传感器模型是整个仿真环境的基石。你想想看,模型建得不准,后面跑出来的数据全是垃圾。今天咱们就聊聊传感器建模这件事,我把自己踩过的坑和积累的经验都倒出来。

3.1 传感器数学模型

传感器的数学模型,说白了就是描述「输入-输出」关系的数学表达式。我习惯把它分成静态模型和动态模型两大类。

3.1.1 静态数学模型

静态模型不考虑时间因素,只关心稳态下的输入输出关系。最常见的表达式是:

y = f(x) + ε

其中 y 是输出,x 是输入,f 是传递函数,ε 是误差项。

实际项目中,我遇到过不少传感器,它们的静态特性可以用多项式来拟合:

y = a₀ + a₁x + a₂x² + a₃x³ + ...

这里 a₀ 是零偏,a₁ 是灵敏度(增益),高阶项代表非线性误差。嗯,这里要注意:阶数不是越高越好,过拟合会让你在标定时看起来很漂亮,一上现场就露馅。

关键参数速查表:

参数 含义 典型单位
量程 传感器可测量的输入范围 取决于物理量
灵敏度 输出变化量与输入变化量之比 mV/Pa, mV/g 等
分辨率 传感器能检测到的最小输入变化 取决于位数
线性度 实际曲线与理想直线的偏差 %FS
迟滞 正行程与反行程输出之差 %FS

3.1.2 动态数学模型

动态模型描述传感器对变化输入的响应。我常用传递函数或状态空间方程来表示。

举个例子,一个一阶温度传感器的动态响应可以写成:

τ · dy/dt + y = K · x

其中 τ 是时间常数,K 是静态增益。解这个微分方程,得到阶跃响应:

y(t) = K · (1 - e^(-t/τ))

我曾经在一个热流传感器项目中,发现仿真和实测总是对不上。查了半天,原来是时间常数 τ 随温度变化了。所以啊,动态参数不是一成不变的,建模时一定要考虑环境因素。

3.2 噪声模型

噪声是传感器绕不开的话题。我常说,没有噪声的传感器只存在于教科书中。真实世界里,噪声无处不在。

3.2.1 噪声类型

常见的传感器噪声包括:

  • 热噪声(约翰逊噪声):由电阻中电子的热运动引起,与温度成正比
  • 散粒噪声:由载流子通过势垒时的随机性引起
  • 闪烁噪声(1/f 噪声):低频段占主导,频率越低噪声越大
  • 量化噪声:ADC 转换过程中产生的误差

我的经验:在仿真中,我通常用高斯白噪声来近似热噪声和散粒噪声。但对于 MEMS 加速度计这类传感器,1/f 噪声绝对不能忽略,否则低频性能会严重偏离实际。

3.2.2 噪声建模方法

在仿真中,我习惯这样建模:

import numpy as np

def add_sensor_noise(signal, noise_density=1e-6, bandwidth=100):
    """
    给传感器信号添加噪声
    noise_density: 噪声密度 (V/√Hz)
    bandwidth: 系统带宽 (Hz)
    """
    std = noise_density * np.sqrt(bandwidth)
    noise = np.random.normal(0, std, len(signal))
    return signal + noise

你可能会问:「为什么噪声密度要乘以根号带宽?」其实很简单,噪声功率是密度在带宽上的积分,所以 RMS 值就是密度乘以根号带宽。这个细节我当年也是吃了亏才记住的。

3.3 物理特性建模

物理特性建模,就是把传感器的真实物理行为映射到仿真模型中。这部分最考验功力,因为物理世界远比数学公式复杂。

3.3.1 温度效应

温度对传感器的影响是全方位的。我见过一个压力传感器,25°C 时精度 0.1%,到了 85°C 直接漂到 1%。

温度模型通常包括:

  • 零点温漂:零输入时输出随温度的变化
  • 灵敏度温漂:增益随温度的变化
  • 迟滞温漂:迟滞特性随温度的变化

一个实用的温度补偿模型:

y_comp = (y_raw - z(T)) / S(T)

其中:
z(T) = z₀ + α₁(T - T₀) + α₂(T - T₀)²
S(T) = S₀ · [1 + β₁(T - T₀) + β₂(T - T₀)²]

3.3.2 非线性与交叉灵敏度

很多传感器不仅对目标物理量敏感,还会受到其他物理量的影响。比如加速度计对温度敏感,压力传感器对振动敏感。

我做过一个六轴 IMU 的项目,发现加速度计的输出里混入了角速度信息。这就是交叉灵敏度,建模时必须考虑:

a_x_meas = a_x_true + c_xy · ω_y + c_xz · ω_z + n_x

其中 c_xy 和 c_xz 就是交叉耦合系数。

注意:交叉灵敏度往往是传感器封装和工艺导致的,不同批次的产品可能差异很大。我建议在建模时保留这些系数作为可调参数,方便后续标定。

3.4 传感器参数标定

标定,就是把模型参数和真实传感器对上号。这一步做不好,前面建的模型全是空中楼阁。

3.4.1 标定流程

我一般按这个流程走:

  1. 数据采集:在已知输入下记录传感器输出
  2. 预处理:去噪、剔除异常值
  3. 模型拟合:用最小二乘法或更鲁棒的方法拟合参数
  4. 验证:用独立数据集检验标定效果
  5. 迭代:如果验证结果不理想,回到第一步

3.4.2 最小二乘标定

对于线性模型 y = a₀ + a₁x,标定就是求 a₀ 和 a₁:

import numpy as np

def calibrate_linear(x_meas, x_true):
    """
    线性标定
    x_meas: 传感器测量值
    x_true: 真实值(参考标准)
    """
    A = np.vstack([np.ones_like(x_meas), x_meas]).T
    a0, a1 = np.linalg.lstsq(A, x_true, rcond=None)[0]
    return a0, a1

避坑指南:我曾经用最小二乘法标定一个压力传感器,结果在量程两端误差很大。后来改用加权最小二乘,给两端数据更高的权重,效果就好多了。所以标定方法要因地制宜,别死板套公式。

3.4.3 多参数标定

对于包含温度补偿的模型,标定就复杂多了。需要在不同温度点下采集数据,然后联合求解所有参数。

我常用的方法是分步标定:

  • 第一步:在恒温条件下标定静态参数(零偏、灵敏度、非线性系数)
  • 第二步:改变温度,标定温漂系数
  • 第三步:验证交叉灵敏度,必要时增加交叉耦合项

这样做的好处是每一步的物理意义明确,出了问题容易定位。

3.5 知识体系总览

下面这张图是我自己整理的传感器模型知识框架,你可以对照着梳理思路:

传感器模型知识体系 传感器模型基础 数学模型 静态模型:y = f(x) + ε 动态模型:传递函数 状态空间方程 噪声模型 热噪声 / 散粒噪声 1/f 闪烁噪声 量化噪声 物理特性 温度效应 非线性特性 交叉灵敏度 参数标定 最小二乘法 分步标定策略 验证与迭代 模型精度 = 数学描述 × 噪声刻画 × 物理保真 × 标定准确 四个模块相互关联,缺一不可 标定结果反过来修正数学模型和物理特性参数

这张图把传感器模型拆成了四个模块。你仔细看,它们之间是相互关联的。标定结果会反过来修正数学模型和物理特性参数,形成一个闭环。我在实际项目中就是按这个框架来搭建仿真环境的,效果还不错。

好了,传感器模型基础就聊到这儿。记住一句话:模型是仿真的灵魂,参数是模型的血肉。把这两样搞扎实了,后面的仿真工作才能站得住脚。

本章要点回顾:

  • 数学模型分静态和动态,静态关注输入输出关系,动态关注时间响应
  • 噪声模型要区分热噪声、1/f 噪声和量化噪声,不同场景侧重点不同
  • 物理特性建模要考虑温度效应、非线性和交叉灵敏度
  • 参数标定是连接模型和现实的桥梁,分步标定更实用

可可精品资料库