我有一份使用double类型的C代码,想在DSP(TMS320)上运行该代码。但是该DSP不支持double类型,只支持定点数。如何最好地将代码转换为定点数?是否有一个良好的C库可用于定点数(实现为整数)?
我有一份使用double类型的C代码,想在DSP(TMS320)上运行该代码。但是该DSP不支持double类型,只支持定点数。如何最好地将代码转换为定点数?是否有一个良好的C库可用于定点数(实现为整数)?
+
和 -
运算符进行。乘法使用定义的 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) )
我在我的图像处理算法中使用了上述代码来表示分数。它比使用双精度版本要快,而且结果几乎完全相同。
大多数DSP工具链都包含用于在软件中模拟浮点运算的库。这样做速度会很慢,但您应该最初构建带有浮点支持的代码,然后进行性能测试,看是否只需要将少数几个地方转换为定点表示以获得足够的性能。在移植到定点表示时,您还需要保留浮点运算,以便进行比较,确保在此过程中没有失去任何东西。
有一些库可以为您完成此操作。不过,您的设备的PSP应该包含某种数学库。它应该有文档说明。您可能需要重新编写一些代码,因为在使用由PSP提供的API时,进行基于原始浮点算术时使用的控制结构可能没有意义。
例如-您可能会将此转换
double arraysum = 0.0;
for (int i = 0; i < arraylen; i++)
{
arraysum += array[i];
}
到这里
psp_decimal_t arraysum;
if (0 != psp_sum_elements(&array, arraylen, &arraysum))
{
printf("error!");
}
long
),类型中隐含了移位。例如,如果小数点后有16位(_iq16
),则用底层类型中的整数65536表示定点数1.0。对于相同类型的定点数进行加减运算,可以使用标准整数运算。乘法需要额外的移位来纠正缩放。 - starblue