我定期收到一个数据缓冲区,其中包含多个相隔时间固定距离的值。我需要区分它们。自从我在学校做微积分以来,它已经太久了......
我想出的是:
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个值。
我使用与前一个数据块连续的新数据一次又一次地调用缓冲区,因此保留下一次的块的最后一个值。在构造函数中将最后一个值设置为NAN。
我做得对吗?即,它会正确区分价值吗?
我还需要整合类似的数据......这可能是什么样的?
答案 0 :(得分:4)
我找不到任何错误。
在第一次调用时返回的第一个值将是(ABuffer[0] - 0.0) / dt
,这是基于信号以零开始的假设。我认为这就是你想要的。
现在,您可以自己做得更好,而不是要求Stack Overflow社区检查您的代码。您应该测试代码以证明它是准确的。使用单元测试框架测试它,例如DUnitX。输入可以预测输出的函数值。例如,从y = x 2 或y = sin(x)提供它的值。
编写测试的另一个好处是它们可以一次又一次地执行。在开发代码时,存在引入错误的风险。代码今天可能是正确的,但谁知道明天修改后它是否仍然是正确的。如果您有一个强大的测试,您可以防止在维护期间引入的故障。
关于风格的一个评论是你不应该测试= false
或= true
。 if
语句对布尔表达式进行操作,因此与布尔值进行比较总是毫无意义。我会写这样的测试:
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