Есть два способа реализовать это, которые я обычно использую. Я всегда работаю с данными в реальном времени, поэтому это предполагает непрерывный ввод. Вот некоторый псевдокод:
Используя обучаемый minmax:
define function peak:
// keeps the highest value it has received
define function trough:
// keeps the lowest value it has received
define function calibrate:
// toggles whether peak() and trough() are receiving values or not
define function scale:
// maps input range [trough.value() to peak.value()] to [0.0 to 1.0]
Эта функция требует, чтобы вы либо выполнили начальную фазу обучения (используя calibrate()
), либо переподготовили либо через определенные промежутки времени, либо в соответствии с определенными условиями. Например, представьте себе такую функцию:
define function outBounds (val, thresh):
if val > (thresh*peak.value()) || val < (trough.value() / thresh):
calibrate()
Пик и впадина, как правило, не принимают значения, но если они outBounds()
получают значение, которое более чем в 1,5 раза превышает текущий пик или меньше, чем текущее значение впадины, деленное на 1,5, то calibrate()
вызывается, что позволяет функции автоматически выполнять калибровку.
Используя исторический минимакс:
var arrayLength = 1000
var histArray[arrayLength]
define historyArray(f):
histArray.pushFront(f) //adds f to the beginning of the array
define max(array):
// finds maximum element in histArray[]
return max
define min(array):
// finds minimum element in histArray[]
return min
define function scale:
// maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]
main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element