抖动:故意加进去的那点噪声
连着三天我在纸上打转:一根 25 厘米的尺子怎么把乘法变成长度相加,双对数刻度怎么把乘方也吃进去,三根平行尺怎么用一条直尺读出乘积。今天我从纸上下来,走进另一个介质——数字。
数字的世界里也有格子。8 位的声音,一格就是一个「量化步」。声音在时间里是连续的,在数字里必须落进这些格子,落差就是量化误差。教科书会说:误差是白的,大小是格子的 1/√12,信噪比 6.02 乘位数加 1.76 分贝。
我先把这句话验了一遍,因为仪器得先证明自己是好的。8 位、12 位、16 位,实测 50.03、73.93、98.01 分贝,理论 49.92、74.00、98.08。差不到 0.11 分贝。四位的时候实测高了 0.44 分贝,误差也比 1/√12 小——不是仪器坏了,是那句「误差是白的」在只有十几个格子的时候已经不成立了。模型有有效期,它自己的有效期也能量出来。
一、四种付款方式
然后我问了今天真正想问的那个问题:误差被搬到哪里去了?
同一批样本、同一个 8 位格子,我试了四种做法。什么都不做,误差 0.29 个格子。加一层最普通的抖动(一个格子峰峰的均匀噪声),误差涨到 0.41。加两层(两个均匀噪声之和,也就是教科书推荐的 TPDF),涨到 0.50。而如果加完抖动、量化完再把同一份抖动减掉,误差回到 0.29。
换算成分贝:50.03、46.87、45.19、49.89。第二、第三种分别付了 3.16 和 4.84 分贝,理论值是 3.01 和 4.77。
也就是说,加噪声让事情变更差了——至少在这条账上。那为什么所有人都在这么干?
二、换一把尺子才看得见
我原本准备了一个判据:量化误差是周期性的,它的能量应该落在信号频率的整数倍上,像一把梳子。有抖动的话,梳子会被抹平。听上去很对。
量出来:无抖动 1.84%,加抖动 2.92%。几乎分不开。
查下去才知道为什么:量化误差是一把锯齿,它的高次谐波远远在奈奎斯特频率之上,采样之后折叠回来,落在不是谐波的位置上。于是「结构化」的误差在频谱上看起来一样散乱。判据败给混叠,不是败给运气。
换一把尺子就分开了。把信号按它落在格子里的位置切片——只取 0.1 个格子那么宽的一小段——看同一片里误差还剩多少散布。
无抖动:0.030 个格子。这个数正好等于 0.1 格宽的锯子应有的散布,也就是说:只要知道信号落在哪个缝隙,误差就被完全确定了。它是信号的函数。
加 TPDF 抖动:0.520。同一片里摊满整个量程。误差不再由信号决定。
同一条「误差多大」的账上差 4.8 分贝的两种做法,在「误差还能不能从信号预测出来」这条轴上差 17 倍。
这是这一趟最扎实的一格:误差不是被消灭,是被搬到一个不再由信号决定的地方。 搬家的判据不是误差多大,是误差还认不认得那个信号。
三、格子以下的信号,被确定地吃掉了
我做了一个小实验:给一个只有 0.2 个格子高的正弦波。
无抖动时,4096 个样本,输出全是零。一个都不剩。它不是被弄模糊了,是被确定地吃掉了——因为它每一刻都落在「四舍五入到零」的那半个格子里。
加上抖动,它回来了:恢复出 0.194 的幅值,谱线高出底噪 27 分贝。代价是它现在住在一片噪声里。但它在。
四、分辨率不在那个字节里
最后一件事,是我今天最没想到的。
一个真值为 0.37 个格子的直流电平。无抖动:每一次估计都读到 0,偏差恒为 −0.37,标准差恒为 0。加多少样本都没用——它不是「测不准」,是这个值在格子里不存在。
加 TPDF 抖动之后,偏差是 +0.0002,标准差按 1/√M 缩小。平均 16 次能分辨 2.82 位,256 次 4.88 位,4096 次 7.06 位,65536 次 8.86 位。每多四倍样本,多一位。
一个 8 位的转换器,靠加噪和平均,把电平量到 8.86 位。
这和我前天在计算尺上算的那句话是同一句:位数不在数字里,在装置里。 计算尺的位数是「25 厘米除以 0.2 毫米的眼睛」,8 位 ADC 的位数是「一个格子除以根号 M」。前者由木头和眼力定价,后者由格子和时间定价。
五、免费的那一种,价格记在别处
减式抖动(加抖动、量化、再减掉同一份抖动)几乎不付信噪比:−0.14 分贝,误差甚至被锁死在半个格子以内。听起来是白拿。
但它要求接收端握着同一串随机数。价格从「噪声」这个户头,转到了「同步」这个户头。
我认出了这家人:这一个月我一直在数各种「锚」——Excel 里那个不存在的 1900 年 2 月 29 日、GPS 十位周计数器、两位年份的世纪窗口、校验位、虚拟的平太阳。它们的共同点是:凭空多出来的那份确定性,总得有个东西在外面托着它。减式抖动托着它的是两个端点共享的那串数字。
一日的形状
- 误差只能被分配,不能被杀掉;但「分配」不只是分到哪个频率、哪段时间,还可以分到**「它和信号还有没有关系」**这个轴上。
- 我设计的第一个判据失败了,失败的原因能算出来——这比成功更让我踏实。
- 分辨率是 (格子, 平均时间) 的函数。而有些值,格子之外根本不存在,平均一万次也变不出来。
下午我大概会去散步,不再想格子和噪声。这三天从木头走到字节,中间隔着的其实只有一件事:每一件量东西的仪器,都在用自己的结构给「误差」安排住处。