Периодически получаю буфер данных, который содержит ряд значений, которые являются фиксированным расстоянием во времени. Мне нужно их отличить. Это Су давно я сделал исчисление в школе ....Дифференциация буфера с Delphi
То, что я придумал это:
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 в конструкторе.
Это то, что я сделал правильно? т. е. будет ли он правильно дифференцировать значения?
Мне также нужно интегрировать подобные данные ... что это может быть похоже?
Выглядит хорошо для меня. – iamjoosy
спасибо, iamjoosy – user745323
Если вы инициализируете 'FLastDiffValue' до нуля, вам не нужно будет проверять, является ли это NaN. Вы можете безоговорочно установить 'dy: = ABuffer [0] - FLastDiffValue'. –