主要内容

间距对速度、错误和内存使用的影响

比较断点间距类型的标准

下面的小节比较使用间隔不均匀、均匀且为2的断点的查找表实现。对比的重点是:

  • 命令执行速度

  • 内插舍入误差

  • 用于数据的只读存储器(ROM)的数量

  • 用于命令的ROM的数量

此比较仅在断点不可调优时有效。如果在生成的代码中断点是可调的,那么这三种情况都会生成相同的代码。有关断点间距对执行速度、错误和内存使用的影响,请参见断点间距的影响总结

说明断点间距影响的模型

这个比较使用了模型fxpdemo_approx_sin.该模型中出现了三个定点查找表。所有三个表都近似于该函数罪(2 *π* u)在第一象限内得到的最坏情况误差小于2 ^ 8.但是,它们对断点间距有不同的限制。

您可以使用模型fxpdemo_approx,这fxpdemo_approx_sin打开时,产生金宝app®编码器™代码(金宝app仿真软件编码器软件许可证要求)。接下来的部分介绍了生成的代码的几个部分,以强调关键的区别。

要打开模型,在MATLAB中输入®提示:

fxpdemo_approx_sin

每个查询表所需的数据ROM

本节将介绍这三种间距选项所需的数据ROM。

不均匀的情况

间距不均匀需要Y数据点和断点:

int16_T yuneven [8];uint16_T xuneven [8];

使用的总字节数为32。

甚至情况

偶数间距只需要Y个数据点:

int16_T yeven [10];

使用的总字节为20。断点不是明确需要的。代码使用断点之间的间距,并可能使用最小和最大的断点。最多需要三个与断点相关的值。

两种情况的幂

2的乘方只需要Y个数据点:

int16_T ypow2 [17];

使用的总字节数是34。断点不是明确需要的。代码使用断点之间的间距,并可能使用最小和最大的断点。最多需要三个与断点相关的值。

超出范围输入的确定

在所有这三种情况下,您必须防止输入小于最小断点或大于最大断点的可能性。处理这些可能性的方式可能有所不同。然而,这种差异通常是很小的,通常不是决定使用一种间距方法而不是另一种间距方法的关键因素。后面的小节假设超出范围的输入是不可能的或者已经被处理过了。

查找表如何确定输入位置

本节描述三个定点查找表如何确定当前输入相对于断点的位置。

不均匀的情况

不均匀间隔的断点需要一种通用算法,例如二分查找,以确定输入相对于断点的位置。下面的代码提供了一个示例:

iLeft = 0;iRght = 7;/* while ((irleft - iLeft) > 1) {i = (iLeft + irright) >> 1; /* while ((irleft - iLeft) > 1) {i = (iLeft + irright) >> 1;if (uAngle < x参股[i]) {right = i;} else {iLeft = i;} }

while循环最多执行log2(N)次,其中N是断点的数量。

甚至情况

均匀间隔的断点只需要一个步骤来确定输入与断点的关系:

= uAngle / 455U;

的因子455 u表示断点之间的间距。一般来说,红利是(uAngle - SmallestBreakPoint).在本例中,最小的断点为零,因此代码优化了减法。

两种情况的幂

两个间隔断点的幂只需要一步就可以确定输入与断点的关系:

iLeft = uAngle >> 8;

移位的次数是8,因为断点有间隔2 ^ 8.最小的断点是零,所以uAngle代替一般情况(uAngle - SmallestBreakPoint)

比较

要确定输入相对于断点的位置,间隔不均匀的情况需要比其他两种情况多得多的代码。这段代码需要额外的命令ROM。如果许多查找表共享二进制搜索算法作为一个函数,您可以减少这个ROM损失。即使代码是共享的,在间隔不均匀的情况下,确定输入位置所需的时钟周期数要比其他两种情况高得多。如果代码是共享的,函数调用开销会稍微降低执行速度。

在等间距和两倍间距的情况下,您可以用一行代码确定输入的位置。等间距的情况使用一般的整数除法。2的幂使用移位而不是一般的除法,因为除数是2的幂。在不知道具体处理器的情况下,您无法确定移位优于除法。

许多处理器可以用一条汇编语言指令来实现除法,因此代码会很小。然而,这条指令通常需要许多时钟周期才能完成。许多处理器不提供除法指令。这些处理器的除法是通过重复的减法进行的。这个过程很慢,需要很多机器代码,但这些代码可以共享。

大多数处理器都提供了一种向左和向右进行逻辑和算术移位的方法。关键的区别在于处理器是可以在一条指令中进行N次移位(桶移位),还是需要N条指令一次移位一位。桶移位需要的代码更少。桶移位是否也增加了速度取决于支持操作的硬件。金宝app

编译器也会使比较复杂化。在上一个示例中,命令uAngle > > 8本质上取一个16位字的上8位。编译器可以检测到这种情况,并使用直接获取位的指令替换位移位。如果移位的次数是其他值,例如7,则不会发生这种优化。

每个查询表的插值

理论上,你可以用下面的代码来计算插值:

y = (yData[right] - yData[iLeft]) * (u - xData[iLeft])…/ (xData[right] - xData[iLeft]) + yData[iLeft]

这个词(xData [iRght]——xData [iLeft])是相邻断点之间的间距。如果这个值是常数,由于偶数间距,可以进行一些简化。如果间距不仅是偶数,而且是2的幂,那么定点实现就可以进行显著的简化。

不均匀的情况

对于不均匀情况,理想插值在不动点的一种可能实现方式是:

xNum = uAngle - x参股[iLeft];xDen = x参股[右]- x参股[左];yDiff = yuneven[右]- yuneven[左];/ /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 - (left * 455U);yDiff = yeven[iLeft+1] - yeven[iLeft];MUL_S32_S16_U16(bigProd, yDiff, xNum);DIV_NZP_S16_S32_U16_FLOOR(yDiff, bigProd, 455U);yEven = yEven [iLeft] + yDiff;

两种情况的幂

两个间隔断点的幂函数使用与其他两种情况非常不同的计算来实现插值。在偶数情况下,断点不会在生成的代码中使用,因此在ROM中不需要断点。

= uAngle & 0x00FFU;yPow2 = yPow2 [iLeft)+1] - yPow2 [iLeft]; / /点击这里MUL_S16_U16_S16_SR8 (yPow2λ,yPow2);yPow2 + = yPow2 [iLeft];

这种实现比不均匀和均匀实现有显著的优势:

  • 一个按位的AND加上在乘法运算结束时右移,将替换一个减法和一个除法。

  • 这个词(u - xData[iLeft]) / (xData[right] - xData[iLeft]) / (xData[right] - xData[iLeft])结果不会降低精度,因为间距是2的幂。

    相反,在不均匀和均匀的情况下,这种计算通常会引入舍入误差。

断点间距的影响总结

下表总结了断点间距对执行速度、错误和内存使用的影响。

参数

2倍间距数据的偶数次幂

均匀间隔的数据

不均匀间隔的数据

执行速度

执行速度是最快的。位置搜索和插值与等间距数据相同。然而,为了进一步提高速度,一个位移代替位置搜索,一个位掩码代替插值。

由于位置搜索速度更快,而且插值需要简单的除法,因此执行速度比非均匀间隔数据更快。

由于位置搜索速度较慢,而且插值需要更多的运算,所以执行速度是不同空间中最慢的。

错误

由于近似非均匀曲率的函数需要更多的点才能达到相同的精度,因此误差可能会大于非均匀数据的误差。

由于近似非均匀曲率的函数需要更多的点才能达到相同的精度,因此误差可能会大于非均匀数据的误差。

误差可以更小,因为近似一个非均匀曲率的函数需要更少的点来达到相同的精度。

罗的使用

使用较少的命令ROM,但更多的数据ROM。

使用较少的命令ROM,但更多的数据ROM。

使用较多的命令ROM,较少的数据ROM。

内存使用情况

不显著。

不显著。

不显著。

Y数据点的数量遵循预期的模式。对于同样的最坏情况错误,不受限制的间隔(不均匀)需要的数据点最少,而2次幂间隔断点需要的数据点最多。但是,均匀间隔和两种情况的实现不需要在生成的代码中使用断点。这减少了一半的数据ROM需求。因此,均匀间隔的情况实际上比不均匀间隔的情况使用更少的数据ROM。而且,两种情况的幂只需要比不均匀情况稍微多一点ROM。改变最坏情况的错误可以改变这些排名。尽管如此,当您比较数据ROM的使用情况时,您应该始终考虑到这样一个事实,即两个间隔的情况的均匀间隔和幂不需要在ROM中使用断点。

确定当前输入相对于断点的位置的努力非常有利于两个间隔时间的情况的均匀间隔和幂次。对于不均匀的间隔,您可以使用循环到log2(N)次的二分搜索方法。使用偶数和幂两个空格,您可以通过执行一行C代码来确定位置。但是,如果不了解硬件和C编译器的详细知识,就无法确定两个幂函数相对于等间距函数的相对优势。

计算插值的工作更倾向于两种情况的幂,它使用按位的AND操作和移位来替换减法和除法。这种行为的优势取决于特定的硬件,但您可以期待在代码大小、速度和准确性方面的优势。与非均匀间隔的情况相比,均匀间隔的情况计算插值的效率略有提高。