接下来的小节比较查找表的实现使用断点的间距不均匀,甚至和电力两种。比较关注:
命令的执行速度
舍入误差在插值
只读存储器(ROM)的数据量
罗为命令的数量
这种比较是有效的只有当断点并不是可调。如果断点可调在生成的代码中,所有三个案例中产生相同的代码。总结的断点间距的影响执行速度,错误,和内存使用,请参阅总结断点间距的影响。
这个比较使用模型fxpdemo_approx_sin
。三个定点查找表出现在这个模型。这三个表近似函数罪(2 *π* u)
在第一象限,实现不到的最糟糕的错误2 ^ 8
。然而,他们有不同的限制他们的断点间距。
您可以使用模型fxpdemo_approx
,这fxpdemo_approx_sin
打开时,产生金宝app®编码器™代码(金宝app仿真软件编码器软件许可证要求)。接下来的小节展示几段生成的代码来强调重要的差异。
打开模型,在MATLAB类型®提示:
fxpdemo_approx_sin
本节看着罗所需的数据的三个间距选项。
不均匀间距需要Y数据点和断点:
int16_T yuneven [8];uint16_T xuneven [8];
使用的总字节数是32。
甚至只需要间隔Y数据点:
int16_T yeven [10];
使用的总字节数是20。断点没有明确要求。代码使用断点之间的间距,可以用最小的和最大的断点。最多三个值相关断点是必要的。
两个间隔的力量只需要Y数据点:
int16_T ypow2 [17];
使用的总字节数是34。断点没有明确要求。代码使用断点之间的间距,可以用最小的和最大的断点。最多三个值相关断点是必要的。
在所有三个案例中,你必须防范机会输入大于或小于最小断点最大的断点。可以有差异出现的这些可能性是如何处理的。然而,一般小的差异,通常不是一个关键的因素在决定使用一个间距的方法。后续部分假设超出范围的输入是不可能或已经处理。
本节描述了三个定点查找表确定当前的输入是相对于断点。
不均匀间隔的断点需要一个通用的算法如二叉搜索来确定输入所在的断点。下面的代码提供了一个示例:
iLeft = 0;iRght = 7;/ *数量的断点时- 1 * / ((iRght - iLeft) > 1) {i = (iLeft + iRght) > > 1;如果(uAngle < xuneven[我]){iRght =我;其他}{iLeft =我;}}
while循环执行log2 (N)倍,其中N是断点的数量。
等间距的断点只需要一个步骤来确定输入所在的断点:
iLeft = uAngle / 455 u;
的因子455 u
代表断点之间的间距。一般来说,股息(uAngle - SmallestBreakPoint)
。在这个例子中,最小的断点是零,因此代码优化的减法。
两个间隔的断点的只需要一个步骤来确定输入所在的断点:
iLeft = uAngle > > 8;
变化的数量是8,因为断点间距2 ^ 8
。最小的断点是零,所以uAngle
取代了一般情况下的(uAngle - SmallestBreakPoint)
。
确定输入所在的断点、不均匀间隔的情况下需要更多的代码比另两种情况。这段代码需要额外的命令罗。如果多的查找表共享二进制搜索算法的一个函数,可以减少这个ROM点球。即使代码共享,所需要的时钟周期数确定的输入是更高的位置不均匀间隔的情况下比其他两种情况。如果代码是共享的,函数调用的开销降低了执行速度一点。
等间距的情况下,两个间隔的情况下,您可以确定的位置输入一行代码。等间距的情况下使用一般整数的除法。两个案例使用的力量转移,而不是一般的部门,因为除数是2的幂。不知道具体的处理器,你不能肯定比部门转变。
许多处理器可以实现部门用一个汇编语言指令,所以代码会很小。然而,这个指令通常需要许多时钟周期完成。许多处理器不提供一个部门指令。部门在这些处理器通过减少重复发生。这个过程是缓慢的,需要耗费大量的机器代码,但是这些代码可以共享。
大多数处理器提供一种方法来做逻辑和算术左右变化。一个关键的区别是是否一条指令的处理器可以做N转变(桶转移)或者要求N指令转变一点。桶的转变需要更少的代码。桶是否转变也增加速度取决于硬件支持的操作。金宝app
编译器也比较复杂。在前面的例子中,命令uAngle > > 8
本质上以一个16位字上面的8位。编译器可以检测到这种情况下和替换位转移的指令直接把位。如果变化的数量是其他价值,如7,这种优化不会发生。
从理论上讲,你可以用下面的代码计算插值:
y = (yData [iRght]——yData [iLeft]) * (u - xData [iLeft])……/ (xData [iRght]——xData [iLeft]) + yData [iLeft]
这个词(xData [iRght]——xData [iLeft])
之间的间距是邻近的断点。如果这个值是常数,由于甚至间距,一些简化是可能的。如果间距不仅仅是2的幂,重要的简化是定点实现的可能。
对于不均匀的情况,一个可能的实现理想的插值的不动点是:
xNum = uAngle - xuneven [iLeft];xDen = xuneven [iRght]——xuneven [iLeft];yDiff = yuneven [iRght]——yuneven [iLeft];MUL_S32_S16_U16 (bigProd yDiff xNum);DIV_NZP_S16_S32_U16_FLOOR (yDiff bigProd xDen);yUneven = yUneven [iLeft] + yDiff;
乘法和除法的例程是这里没有显示。这些例程可以复杂,取决于目标处理器。例如,这些例程不同的16位处理器比32位处理器。
等间距的断点使用稍微不同的实现插值计算比不均匀的情况。关键的区别是,计算不直接使用断点。在ROM断点时不需要,你可以节省大量的内存。
xNum = uAngle - (iLeft * 455 u);yDiff = yeven [iLeft + 1] - yeven [iLeft];MUL_S32_S16_U16 (bigProd yDiff xNum);DIV_NZP_S16_S32_U16_FLOOR (yDiff bigProd 455 u);yEven = yEven [iLeft] + yDiff;
两个间隔的断点的力量使用不同的计算实现插值比其他两种情况。甚至在情况下,断点不习惯在生成的代码中,因此不需要在ROM。
λ= uAngle & 0 x00ffu;yPow2 = yPow2 [iLeft) + 1] - yPow2 [iLeft];MUL_S16_U16_S16_SR8 (yPow2λ,yPow2);yPow2 + = yPow2 [iLeft];
这个实现不均匀,甚至实现相比有明显优势:
一位最后结合转变对乘法代替减法和除法。
这个词(u - xData [iLeft]) / (xData [iRght]——xData [iLeft])
结果在不损失精度,因为间距是2的幂。
相比之下,不均匀,甚至通常情况下引入舍入误差计算。
下表总结了断点间距对执行速度的影响,错误,和内存使用。
参数 |
即使是2的幂间隔的数据 |
均匀间隔的数据 |
不均匀间隔的数据 |
---|---|---|---|
执行速度 |
执行速度是最快的。位置搜索和插值为均匀间隔的数据是一样的。然而,增加的速度,有点转变取代了位置搜索和面具取代了插值。 |
执行速度快于不均匀间隔的数据,因为位置搜索速度和插值需要一个简单的部门。 |
不同间距的执行速度是最慢的,因为位置搜索慢,和插值需要更多的操作。 |
错误 |
错误可以比不均匀与非均匀间隔的数据因为近似函数曲率达到相同的精度需要更多的点。 |
错误可以比不均匀与非均匀间隔的数据因为近似函数曲率达到相同的精度需要更多的点。 |
错误可以用非均匀曲率较小,因为近似函数需要少点来达到相同的精度。 |
罗的使用 |
ROM命令罗少,但更多的数据。 |
ROM命令罗少,但更多的数据。 |
罗罗使用更多的命令,但是更少的数据。 |
内存使用情况 |
不显著。 |
不显著。 |
不显著。 |
Y数据点的数量之前预期的模式。同样的最糟糕的错误,无限制的间距(不均匀)需要最少的数据点,和power-of-two-spaced断点需要最。然而,实现均匀间隔的,两种情况的力量不需要生成的代码的断点。这也降低了他们的数据只读存储器需求的一半。结果,等间距的情况下实际使用数据ROM不如不均匀间隔的情况下。同时,两个案例的力量只需要罗略高于不均匀的情况。改变坏的错误可以改变这些排名。尽管如此,当你比较数据罗使用,你应该考虑到这一事实的等间距的和权力两个间隔的情况下不需要他们在ROM的断点。
的努力决定当前输入的相对于等间距的断点强烈支持和权力两个间隔的情况下。间距不均匀,使用二进制搜索方法,循环log2 (N)倍。即使和权力两个间距,可以确定位置的一行C代码的执行。但是你不能决定的相对优势的两个与等间距的硬件和C编译器的详细知识。
计算插值的努力支持两个案例的力量,它使用一个逐位操作和转向替代减法和除法。这种行为的优势取决于特定的硬件,但是你可以期待一个优势在代码大小,速度和准确性。等间距的情况下计算插值与未成年人不均匀间隔的情况下提高效率。