主要内容

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

比较断点间距类型的标准

下面几节将比较使用断点的查找表的实现,这些断点的间距是不均匀的、均匀的,并且是两个断点的幂。比较的重点是:

  • 命令执行速度

  • 插值过程中的舍入误差

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

  • 用于命令的ROM的数量

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

说明断点间距影响的模型

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

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

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

fxpdemo_大约

每个查找表所需的数据ROM

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

不均匀的情况

间距不均匀需要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;/* 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是断点的数量。

偶数

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

iLeft=uAngle/455U;

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

两种情况的权力

两个间隔断点的幂次仅需一步即可确定输入相对于断点的位置:

iLeft = uAngle >> 8;

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

比较

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

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

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

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

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

每个查找表的插值

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

y=(yData[iRght]-yData[iLeft])*(u-xData[iLeft])…/(扩展数据[iRght]-扩展数据[iLeft])+yData[iLeft]

这个词(扩展数据[iRght]-扩展数据[iLeft])是相邻断点之间的间距。如果该值为常量,由于间距均匀,可以进行一些简化。如果间距不仅是偶数,而且是二的幂,那么对于定点实现来说,可以进行显著的简化。

不均匀的情况

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

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-(iLeft*455U);yDiff=yeven[iLeft+1]-yeven[iLeft];MUL_S32_S16_U16(bigProd、yDiff、xNum);NZP分区S16分区S32分区16分区(yDiff,bigProd,455U);yEven=yEven[iLeft]+yDiff;

两种情况的权力

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

lambda=uAngle&0x00FFU;yPow2=yPow2[iLeft)+1]-yPow2[iLeft];MUL_S16_U16_S16_SR8(yPow2、lambda、yPow2);yPow2+=yPow2[iLeft];

与不均匀和均匀的实现相比,此实现具有显著的优势:

  • 在乘法运算结束时,按位AND加上右移可以替换减法和除法。

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

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

断点间距的影响摘要

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

参数

2间隔数据的偶数幂

均匀间隔的数据

不均匀间隔的数据

执行速度

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

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

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

错误

该误差可能大于间距不均匀数据的误差,因为近似曲率不均匀的函数需要更多的点才能达到相同的精度。

该误差可能大于间距不均匀数据的误差,因为近似曲率不均匀的函数需要更多的点才能达到相同的精度。

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

罗的使用

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

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

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

内存使用

不重要。

不重要。

不重要。

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

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

计算插值的努力有利于两种情况的幂,即使用位AND运算和移位来代替减法和除法。这种行为的优点取决于特定的硬件,但您可以预期在代码大小、速度和准确性方面会有优势。与不均匀间隔情况相比,均匀间隔情况计算插值的效率略有提高。