如何将浮点C代码转换为固定点?

sna*_*ile 13 c signal-processing fixed-point texas-instruments beagleboard

我有一个使用双打的C代码.我希望能够在DSP(TMS320)上运行代码.但DSP不支持双精度数,只支持定点数.将代码转换为定点的最佳方法是什么?是否有一个很好的C库用于定点数(实现为整数)?

sna*_*ile 12

以下代码定义了一个类型Fixed,使用整数作为其内部表示.使用+-运算符简单地执行加法和减法.使用定义的MULT宏执行乘法.

#include <stdio.h>
typedef int Fixed;

#define FRACT_BITS 16
#define FRACT_BITS_D2 8
#define FIXED_ONE (1 << FRACT_BITS)
#define INT2FIXED(x) ((x) << FRACT_BITS)
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS)
#define FIXED2DOUBLE(x) (((double)(x)) / (1 << FRACT_BITS))
#define MULT(x, y) ( ((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2) )
Run Code Online (Sandbox Code Playgroud)

我使用上面的代码来表示我的图像处理算法中的分数.它比使用双打的版本更快,结果几乎完全相同.


ASh*_*lly 8

TI提供了一个名为"IQmath"的定点库:

http://focus.ti.com/lit/sw/sprc990/sprc990.pdf

转换涉及分析当前代码 - 对于每个变量,您需要知道它可以容纳的范围,以及它需要的精度.然后您可以决定将其存储在哪个类型中.IQMath提供q30中的类型,范围为+/- 2,精度为0.0000000001到q1,范围为〜+/- 1百万,精度为0.5.

对于可能溢出变量范围的操作,您需要添加溢出检查,并决定如何处理它 - 将其固定为最大值,以不同的比例存储,引发错误等.

如果没有真正深入了解流程的数据流,实际上无法转换为固定点.


mtr*_*trw 5

大多数DSP工具链包括用于软件中浮点仿真的库.这将是缓慢的,但您应该首先使用浮点支持构建代码,然后配置文件以查看是否只需要转换为定点以获得足够性能的几个位置.当你移植到定点时,你还需要运行浮点数来提供比较,以确保你没有在过程中丢失任何东西.