我定期接收一段数据缓冲区,其中包含一些按固定时间间隔分离的数值。我需要对它们进行区别。自从我在学校学过微积分以来已经很久了...
我想出的方法是这样的:
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。
我的做法正确吗?也就是说,它能正确地区分这些值吗?
我还需要整合类似的数据……那会是什么样子呢?
FLastDiffValue
初始化为零,则无需检查它是否为NaN。 您可以无条件设置dy:=ABuffer [0] - FLastDiffValue
。 - Rob Kennedy