Є два способи втілити це, якими я користуюся зазвичай. Я завжди працюю з даними в реальному часі, тому це передбачає постійне введення даних. Ось псевдо-код:
Використання навчальної 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