这些天我在做一些定点编码。
如果我有一堆来自ADC的16位样本,然后用16位滤波器系数进行乘法,结果可能是一个32位不动点数,对吗?这很好,因为我的目标是32位定点DSP。但是,如果我想再乘以16位不动点系数或者什么的话,我就会得到溢出,对吗?这是否意味着我需要做中间截断?最终,我还是会被截断,因为我需要将结果发送到一个16位DAC。
有人在MATLAB中有这样做的经验吗?
编辑我确实有定点工具箱。我不明白的是,现在如果我设置一个16位字长的数字,然后将最大乘积长度设为16,然后再乘以16位字,它会给我一个错误?如果我必须执行所有的截断来防止一个错误,那么不动点工具箱对我有什么帮助呢?我想我正在寻找一个例子,说明如何使用不动点工具箱来确保最佳的四舍五入/溢出条件,因为我的输入是16位,我有32位寄存器。
谢谢
发布于 2011-06-22 15:52:22
正如您注意到的,16位乘积会导致32位的结果.在继续,我假设你是定点表示法是16.16。
为了执行第二次乘法,您应该首先将初始mul的结果向下移16位。由于结果现在返回到所需的16.16格式,您可以继续使用第二个mul ("...if i希望再乘以16位不动点系数.“)。在第二次乘法之后,将结果向下移动16位,以恢复16.16符号。
在输出DAC值之前,我希望您需要保留不动点表示法,然后恢复为整数形式。要做到这一点,只需将值向下移动16位。在保留不动点表示法之前,可以考虑舍入结果.假设一个正的不动点数,这可以通过在最后的右移之前向结果添加0.5f来实现。( 16.16,0.5f为2^15。)
像往常一样,应该仔细研究顺序定点运算,以避免左手边溢出。可以重新排序或考虑操作以防止溢出。在网络上有许多好的教程可以帮助教程。
至于在matlab中执行定点数学,位移位函数是非常容易使用的:参考文献。当然,定点工具箱使这一切变得更加容易。
https://stackoverflow.com/questions/6441586
复制相似问题