14.7 Codificador (versión real)

  1. Sean L y H los límites del intervalo de codificación. Suponiendo 16 bits de precisión para estos registros, inicialmente L 0000 y H FFFF.
  2. Mientras existan símbolos a la entrada:
    1. Sea s el siguiente símbolo a codificar y p(s) su probabilidad. Sea PL(s) la probabilidad acumulada hasta el símbolo s - 1 y PH(s) la probabilidad acumulada hasta el símbolo s. Más formalmente,
             i=∑s-1
PL(s) =     p(i)
        i=0

      y

      PH (s) = PL(s)+ p(s).

      Seleccionar el siguiente intervalo de codificación haciendo

      H ← L + PH × R - 1

      y

      L ←  L+ PL × R,

      donde

      R = H - L + 1

      es el rango (tamaño) del intervalo de codificación.

  3. Ejecutar en un lazo los siguientes pasos:
    1. Si H < 8000 (nótese que siempre se cumple que L < H) emitir un 0.
    2. Si L 8000 emitir un 1 y restar a L y H el offset 8000 para que no se produzca un overflow: L L - 8000 y H H - 8000.
    3. Si 4000 L < H < C000 (los dos MSb’s de L son 01 y los de H son 10). En esta situación no podemos ejecutar la transmisión incremental y podríamos caer en un problema de underflow (los registros L y H podrían almacenar el mismo número). Para evitar esto, esplazaremos ambos registros haciendo L L - 4000 y H H - 4000 (nótese que esto es equivalente a haber restado el valor 8000 después de la expansión) y anotamos el número de ocasiones que permanecemos en esta situación. La próxima vez que transmitamos un bit (debido al proceso de transmisión incremental), transmitiremos además tantos bits contrarios a este como dicho número indique.*
    4. En cualquier otro caso, salir del lazo.
  4. Expandir el intervalo de codificación: L 2 × L y H 2 × H + 1.