2

这些天我正在研究一些定点编码。

如果我有一堆来自 ADC 的 16 位样本,并且我与 16 位滤波器系数相乘,结果可能是 32 位定点数,对吗?现在这很好,因为我的目标是 32 位定点 DSP。但是,如果我想将它乘以另一个 16 位定点系数或其他东西,那么我会溢出对吗?那么这是否意味着我需要进行中间截断?最终我还是会截断,因为我需要将结果发送到 16 位 DAC。

有没有人有在 MATLAB 中执行此操作的经验?

编辑我确实有定点工具箱。我不明白的是,现在如果我设置一个 16 位字长的数字,然后将最大乘积长度设置为 16,然后将它乘以另一个 16 位字,它会给我一个错误吗?如果我必须执行所有截断以防止错误,那么定点工具箱如何真正帮助我?我想我正在寻找一个示例,说明如何使用定点工具箱来确保最好的舍入/溢出条件,因为我的输入是 16 位并且我有 32 位寄存器。

谢谢

4

1 回答 1

4

正如您所指出的,16 位乘法可以产生 32 位结果。在继续,我假设你的定点符号是 16.16。

为了执行第二次乘法,您应该首先将初始 mul 的结果向下移动 16 位。由于结果现在返回到所需的 16.16 格式,您可以继续使用第二个 mul(“...如果我想将其乘以另一个 16 位定点系数...”)。在第二次乘法之后,将结果下移 16 位以恢复 16.16 表示法。

在将值发送到 DAC 之前,我希望您需要保留定点符号并恢复为整数形式。为此,只需将值向下移动 16 位。在离开定点符号之前,您可以考虑对结果进行四舍五入。假设一个正定点数,这可以通过在最终右移之前将 0.5f 添加到结果中来实现。(在 16.16 中,0.5f 是 2^15。)

与往常一样,应仔细研究顺序定点算术运算以避免溢出左侧。这些操作可以重新排序或分解以防止溢出。网上有很多很好的教程可以帮助教程

至于在 matlab 中执行定点数学,移位函数很容易使用:reference。当然,定点工具箱使这一切变得更加容易。

于 2011-06-22T15:52:22.793 回答