跳转到内容

模拟与数字转换/固定字长效应

来自维基教科书,开放书籍,开放世界

实际字长

[编辑 | 编辑源代码]

众所周知,计算机系统通常是 16 位、32 位或 64 位。这意味着这些计算机可以轻松处理这些长度的数据。然而,较小的硬件和嵌入式计算机可以具有 4 位或 8 位的字长!如果我们有一个分辨率为 12 位的转换器,并将它连接到嵌入式控制器的 8 位输入总线,那么我们就会遇到一个严重的问题!我们的信号的全部 4 位必须被截断。

此外,转换器通常是预先包装的,具有固定数量的不可协商的分辨率位。这意味着如果你需要一个分辨率为 13 位的转换器,你将不得不使用一个只有 12 位的转换器,或者一个 16 位的转换器!

以下列出了几种常见的 ADC 转换器分辨率长度。

  • 4
  • 8
  • 12
  • 16
  • 24
  • 32

假设我们有一个 12 位转换器,我们需要将数据输出到一个 8 位总线。我们可以忽略底部的 4 位,或者顶部的 4 位,或者我们可以忽略两者的一些组合。如果我们忽略来自字底部的位,我们实际上是在向下舍入信号,并且信号将缺乏细节。

舍入误差是指在计算中使用的数字近似值与其精确(正确)值之间的差异。在某些类型的计算中,舍入误差可能会被放大,因为任何初始误差都将被传递到一个或多个中间步骤中。

温哥华证券交易所(McCullough 和 Vinod 1999)设计的一个短暂的指数提供了舍入误差的一个极端的例子。该指数在 1982 年成立时被赋予了 1000.000 的值。在经历了 22 个月的重新计算指数并在每次市场价值变化时将其截断到小数点后三位后,该指数变成了 524.881,尽管其“真实”值应该是 1009.811。

还可能发生其他类型的舍入误差。一个臭名昭著的例子是 1996 年 6 月 4 日发射的阿丽亚娜火箭的命运(欧洲航天局 1996)。在飞行第 37 秒时,惯性参考系统试图将一个 64 位浮点数转换为一个 16 位数,但反而触发了一个溢出错误,该错误被制导系统解释为飞行数据,导致火箭偏离航线并被摧毁。

海湾战争期间使用的爱国者导弹防御系统也因舍入误差而失效(Skeel 1992,美国政府问责局 1992)。该系统使用一个整型定时器寄存器,该寄存器以 0.1 秒的间隔递增。但是,整数通过乘以 0.1 的二进制近似值 0.00011001100110011001100_2=(209715)/(2097152) 转换为十进制数。

因此,在 100 小时(3.6×10^6 个滴答)之后,积累了 (1/(10)-(209715)/(2097152))(3600·100·10)=(5625)/(16384) 大约 0.3433 秒的误差。

这种差异导致爱国者系统不断地自我循环,而不是正确地瞄准目标。结果,一枚伊拉克飞毛腿导弹没有被瞄准,被允许在军营中爆炸,造成 28 人死亡。

简单地忽略字的两端的一些位被称为截断,但是当我们从字的 LSB 侧截断位时,我们将这种操作称为“舍入”。当我们从机器字的顶部截断位时,我们可能会丢失大量数据。例如,如果我们有位模式 101001,并且我们截断两个 MSB 位,我们就会得到位模式 1001。让我们将它转换为十进制。

  • 101001(二进制)= 41(十进制)
  • 1001(二进制)= 9(十进制)

9 和 41 之间存在很大差异。正如我们所看到的,我们所有最高的值看起来都是低值,输出将毫无意义。另一种选择称为饱和。饱和类似于舍入,除了我们向上舍入。我们截断顶部的位,如果它们不为零,那么我们将数字的其余部分向上舍入到最大值。例如,如果我们有与上面相同的位模式(101001),并且我们截断两个 MSB 位,然后我们进行饱和,我们将得到值 1111。现在,我们可以将此值定义为溢出条件,并且不会累积不必要的误差。

频谱效应

[编辑 | 编辑源代码]
华夏公益教科书