Ada dua cara untuk mengimplementasikan ini yang saya gunakan secara umum. Saya selalu bekerja dengan data realtime, jadi ini mengasumsikan input terus menerus. Inilah beberapa kode semu:
Menggunakan minmax yang bisa dilatih:
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]
Fungsi ini mengharuskan Anda melakukan fase pelatihan awal (menggunakan calibrate()
) atau melatih kembali baik pada interval tertentu atau sesuai dengan kondisi tertentu. Misalnya, bayangkan fungsi seperti ini:
define function outBounds (val, thresh):
if val > (thresh*peak.value()) || val < (trough.value() / thresh):
calibrate()
puncak dan palung biasanya tidak menerima nilai, tetapi jika outBounds()
menerima nilai yang lebih dari 1,5 kali puncak saat ini atau kurang dari palung saat ini dibagi dengan 1,5, maka calibrate()
disebut yang memungkinkan fungsi untuk melakukan kalibrasi ulang secara otomatis.
Menggunakan minmax historis:
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