这些天我正在进行一些定点编码。
如果我有一堆来自ADC的16位采样,并且我使用16位滤波器系数进行乘法,那么结果可能是32位定点数吗?现在这很好,因为我的目标是32位定点DSP。但是,如果我想用另一个16位定点系数或其他东西乘以那么我会溢出吗?那么这是否意味着我需要进行中间截断?最终我会截断,因为我需要将结果发送到16位DAC。
有没有人有在MATLAB中这样做的经验?
编辑我有固定点工具箱。我现在不明白的是,如果我设置一个16位字长的数字,然后将最大乘积长度设置为16,然后再乘以另一个16位字,它会给我一个错误?如果我必须执行所有截断以防止错误,固定点工具箱如何真正帮助我?我想我正在寻找一个关于如何使用定点工具箱来确保最佳舍入/溢出条件的示例,因为我的输入是16位且我有32位寄存器。
由于
答案 0 :(得分:4)
如您所述,16位乘法可以产生32位结果。继续,我假设你的定点符号是16.16。
为了执行第二次乘法,首先应将初始mul的结果向下移16位。由于结果现在又回到了所需的16.16格式,你可以继续第二个mul(“......如果我想将它乘以另一个16位定点系数......”)。在第二次乘法之后,将结果向下移16位以恢复16.16表示法。
在将值输出DAC之前,我希望您需要保留定点表示法并恢复为整数形式。为此,只需将值向下移16位。在离开定点表示法之前,您可以考虑舍入结果。假设定点数为正数,可以通过在最终右移之前将结果加0.5f来实现。 (在16.16中,0.5f是2 ^ 15。)
与往常一样,应密切研究顺序定点算术运算,以避免左侧溢出。可以重新排序或考虑操作以防止溢出。网上有很多很好的教程可以帮助tutorial。
至于在matlab中执行定点数学运算,bitshift函数很容易使用:reference。当然,定点工具箱使这一切变得更加容易。