Se puede obtener un estimador suavizado simple simplemente mediante una combinación lineal del nuevo valor muestreado y el valor suavizado existente:
smoothed_value := (1 - alpha) * smoothed_value + alpha * new_value
Por ejemplo, si alfa es 0.20 (20%), entonces tenemos:
smoothed_value = 0.8 * smoothed_value + 0.2 * new_value
En otras palabras, tome el 80% del valor existente y el 20% de la nueva muestra.
Al hacer algo de manipulación algebraica, podemos demostrar que también se puede calcular de esta manera:
smoothed_value := smoothed_value + alpha * (new_value - smoothed_value)
En otras palabras, actualice el valor suavizado agregándole solo la fracción alpha
del paso entre este y el nuevo valor.
Si hace todo entero y usa una potencia de dos para alpha
o un múltiplo de una potencia de dos, puede hacerlo de manera muy eficiente incluso en procesadores poco sofisticados que no admiten la multiplicación o la división. Por ejemplo, supongamos que queremos hacer alpha
3/16. En C, podemos multiplicar por 3 y dividir por 16 con turnos y adiciones:
delta = new_value - smoothed_value
smoothed_value += ((delta << 1) + delta) >> 4;
Este tipo de suavizado exhibe decaimiento exponencial. Es similar a procesos en la naturaleza como, oh, la forma en que un circuito RC se carga o descarga para rastrear los cambios en el voltaje aplicado.
El parámetro alpha
está en el rango [0, 1]. Si es cero, los nuevos valores se ignoran; no hay convergencia Si es 1, entonces smoothed_value
no se suaviza en absoluto; sigue new_value
al instante. Los valores bajos cercanos a cero proporcionan una convergencia lenta.
Este algoritmo, o algo muy similar, se usa en el protocolo TCP para establecer una base para el tiempo de espera de retransmisión basado en las mediciones del tiempo de ida y vuelta de la conexión.