我定期收到一个数据缓冲区,其中包含许多在时间上相隔固定距离的值。我需要区分它们。好久没在学校学微积分了……
我想出的是:
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。
我所做的是否正确?即,它会正确区分这些值吗?
我还需要整合类似的数据……那可能是什么样子?