作者 主题:线性插值的最大误差 (Read 6135 times)

0会员和1位客人正在查看此主题。

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
线性插值的最大误差
« on: 2015年9月25日,下午12:45:37»
你好!一世'M试图构建基于NTC的热传感器。唯一的条件是使其在最终措施上以良好的已知耐受性而制作,它就不了'现在,如果它是小或大错误的话。

实际上我'M粘附在理解线性插值的最大误差时,当我在表格的两个条目之间读取数据时,我将应用于微控制器中的LUT。我可以有一些建议吗?
« 上次编辑:2015年9月25日,ThexEno下午12:59:26 »
 

离线 吉米明顿

  • 常规贡献者
  • *
  • 帖子:189
  • 国家: 我们
Re:线性插值的最大误差
« 回复#1开: 2015年9月26日,02:30:07»
首先告诉我们LUT如何派生。各表条目中的错误是什么?

鉴于任意两个表条目中的预期错误,使用错误传播是直接的,以定义这两个条目的任何功能的预期错误。见其他 //en.wikipedia.org/wiki/Propagation_of_uncertainty
« 上次编辑:2015年9月26日,02:34:13 AM by Jimremington »
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#2开: 2015年9月26日,01:41:04 PM»
如果这对另一个线程相当,我'D建议使用多项式 - 它'在大多数平台上更快(更多乘法,没有分区)并使用远更少的内存(一表<8系数,与20+值的表格相同的准确度)。

当我测试的方法时,我评估了三种方法:分段连续是上述原因最糟糕的;一系列数学方式是最简单的数学,但在大多数平台上表现不佳(再次,分区糟透了);多项式方法是最好的妥协(在代码和相当小的表上保存)。

校准的缺点是,您需要解决大量系数,这可能在直播平台上不易进行(我刚刚使用Excel电子表格解决它们!)。

蒂姆
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 凯瑞瓦

  • 常规贡献者
  • *
  • 帖子:112
  • 国家: 我们
Re:线性插值的最大误差
« 回复#3开: 2015年9月26日,02:59:47 PM»
我没有数学家,但这似乎是一个有趣的问题,所以我给了它一些想法,这就是我的想法:

让我们在1度加入1度的阳台上。
如果我们从59度的正弦和61度的正弦局线性地将正弦划分为60度的正弦,而不是使用表格条目,那么我们的错误是什么?

59   0.8571673
60   0,866025403
61   0.874619707

插值正弦,60 = 0.865893503
错误VS表条目= 0.0152328 %%
使用每个表条目而不是每个其他条目都应将该错误截至至少一半。 如果我们线性地插入59.5度的正弦,并将其与计算器值进行比较,则错误应不超过使用半表条目的错误的一半,或者最多0.0076164%。

插值正弦为59.5 = 0.861496352
错误VS Calculator = 0.003807839
这是使用1/2表条目的错误的1/4。

因此,如果n是最近的表条目,max_error =(((2 * lut [n])/(lut {n-1} + lut [n + 1]))-1)/ 4
桌子尺寸加倍提高了精度的重量为4。

« 上次编辑:2015年9月26日,11:50:23 PM由Kerryw »
一个准确的测量值得一千个专家意见
- ADM。Grace Hopper
 

离线 BSON.

  • 支持者
  • ****
  • 帖子:1851
  • 国家: 我们
Re:线性插值的最大误差
« 回复#4开: 2015年9月26日,下午11:11:58»
制作一系列精细的颗粒状测量,比你想象的要多数量级'll想要校准点。
制造最小二乘性多项式拟合。  (scipy/numpy'S polyfit()非常方便。)
计算N点的线性插值的最大误差,用于n的范围。

如果整个集合的多项式函数是(x),并且对于线性插值的两个点是b(x),则错误e = a(x)-b(x),其max / min是d(a(x)-b(x))/ dx = 0的x处。 由于A(x)和b(x)都可以是象征性的表达,因此它可以象征性地解决(例如,由例如Sympy's symbolic solver).

还绘制了最小二乘适合于眼球并获得测量噪声感。  You'LL希望度高足以捕获一般形状,但不是那么高,你模拟了测量噪声。 在配件之前,可能有价值的测量和平均或平滑。  If you can'讲述信号和噪音之间的差异't have enough data.

« 上次编辑:2015年9月26日,PM由BSON下午11:15:39 »
 

离线 Mikerj.

  • 超级贡献者
  • ***
  • 帖子:2678
  • 国家: GB.
Re:线性插值的最大误差
« 回复#5: 2015年9月27日,07:59:48 AM»
如果这对另一个线程相当,我'D建议使用多项式 - 它'在大多数平台上更快(更多乘法,没有分区)并使用远更少的内存(一表<8系数,与20+值的表格相同的准确度)。

当我测试的方法时,我评估了三种方法:分段连续是上述原因最糟糕的;一系列数学方式是最简单的数学,但在大多数平台上表现不佳(再次,分区糟透了);多项式方法是最好的妥协(在代码和相当小的表上保存)。

校准的缺点是,您需要解决大量系数,这可能在直播平台上不易进行(我刚刚使用Excel电子表格解决它们!)。

蒂姆

IME对多项式的问题是在使用固定点数学时产生的中间值的范围,如果速度是一个问题,则浮点是大多数小微型的非启动器。 在32位微米的情况下没有这么糟糕,其中int64是'在8位微观上,它占据了大部分架空,但潜在的巨大开销。
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#6开启: 2015年9月27日,02:00:59 PM»
我的计算是AVR上的16位固定点(2个周期8x8 mult),在整个计算中有250个周期。

蒂姆
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
Re:线性插值的最大误差
« 回复#7: 2015年9月27日,02:30:55 PM»
如果这对另一个线程相当,我'D建议使用多项式 - 它'在大多数平台上更快(更多乘法,没有分区)并使用远更少的内存(一表<8系数,与20+值的表格相同的准确度)。

当我测试的方法时,我评估了三种方法:分段连续是上述原因最糟糕的;一系列数学方式是最简单的数学,但在大多数平台上表现不佳(再次,分区糟透了);多项式方法是最好的妥协(在代码和相当小的表上保存)。

校准的缺点是,您需要解决大量系数,这可能在直播平台上不易进行(我刚刚使用Excel电子表格解决它们!)。

蒂姆

IME对多项式的问题是在使用固定点数学时产生的中间值的范围,如果速度是一个问题,则浮点是大多数小微型的非启动器。 在32位微米的情况下没有这么糟糕,其中int64是'在8位微观上,它占据了大部分架空,但潜在的巨大开销。

实际上我可以使用S-H惯例(没有评估,因为我不 'T有更精确的温度计,能够用一个划分和自然对数(达到SH的顺序的功率)。通过将常量乘以固定值,我可以在32bit变量上工作,无符号。

问题是:
1-如果我在SH方程中的高级系数上松开一个最低大约十进制值,如何估计附加错误?
2-我的micro会有很好的机器精度吗?如果未提供,如何使用它来评估新引入的错误,如何评估此操作?

I'不希望有人能回答这些问题,因为是一个艰难的主题(至少对我来说)和 很难在论坛中讨论这一点(至少对您提供帮助的人)。所以,如果有人知道答案,我'd足够高兴看到即使只是与资源的链接。  :-+
 

离线 Zapta.

  • 超级贡献者
  • ***
  • 帖子:6004
  • 国家: 我们
Re:线性插值的最大误差
« 回复#8开: 2015年9月27日,02:45:05 PM»
实际上我'M粘附在理解线性插值的最大误差时,当我在表格的两个条目之间读取数据时,我将应用于微控制器中的LUT。我可以有一些建议吗?

不应该'如果您有您尝试近似的理想功能的公式,则难以困难。错误可以来自两个源,直到A / D转换和A / D转换后。我明白你的问题是关于第二部分。

由于有限且相对小(例如2 ^ 14)的数量,写入迭代这些数字的程序(C,Java,Python等)并将数字结果与目标函数进行比较。这将为每个可能的输入提供确切的数字错误。然后只计算这些值的min和max。


排出沼泽。
 

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
Re:线性插值的最大误差
« 回复#9: 2015年9月27日,05:33:07 PM»
由于有限且相对小(例如2 ^ 14)的数量,写入迭代这些数字的程序(C,Java,Python等)并将数字结果与目标函数进行比较。这将为每个可能的输入提供确切的数字错误。然后只计算这些值的min和max。

有趣的。我应该迭代什么?我通过将其中一些值作为我的UC和我的双倍而努力尝试'在科学计算器之间观察到差异(也可以是Windows的计算,与Excel表一样有更多的数字)。小数点右侧只有7个数字是正确的。如何通过使用更常规的方法来发现这一点?一世've只懂你打算找到的迭代的模糊的想法"quantum"误差并最后影响最终的温度读数。

在此之后,我认为我将被困在了解如何在SH方程上应用此错误。如果没有这个最后一步,以前的所有工作都是无用的  | O.
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#10: 2015年9月28日,03:49:00»
嘘?

错误传播是一个本身的主题,但是一般思想是它作为各个参数的衍生物,以及涉及舍入的每个计算步骤。 初始分布是扁平的(量化噪声,对应于截断的小数点或数字或位或位或位),但在漫长的计算之后,可能预期扩散大致高斯(与中央极限定理)分开。

0.4%约为8位,所以你会'T期望1%热敏电阻,未校准的大量损失。 这对应于约2.5位,或在热敏电阻的工作范围内,也许是(偏置的)-100至+156 degc范围,没有小数部分。

12位ADC良好至0.024%或244ppm,足以足够好,以获得相当精确的测量和计算(例如,3.5位数万用表或您有什么)。 通过计算,我的意思是,包括在该级别上进行所有中间数学。

如果将所有计算投入到16位固定点,请将固定点放在合适的位置,由于舍入,您将基本上耗尽准确性。

例如,我的电子表格说明了总近似误差的一小部分(+/- 1/2 LSB的总舍入错误(+/- 1/2 LSB,不超过最佳案例ADC测量)(也可以提供)更像+/- 8 LSB,超过12位,IIRC),其反过来是所用部分的实际容差的一小部分(这是约40 LSB)。

是的,我验证了(理论和实验),我的代码会产生与电子表格代码相同的舍入错误。 事实上,用于最终结果的代码实际上是目标平台上真实实时计算的绝对相同的模拟,包括边缘情况(即,一个人不应该从ADC中预期0x000或0xFFF,但公式仍然产生合理的,推断,两种情况的答案)。

如果你're谈论32位浮点,或int64'S,用于这样的计算,我'对不起,但你的思想是 Waayyy. 在这里的外太空。 有些情况下,这些都很好,值得计算工作(即使在整数CPU上也是如此),但这是一个计算上的简单问题 - 一个单一的无状态功能,具有单个,定义的输入域和定义良好的输出功能范围 - 任何对这些建议都是最佳,数学上的懒惰,最糟糕的,易于出错并产生不好的数字,或者没有结果(分部×)。

这是一个'很难 - 当然我'D这么说,因为我知道数学 - 但舍入数量只是你的数字的比率'VE截断与您切断的号码,而固定点的方法只是你如何写出longhand,而是用位或字节而不是十进制进行。 它听起来比它令人羞化,一旦你绕着它,它就's pretty cool.

蒂姆
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
Re:线性插值的最大误差
« 回复#11开: 2015年9月28日,08:35:32 AM»
只是为了澄清,当我谈论SH系数时,我'm参考Steinhart-Hart方程,在1E-14中具有幅度的系数。我可以通过将它们乘以1E12来处理这一点,但自然对数仍然需要精度。

我会分析你写的东西,一旦我有业余时间 :)
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#12: 2015年9月28日,01:07:16 PM»
可以使用重复平方的移位和累积算法在固定点中评估日志(因此,每次迭代通过2的功率升高,这也是基础 - 方便,没有?)。 LG(x)可以直接使用并用常数调节,或者Lg(e)可以用作存储的常数。

或者,它们可以使用Rational曲线(1 / x或多项式或组合)或差分方程(通过定义,Ln(x)是1 / x dx的积分而近似。

请注意,位移换档表示按基础乘法/分割^ n。 它们可以通过在输出项中的各个字节中排列中的附加物来隐式地完成,或者必须用位移偏移完成较小的班次。

一种常量除以常量的优秀方法是将商品(将是分数0.8或有什么),乘以输入,并隐式地换档输出(这是8.8,但积分的一半为零,所以你只需要低字节)。

蒂姆
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
Re:线性插值的最大误差
« 回复#13开启: 2015年9月28日,06:04:24 PM»
好的,让我们'首先澄清 :)
也许它只是一种语言误解问题。

0.4%约为8位

0.4%的是什么?

引用
12位ADC良好至0.024%或244ppm,足以足够好,以获得相当精确的测量和计算(例如,3.5位数万用表或您有什么)。 通过计算,我的意思是,包括在该级别上进行所有中间数学。
中间数学在哪里?模拟/ ADC ADC /电阻电阻/ Steinhart Steinhart / Lemy?

引用
如果将所有计算投入到16位固定点,请将固定点放在合适的位置,由于舍入,您将基本上耗尽准确性。
我可能落在数学上懒惰的类别中,但你确定吗? 也许在你的电子表格中的答案我会看起来更好......

引用
最好,数学上懒惰
是数学上的无知......我用"double"变量。也许这种方法在概念上是使用384 CUDA核心读取F * CKING温度的相同。 

引用
这是一个'很难 - 当然我'D这么说,因为我知道数学 - 但舍入数量只是你的数字的比率'VE截断与您切断的号码,而固定点的方法只是你如何写出longhand,而是用位或字节而不是十进制进行。 它听起来比它令人羞化,一旦你绕着它,它就's pretty cool.

这是相对误差的定义。但由于S-H方程有几个术语(这里是R和舍入,那么好的,那么好很小),我在与对数的分数中的各种数据的相对误差中的相对误差相结合的一些问题。即使在分压器中,结合电阻器的两个误差也不是如此。假设使用两个5%的电阻,我知道"brute forcing"最坏情况是5%+ 5%,当电阻接近相同的值时,它返回到5%,但我没有'T设计了数学公式。我试图为SH方程做同样的事情,因为至少我可以制定错误 sing 变量,但这不是如何相互联系。

以下是SEC,使用已经颠倒的系数确保0.015°C的绝对误差,其中最小的一个是D1 = 6.383091E-08



如果我不会达到这样的精确度,我'd喜欢量化最新的东西。
ADC转换和随后的分压器的R外推以及其误差是它们中已插入R项中的所有情况。我刚刚陷入了这个精确的问题。一个原因是学习,另一个是为了量化错误是屠夫。  ; D.

« 上次编辑:2015年9月28日,07:58:58由Xeno »
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#14: 2015年9月29日,01:31:21 AM»
好的,让我们'首先澄清 :)
也许它只是一种语言误解问题。

0.4%约为8位

0.4%的是什么?

VREF(满量程),用于8位转换器(就像示例)。

当然,热敏电阻赢了'T从0V到VREF的温度范围,所以你赢了't使用全方位。 因此,温度范围内的相对误差将更大。
 因此,0.4%的精度优于1%的部分是有价值的;另一个或两个(给出0.2或0.1%的读取误差,完全规模)可能是最好的。 更有必要的是,无论如何,可能会自由,(12位转换器便宜,很丰富!)。

引用
中间数学在哪里?模拟/ ADC ADC /电阻电阻/ Steinhart Steinhart / Lemy?

包括所有这些。 :)

引用
是数学上的无知......我用"double"变量。也许这种方法在概念上是使用384 CUDA核心读取F * CKING温度的相同。 

那'少数数量数量超过"鞭打一匹死马", but that'好的正确的想法.. :)

引用
以下是SEC,使用已经颠倒的系数确保0.015°C的绝对误差,其中最小的一个是D1 = 6.383091E-08



如果我不会达到这样的精确度,我'd喜欢量化最新的东西。
ADC转换和随后的分压器的R外推以及其误差是它们中已插入R项中的所有情况。我刚刚陷入了这个精确的问题。一个原因是学习,另一个是为了量化错误是屠夫。  ; D.

好的,酷。  Let'看看等式。 非常大致:数量级。 (如果你有它们,你可以为其他系数做这个。)

我们知道T大约300 K.  It'对于任何热敏电阻的最疯狂的可能值,它实际上更像是200-500 k,250-400 k会非常合理。

因此,随着数量级的顺序,我们可以说是在10 ^ 2到10 ^ 3的范围内。  Good enough!

当然,整个方程式用于T ^ -1(它'实际上显示了T ^ 1,它反转右侧:相同的东西),所以等式在10 ^ -2到10 ^ -3范围内的t ^ -1。

这等于A,B * LN(R / RREF),C * LN ^ 2(R / RREF)和D * LN ^ 3(R / RREF)。

当然,R / RREF只是一个比例,我们预计将在10 ^ -3至10 ^ 3或其何处(即,在-100℃的范围内'S比R(25)大的1000倍,并在200℃'s 1/1000th). 对于如前所述的商业温度范围,可能甚至不到那种。

因此,我们还知道LN(R / RREF)的范围,如果是基本10日志,则为-3至3。   But it's base-e, so it'实际上是三倍,或-10到10。  Or 10^-1 to 10^1.

LN(R / RREF)的每个力量乘以那些指数,因此B术语具有10 ^ -1至10 ^ 1倍增器; C项具有10 ^ -2至10 ^ 2,D术语具有10 ^ -3至10 ^ 3!

现在为系数。 我们知道T ^ -1在10 ^ -2范围内(最大值),因此对于温度精度,例如0.1%(即,10 ^ -3),我们需要考虑贡献10个10个的任何东西^ -5或更高。

如果D是 大约10 ^ -8,并在最坏的情况下乘以10 ^ 3(最大的R / RREF),然后它将*勉强*抽搐进入需要计算它的范围。 它可能是可以独自留下的(唐'T在非常低的温度下需要尽可能多的准确度?),或者只有几个位可以近似(也许使用最适合的曲线或牛顿'S方法或泰勒系列)。

(顺便问一下,如果你完全使用SH方程,你'重新计算日志,所以您可以将其重写为:
1 / t = a + b * x + c * x ^ 2 + d ^ x ^ 3
=(((d * x + c)* x + b)* x + a
其中x = ln(r / rref)
这将我们带回简单的多项式,节省了更多的计算。)

至于固定点计算,因为我们'重新对T作为XXX.xx数字感兴趣,也许 - 我们必须使用表示提供绰绰有余位的表示来打印此类数字。

三个积分数字需要十个比特(因为十位跨越2 ^ 10 = 1024的范围>999),两个分数位需要七位(2 ^ 7 = 128> 99). 一个17位的计算只是几乎没有足够的空间,但因为它赢了'使用得很好(我们有一个可用的范围,例如-512至+511,为一体的部分,分数部分为0到127/128),我们'LL需要几个额外的位,以保持良好的准确性。 这是18或19位。

我们也可以使用整个字节额外,因此可以完成24位计算。

这也将使我们提供一些更准确的准确性,这将节省那些小错误(甚至来自D术语),以防他们生产进入我们的最终号码。 或者,我们可以将温度报告为XXX.xxx的最大位数,尽管方程式的准确性和组件,以及校准本身(现在是标准级温度,现在!),都被称为问题 - 如何呢当你不时,你甚至可以证明显示额外的数字't know its accuracy?

在像AVR这样的东西上,我会猜测完整的24位SH计算需要大约2000个时钟周期(在典型时钟速度下完成约100us完成)。 漂亮的涉及,但如果你要求绝对最佳的数字准确性,并且想要节省一些时间(浮点可能需要毫秒才能完成!),它'值得付出的价值。

具有第10阶多项式的高阶多项式近似可能达到所需的精度(即,真实数值精度的5位数字,并且将节省代码大小的空间(计算更简单:仅累积过程),并占地大约800个周期。 解决校准(调整10个抽象系数!)可能比SH方程更难,这值得在自校准系统中考虑。 (当然 - 如果开发是主要成本,而且速度是'一个问题 - 只要继续使用单精度,它's easy!)

但至少,我希望我'给你一些洞察力,并表明了超过单一精度(24位螳螂 - 与上面的固定点示例一样多的数值准确性,加上指数)ISN't necessary. 双人或更肯定是浪费的CPU时间!

蒂姆
« 上次编辑:2015年9月29日,01:44:47 AM由T3SL4Co1L »
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 Mikerj.

  • 超级贡献者
  • ***
  • 帖子:2678
  • 国家: GB.
Re:线性插值的最大误差
« 回复#15: 2015年9月30日,上午10:57:32»
我的计算是AVR上的16位固定点(2个周期8x8 mult),在整个计算中有250个周期。

蒂姆

我刚刚模拟了一个分段线性函数,我在多年前编写热敏电阻线性,需要165个循环,以以0.01摄氏度的单位转换为温度的12位ADC值。 这是使用旧版本的GCC-AVR,它不起作用'T提供了很大的优化,我怀疑可能减少20-30个循环,而无需大量的疼痛。不可否认'S不是最空间的高效(LUT = 58 * 16位值)。
 

离线 BSON.

  • 支持者
  • ****
  • 帖子:1851
  • 国家: 我们
Re:线性插值的最大误差
« 回复#16开: 2015年10月1日,01:35:07 AM»
如果它 'S只有12位和处理器不'对于一个16位的结果,它必须做任何其他事情's only an 8kB table.  I'D只是将其预编译在一个吐出可以包含在代码中的表的程序中。 然后添加构建步骤以产生它。
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#17开: 2015年10月1日,06:23:07»
哦,和这里's the code,

所以你可以看到,它'几乎是少量代码+数据作为单独的表格中的表格(哪个'm猜测使用寻址快捷方式而不是一般二进制搜索?)。 考虑到漂亮的空间时间权衡。

蒂姆

代码: [选择]
.macro ldptrzpgm
ldi zh, HIGH(@0 << 1)
ldi zl, LOW(@0 << 1)
.endm

;
;     countToTemp
;
; Converts a 12 bit ratiometric ADC count into a
; temperature (in 12.4 fixed point format, °C),
; using a 7th order polynomial approximation.
;
; 74 words, approximately 310 cycles.
;
; Input:
;   r17:r16: 12 bit ADC count to convert
; Returns:
;   r1:r0: 12.4 fixed point, temperature in °C
;
countToTemp:
push zh ; Register use:
push zl ; Z --> tmprtable
push r20 ; r20 = temp (in MAC)
push r19
push r18 ; r19:r18 = additive constant (from lpm), temp
push r5 ; r17:r16 = input operand
push r4
push r3 ; r5:r4:r3 = MAC accumulator (bytes 1, 2, 3; byte 0 unused)

; input conditioning

ldi r20, high(0x0800)
add r17, r20 ; signed offset (r17:r16 + 0x0800)

ldi r20, 4
tmprshift: lsl r16
rol r17
dec r20 ; left-align
brne tmprshift

; initialize MAC chain

ldptrzpgm tmprtable ; load pointer to coefficients
clr r5
clr r4

rcall tmprmac ; r5:r4 <= ((r5:r4 + [z+]:[z+]) * r17:r16) >> 16
rcall tmprmac
rcall tmprmac ; the first two MACs are normal...

ldi r19, 4
tmprsloop:
lsl r3 ; but the third needs a correction
rol r4 ; (note: r3 is still MAC accumulator byte 1,
rol r5 ; get that in the shift too)
dec r19
brne tmprsloop

rcall tmprmac ; the rest are normal
rcall tmprmac
rcall tmprmac
rcall tmprmac

lpm r18, z+
lpm r19, z+
add r4, r18
adc r5, r19

tmprstempleave:
movw r0, r4 ; add the final offset, move, and we're done

pop r3
pop r4
pop r5
pop r18
pop r19
pop r20
pop zl
pop zh
ret
tmprtable:
;; Coefficients for EPCOS thermistor
; .dw -7762 ; coeff 0
; .dw -255 ; 1
; .dw 1004 ; 2
; .dw 5599 ; 3
; .dw -4454 ; 4
; .dw 315 ; 5
; .dw -1877 ; 6
; .dw 738 ; 7

; Coefficients for Murata thermistor
.dw -14285 ; coeff 0
.dw 1850 ; 1
.dw 2802 ; 2
.dw -1640 ; 3
.dw -6812 ; 4
.dw 676 ; 5
.dw -1829 ; 6
.dw 735 ; 7

; Calculate r5:r4 <= ((r5:r4 + [z+]:[z+]) * r17:r16) >> 16.
; Takes 29 cycles (not counting rcall).
tmprmac:
lpm r18, z+
lpm r19, z+
add r18, r4 ; r19:r18 = multiplicand,
adc r19, r5 ; r17:r16 = multiplier (input operand)

; Using r5:r4:r3 = accumulator (bytes 1-3, byte 0 not needed), r20 = zero
clr r20
muls r17, r19 ; high * high (only high bytes are signed)
movw r4, r0
mul r16, r18 ; low * low = byte 1:byte 0
mov r3, r1 ; only need byte 1
mulsu r19, r16 ; high * low
sbc r5, r20 ; sign extend hack
add r3, r0
adc r4, r1
adc r5, r20
mulsu r17, r18 ; low * high
sbc r5, r20 ; sign extend hack
add r3, r0
adc r4, r1
adc r5, r20
ret
; END PROC countToTemp
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
Re:线性插值的最大误差
« 回复#18开启: 2015年10月1日,09:30:26 PM»

(顺便问一下,如果你完全使用SH方程,你'重新计算日志,所以您可以将其重写为:
1 / t = a + b * x + c * x ^ 2 + d ^ x ^ 3
=(((d * x + c)* x + b)* x + a
其中x = ln(r / rref)
这将我们带回简单的多项式,节省了更多的计算。)

至于固定点计算,因为我们'重新对T作为XXX.xx数字感兴趣,也许 - 我们必须使用表示提供绰绰有余位的表示来打印此类数字。

三个积分数字需要十个比特(因为十位跨越2 ^ 10 = 1024的范围>999),两个分数位需要七位(2 ^ 7 = 128> 99). 一个17位的计算只是几乎没有足够的空间,但因为它赢了'使用得很好(我们有一个可用的范围,例如-512至+511,为一体的部分,分数部分为0到127/128),我们'LL需要几个额外的位,以保持良好的准确性。 这是18或19位。

我们也可以使用整个字节额外,因此可以完成24位计算。


非常感谢,非常清晰!
只是我不'了解如何,在谈论LN(0.001)时是-10左右的某个地方, 这个-10变成了= 10 ^ -1 ...... ; D. ; D. 肯定是我的误解  somewhere :)

尽管您的解释,但我有一件事并不是从我这里解释的事情,而关键则包含在报价中。当我'm使用C(而不是组装)我必须使用标准声明,如long和float。阅读周围,我发现C的固定点在乘法的乘法下隐藏在常量下,表示使用整数,高数字等XXXXX并只是打印出点 - > xxx.xx
我正在应用这个,因为没有32位浮动用法(它可以表示从10 ^ -100到10 ^ 100)的数字。为此,我必须乘以10 ^ 9(表示在32bits中,(甚至签名)整数)。具有所有整数,这不足以,因为d = 6.383091e-8和c = 2.620131e-6。所以我必须重复另一个10 ^ 3的乘法。唯一受影响的值将为d(截断最后91个,但可以使用仅应用于d)的另外100因素来避免这一点。
也许在可以使用一些小数部分的对数,应该使用浮点数,但请注意,此浮点至少24位为标准,而且我不'要使用非标准数值操纵。所以现在我几乎了解了如果使用浮点数,最多10 ^ -5有用,可以在上次示例下删除多少数值精度。但有些关于固定点的奇怪......

......而且我将为你读的错误道歉.....

...........这是重要的问题,看我是否'了解得很好。一世'm将使用列表,因为它更好地拆分问题和最终答案:

1.使用您的10 ^ -5作为最大精度要求,粗略设计为使概念进行概念,如果我松开了C = 2.620131e-6的最后一位或两位,因为乘以10 ^ 9(没有随后的10 ^ 3个多移),我将从数字2620.131,整数2620获得。这将该系数的精度降低到10 ^ -3。使这将降低全温的精度相同的量。

2.结果,实现了另外10 ^ 3的乘法(保持10 ^ -5精度只有10只乘以10)我将保存C COEFF精度。这对于D而言,这与(整数)6.383091E-8 * 10 ^ 9 * 10 ^ 3 = 63830,切割.91分数零件。因此,D系数引起的最终精度为10 ^( - 8 + 2)= 10 ^ -6。因此,大学上,10 ^ 12的乘法提供足够的精度,甚至切出了一些D分数的D.当然,假设浮动对数与十进制数量的数量非常低的使用。这个问题漂浮在logaritms上,如果我才说到现在是正确的,那将是我的最后问题。

我希望我've考虑了所有的解释,但也许明天再读它它将显示别的东西。肯定,现在我知道32位浮动没有用。据我所知,也许少于24位,但将是非标准的。最好的(不是 群体的东西根本不会使用浮动。
« 上次编辑:2015年10月1日,09:41:39 PM由Xeno »
 

离线 T3SL4CO1L.

  • 超级贡献者
  • ***
  • 帖子:16769
  • 国家: 我们
  • 专家,模拟电子,PCB布局,EMC
    • 七晶体管实验室
Re:线性插值的最大误差
« 回复#19: 2015年10月02日,05:04:59»
非常感谢,非常清晰!
只是我不'了解如何,在谈论LN(0.001)时是-10左右的某个地方, 这个-10变成了= 10 ^ -1 ...... ; D. ; D. 肯定是我的误解  somewhere :)

哎呀,划伤那个...... ; D.

引用
1.使用您的10 ^ -5作为最大精度要求,粗略设计为使概念进行概念,如果我松开了C = 2.620131e-6的最后一位或两位,因为乘以10 ^ 9(没有随后的10 ^ 3个多移),我将从数字2620.131,整数2620获得。这将该系数的精度降低到10 ^ -3。使这将降低全温的精度相同的量。

是的! 恰恰是意图! Teeny,C和D的小数小部分不能贡献答案(例如,5位精度),所以你不需要额外的数字(为此目的,C同样是准确的,无论它是否等于"2.620131E-6" or "2.62E-6").

如果它们同样加权,那么它们的数量级和乘数都将是平等的。 但显然,他们不是,这允许我们将一切推向一个固定的点寄存器,并截断我们不的事情't need. :)

至于在C中执行此操作,您仍然可以节省足够的时间过度浮点。 在我用qbasic玩的日子里,通常是我'D说,一个图形演示,以20 FPS运行,具有浮点。 固定点(使用内置整数)大约增加三倍,以合理的50-60 fps。 在ASM中编写核心例程更加改进它,并且在ASM中的整个东西占据了大约500 FPS(这比令人可怕的开销QB有多少;幸运的是'有这个问题)。

蒂姆
七晶体管Labs,LLC
电子设计,从概念到原型。
将项目带到生活中?  Send me a message!
 

离线 Xeno.

  • 常规贡献者
  • *
  • 帖子:72
  • 国家: 它
  • 只是另一个ee.
Re:线性插值的最大误差
« 回复#20开: 2015年10月3日,08:53:27»
在得出精确度的结论下, 我发现24bit(浮动或双重,实验,不会改变结果!!)降低了10 ^ -2下的系数的精度!此外,完全拧紧较高的系数,A。
在这里显示的图片中, 坦佩 变量应该是0.我不'要了解我所看到的一切。您所看到的不是任何算术操作的结果,但它只是一个分配(那么好,可以与操作相当......)。

编辑:我的错误。但它仍然值得一个推理。

在这里,变量列表,24位双倍,有 错误的 right values:

"Ad"没有搞砸,刚刚以错误的解释显示(32bit而不是24)。迁移到正确的解释,该值是合理的,但没有提供精确度,因为将值为3.354016e-3到3.354013E-3。保持所需的10 ^ -5的例子,这可以是可接受的。我的论点是,如果我需要10 ^ -5和广告作为一个极端条件,我需要它的第5个十进制数加一个,因此如果广告仍然是正确的10 ^ -6,我可以考虑它正确。
广告= 0.003354 | 016 - >016可能是错误的而不降低精度。
按比例地,所有其他系数遵循相同的规则。
所以,如果让'S Say CD乘以10,我甚至可以使用CD = 2.6(2.6表示已经乘以10 ^ 6的常数)没有任何问题! :)

完整性,在这里32位列表。
使用32位精度,所有内容都显示(无用):


根据这些考虑因素,我将需要使用常量10 ^ 12的乘数值,因为我在上一篇文章中所说的情况。但是通过24位行为,我不't得出任何带来十进制结果的东西。使用24位,必须用手制作这种乘法,因为系数的起始值总是错误。

希望能够正确理解。

编辑1:还要考虑到我的NTC有5%的错误,而B参数也有它。假设对电压分频器(不是逼真的条件)没有误差,我的错误读数超过1°C
« 上次编辑:2015年10月3日,11:08:04 AM由Xeno »
 


分享我

掘客  Facebook  诽谤  可口的  Technorati.  推特  谷歌  雅虎
SMF.