delphi - 用 Delphi 区分缓冲区

标签 delphi integration differentiation

我定期接收数据缓冲区,其中包含许多时间间隔固定的值。我需要区分它们。我已经很久没有在学校学过微积分了......

我想出的是这样的:

function DifferentiateBuffer(
  ABuffer: TDoubleDynArray; AVPS: integer): TDoubleDynArray;
var
  i: integer;
  dt, dy: double;
begin
  if (AVPS = 0) then exit;

  // calc the delta time
  dt := 1 / AVPS;

  // run through the whole buffer
  for i := 0 to high(ABuffer) do begin
    if (i = 0) then
      if (IsNan(FLastDiffValue) = false) then
        dy := ABuffer[0] - FLastDiffValue
      else
        dy := ABuffer[0]
    else
      dy := Abuffer[i] - ABuffer[i -1];

    result[i] := dy / dt
  end;

  // remember the last value for next time
  FLastDiffValue := ABuffer[high(ABuffer)];
end;

AVPS 是每秒的值。该值的典型值在 10 到 100 之间。 缓冲区的长度通常为 500 到 1000 个值。

我一次又一次地使用与前一个数据 block 连续的新数据调用缓冲区,因此保留该 block 的最后一个值以供下次使用。最后一个值在构造函数中设置为 NAN。

我的做法正确吗?即,它能正确区分这些值吗?

我还需要集成类似的数据......那可能是什么样子?

最佳答案

我找不到任何错误。

第一次调用时返回的第一个值将为(ABuffer[0] - 0.0)/dt,它基于信号以零开头的假设。我想这就是您的意图。

现在,您不必要求 Stack Overflow 社区检查您的代码,您自己可以做得更好。您应该测试代码以证明它是准确的。使用单元测试框架(例如 DUnitX)对其进行测试。输入可以预测输出的函数值。例如,输入 y = x2 或 y = sin(x) 中的值。

编写测试的另一个巨大好处是它们可以一次又一次地执行。当您开发代码时,您面临着引入错误的风险。今天的代码可能是正确的,但谁知道明天修改后它是否仍然正确。如果您有强大的测试,您可以防范维护期间引入的故障。

对样式的一个评论是,您不应该测试 = false= true。 if 语句对 bool 表达式进行操作,因此与 bool 值进行比较总是毫无意义的。我会像这样编写你的测试:

if not IsNan(FLastDiffValue) then
  dy := ABuffer[0] - FLastDiffValue
else
  dy := ABuffer[0]

或者像这样:

if IsNan(FLastDiffValue) then
  dy := ABuffer[0]
else
  dy := ABuffer[0] - FLastDiffValue

关于delphi - 用 Delphi 区分缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19054571/

相关文章:

delphi - 在我的应用程序的安装程序中嵌入 Firebird 安装的最佳方式是什么?

multithreading - 使用 AnonymousThread 将值传递给 onTerminate

delphi - 在中间添加新的常量时,如何递增顺序的常量值

Magento 与 ERP 和动态定价的集成

python - 当 r=0 时,在 python 中以数值方式计算 1/r*d/dr(r*f)。 f 是 r 的函数

delphi - 通过 WM_COPYDATA 在不同 Delphi 版本应用程序之间传输数据

asp.net-mvc - 我应该将解决方案移至 Orchard CMS 还是手动添加所有内容?

java - 在 Tomcat9 上安装 PHP7 Servlet

python - 在 Python 中绘制嵌套列表的微分图

coq - 在 Coq 上使用 Coqelicot 进行部分微分