2013-09-27 4 views
4

Периодически получаю буфер данных, который содержит ряд значений, которые являются фиксированным расстоянием во времени. Мне нужно их отличить. Это Су давно я сделал исчисление в школе ....Дифференциация буфера с 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 в конструкторе.

Это то, что я сделал правильно? т. е. будет ли он правильно дифференцировать значения?

Мне также нужно интегрировать подобные данные ... что это может быть похоже?

+0

Выглядит хорошо для меня. – iamjoosy

+0

спасибо, iamjoosy – user745323

+1

Если вы инициализируете 'FLastDiffValue' до нуля, вам не нужно будет проверять, является ли это NaN. Вы можете безоговорочно установить 'dy: = ABuffer [0] - FLastDiffValue'. –

ответ

4

В этом я не могу найти недостатки.

Первое значение, возвращенное, при первом вызове будет (ABuffer[0] - 0.0)/dt, которое основано на предположении, что сигнал начинается с нуля. Я полагаю, это то, что вы намереваетесь.

Теперь, вместо того чтобы попросить сообщество переполнения стека проверить ваш код, вы можете сделать гораздо лучше себя. Вы должны проверить код, чтобы доказать его точность. Протестируйте его с помощью модульной системы тестирования, например DUnitX. Подайте значения функций, для которых вы можете прогнозировать выход. Например, подайте значения из y = x , или 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 
+0

Спасибо, Дэвид, и спасибо за предложение о том, как его проверить. Что касается моего логического тестового стиля, я часто использую «condition = false», а не «not condition», поскольку он читает лучше, то есть я понимаю, что это легче, когда я читаю код. Я редко, если вообще когда-либо, использую '= true'. Не хотите ли вы показать (в псевдокоде), какая интеграция может выглядеть? – user745323

+0

Что ты здесь делаешь, ПИД-код? Во всяком случае, это не похоже, что вам нужно, чтобы я показал вам, как сделать интеграцию.Вы управляете дифференциацией, вы можете управлять интеграцией. Напишите хорошие тесты, и все будет хорошо. Точно как вы делаете интеграцию, зависит от выбора algo. Трапеция, Симпсон, более высокий порядок. Трапеция прост. Вы можете использовать почти идентичный дизайн функции, как в вашем методе diff, но суммировать область трапеции вместо того, чтобы делать конечную разницу. Как только вы попадете в рутину тестирования, вам будет легко писать и проверять код. –

+0

Я преобразовываю данные скорости и ускорения. Спасибо за поддержку и предложения. Я могу представить, что такое метод трапеции, поэтому я сначала пойду. – user745323

Смежные вопросы