2. 误差来源分析

做离散系统设计,说白了就是在跟误差打交道。我干了这么多年嵌入式控制,见过太多系统跑飞、精度不够、甚至直接炸机的案例,追根溯源,十有八九都是误差没处理好。今天咱们就把这几种误差掰开揉碎了讲清楚。

核心观点:误差不可消除,但可以管理。你首先要做的,是知道它从哪来。

离散系统误差来源 建模误差 离散化误差 截断误差 模型简化 量化误差 A/D转换 字长限制 D/A转换 计算误差 舍入误差 累积误差 截断误差 采样误差 混叠 孔径抖动 采样保持

2.1 建模误差

建模误差,说白了就是你用数学公式去描述物理世界时,那个公式本身就不够准。我见过太多工程师把模型建得漂漂亮亮,结果一上硬件就崩了——为啥?因为模型里丢掉了太多真实世界的细节。

离散化误差

连续系统是微分方程,离散系统是差分方程。你把微分变成差分,这一步就引入了误差。举个例子,你用欧拉法近似导数:

连续: dx/dt = f(x, t)
离散: x[k+1] = x[k] + T * f(x[k], kT)

这个T是采样周期。T越小,近似越准,但计算量也越大。我做过一个电机控制项目,采样周期从1ms改到0.5ms,精度提升了将近一倍,但CPU负载直接飙到80%。

我的经验:选采样周期时,别光看理论值。先跑个仿真,看看不同T下的误差曲线。我习惯用T = 1/10 ~ 1/20 的系统带宽,这个范围一般够用。

截断误差

你想想看,泰勒展开只取前几项,后面的全扔了——这就是截断误差。比如你用二阶龙格-库塔法,丢掉了三阶以上的项。这些被丢掉的东西,在某些工况下会突然跳出来咬你一口。

我曾经调试一个飞行器姿态控制算法,用的是一阶欧拉法。地面测试一切正常,上天之后姿态开始抖动。查了两天才发现,是截断误差在高速机动时被放大了。换成四阶龙格-库塔,问题立刻消失。

2.2 量化误差

量化误差是数字系统的"原罪"。模拟信号是连续的,数字信号是离散的——这个从连续到离散的跳跃,必然带来信息损失。

A/D转换误差

ADC的分辨率决定了量化步长。12位ADC和16位ADC,精度差了16倍。但别以为分辨率越高越好,我见过有人用24位ADC,结果噪声比量化误差还大,白白浪费了成本。

ADC分辨率 量化步长(5V参考) 适用场景
8位 19.53 mV 开关量、粗略测量
12位 1.22 mV 工业控制、电机驱动
16位 76.29 μV 精密测量、音频
24位 0.298 μV 地震仪、科学仪器

注意:量化误差是均匀分布的,范围在 ±0.5 LSB 之间。但别以为它只是随机噪声——在低速或直流信号中,量化误差会表现为固定的偏移,很难通过滤波消除。

字长限制

处理器用多少位来表示一个数?8位、16位、32位还是64位?字长越短,能表示的数值范围越小,精度也越低。我做过一个16位定点DSP的项目,为了省成本没上浮点,结果一个积分器跑了10万步之后,累积误差直接让系统失控了。

为什么会这样?因为定点数在乘法运算后需要截断或舍入,每次运算丢一点,积少成多就出事了。

2.3 计算误差

计算误差是算法实现层面的问题。你模型建得再好,ADC选得再贵,算法实现得稀烂,照样白搭。

舍入误差

浮点数运算不是精确的。0.1在二进制里是无限循环小数,存到计算机里就是个近似值。你算一次看不出来,算一万次试试?

// 经典例子:0.1 + 0.2 不等于 0.3
float a = 0.1f;
float b = 0.2f;
float c = a + b;  // c = 0.30000001192092896

我建议你在做累加运算时,尽量用double代替float。虽然慢一点,但安全。特别是PID控制器的积分项,用float跑久了必出问题。

累积误差

这是最阴险的误差。单次运算误差很小,但经过成千上万次迭代,误差会像滚雪球一样越滚越大。我遇到过最夸张的一个案例:一个导航系统的惯导模块,跑了2小时后位置误差漂了3公里。

避坑指南:我曾经在卡尔曼滤波的协方差矩阵更新中,因为数值精度问题导致矩阵失去正定性。后来加了对称化和强制正定处理,才把问题解决。记住:数值稳定性比计算速度更重要。

2.4 采样误差

采样误差是离散系统特有的问题。你每隔T秒看一眼信号,这中间发生了什么?你完全不知道。

混叠

采样定理说采样频率要大于信号最高频率的两倍。但实际信号里总有高频噪声,如果不加抗混叠滤波器,这些高频成分会被"折叠"到低频段,变成虚假信号。

我记得有一次帮一个朋友调试音频处理系统,采样率设了44.1kHz,理论上够用。但电路板布局不好,电源噪声耦合进来一个50kHz的干扰。结果这个干扰被混叠成了5.9kHz的噪声,怎么滤波都滤不掉。最后加了个二阶低通滤波器才搞定。

孔径抖动

ADC采样不是瞬间完成的,需要一小段时间。如果这个时间不稳定,就叫孔径抖动。抖动会导致采样时刻不确定,相当于给信号加了一个随机相位调制。

在高速采集系统中,孔径抖动是主要误差源之一。我做过一个100MSPS的数据采集卡,孔径抖动只要超过1ps,信噪比就会明显下降。选ADC芯片时,一定要看它的孔径抖动指标。

总结一下:这四类误差,建模误差是"先天不足",量化误差是"数字原罪",计算误差是"后天失调",采样误差是"信息丢失"。做系统设计时,要针对每一类误差做预算,分配误差容限。别指望一个环节解决所有问题——误差管理是系统工程。


公众号:蓝海资料掘金营,微信deep3321