Las Bambalinas de la Información: una Mirada Profunda a la Teoría de la Comunicación

Hoy en día estamos acostumbrados a ver una retransmisión en vivo de los Juegos Olímpicos desde Pekín, pero hasta hace algo menos de cien años algo así era impensable. Esto es posible gracias a la teoría de la información, una propuesta dentro de la rama de la probabilidad que se centra en el estudio del procesado, representación y cuantificación de datos en la transmisión de información. En este artículo veremos cómo los datos pueden representarse universalmente, lo que es muy útil para transmitir, recibir y comprender mensajes. El origen de esta potente herramienta de telecomunicación se la debemos al trabajo teórico de los matemáticos del siglo XX.

La teoría de la información surgió en los años veinte, cuando Andrei Markovi y Ralph Hartley comenzaron a investigar sobre cómo cuantizar la información. Treinta años después, en 1949, las grandes aportaciones de Claude E. Shannon y Warren Weaver completaron esta teoría. Poco tiempo después, Alan Turing desarrolló un esquema de una máquina capaz de procesar los datos, consagrando así la llamada teoría matemática de la comunicación.

El modelo propuesto por Shannon es un sistema general de comunicación donde el mensaje parte de una fuente y llega al receptor a través de un canal. Para que la información pueda transmitirse correctamente, esta debe ser codificada por el emisor para que pueda viajar por el canal y posteriormente ser decodificada por el receptor para obtener de vuelta el mensaje original. Seguro que recordáis haberlo estudiado en nuestra asignatura favorita del instituto, Lengua Castellana.

El modelo busca que esto se haga de la forma más rápida, económica y segura posible y puede usarse para transmitir cualquier tipo de información, ya sea una imagen, un sonido, un número o un texto. Es esencial que ambos actores tengan un código común para ser capaces de transmitir mensajes.
Además, puede que durante la transmisión exista algún tipo de interferencia (llamada ruido), por lo que es importante que se pierda la menor cantidad de datos posible.

Las máquinas también se equivocan

Imaginemos que tratamos de hablar con un compañero en una clase densa; puede que nuestras palabras se mezclen con las del profesor y nuestra voz no llegue clara. En esta situación queremos que, aunque nuestras palabras se vean ligeramente distorsionadas, se siga entendiendo el significado del mensaje. Este ruido también sucede en el campo de la informática, pues debido a imperfecciones del hardware algunos unos pasan a ser ceros, y viceversa.

Una forma simplificada de detectar estos errores es añadiendo un bit que marque la paridad del número de unos de la cadena de bits (0 si es par y 1 si es impar). De esta forma, el receptor comprueba la paridad del mensaje recibido y el bit que indica la paridad de la cadena enviada. Si no coinciden, se sabe que ha ocurrido un error. Este método es muy simple y hay muchos errores que no son detectables con él (si dos bits fuesen erróneos, no se detectaría). Sin embargo, para solucionar estos problemas, es común estructurar el mensaje en forma de matriz y asignar un bit de paridad a cada fila y a cada columna. Además, la cadena de bits de paridad de filas y columnas cuentan a su vez con un bit de paridad. Este método permite detectar el bit erróneo sin reenviar el mensaje. Por ejemplo, en la siguiente tabla se puede concluir que el bit marcado en rojo es erróneo ya que los bits de paridad de su fila y columna no coinciden.

Inspirándose en la idea del control de paridad, Marcel Golay en 1949 y Richard Hamming 1950 desarrollaron lo que hoy se conocen como códigos Hamming, un método para detectar y corregir errores. Esta técnica tiene distintas variantes, en función de la cantidad de datos y bits de error que contiene un paquete. Esto se define con la notación (a,b), siendo a la longitud del paquete y b el número de datos (bits) en el mismo. Por ejemplo, si se quieren representar números con 7 bits y se añade 1 de paridad, estaríamos hablando de un código (8,7).

Otro concepto importante es la distancia de Hamming, que cuantifica el número de bits distintos entre dos secuencias de la misma longitud. En este contexto, se usa para calcular el mínimo número de bits necesarios a cambiar para no detectar un error en la transmisión. Un bit de paridad es capaz de detectar errores si falla uno de los bits, pero si fuesen dos, el error no sería detectado; por lo tanto, un control de paridad no puede detectar un error con distancia de Hamming dos respecto a su mensaje original. Cuando Hamming desarrolló su técnica de detección de errores, el objetivo era encontrar la cantidad máxima de datos que podía tener una secuencia de tamaño fijo (es decir, minimizar el número de bits de control a la par que aumentaba el número de errores detectables), para poder transmitir la máxima cantidad de información de forma fiable.

Ahora que conocemos estos conceptos, veamos cómo funciona el código Hamming(7,4) para después extenderlo al resto de configuraciones. Con este método se pueden trasmitir 16 (24) mensajes diferentes y además tiene distancia 3. Esto lo hace muy eficaz para la detección de errores, pues es necesario que fallen 3 bits en un paquete de 7, algo muy improbable.

En caso de que haya un único bit erróneo, sería capaz de identificarlo y corregirlo. Si hubiera dos, se detectaría, pero no se podrían corregir. La distancia de un código coincide con el número de errores detectables, pero no con la capacidad correctora del código. Por ejemplo, si C={c1=(101),c2=(000)}C=\{c_1=(101), c_2 = (000)\} y recibimos c3=(100)c_3=(100), sabemos que es un error, pero no el mensaje original, ya que la didstancia de Hamming d(c1,c3)=1d(c_1,c_3)=1 y d(c2,c)=1d(c_2,c_)=1, y podría proceder de ambos con la misma probabilidad.

En el código de Hamming, los bits de error ocupan por convención las posiciones de las potencias de 2, en el caso del (7,4), las tres primeras (1=20,2=21 y 4=22)(1=2^0, 2=2^1 \text{ y } 4=2^2) y en el resto de las posiciones están los datos. El bit de error en la posición 1 se construye como un bit de paridad entre los datos de las posiciones 3, 5 y 7 (porque son los únicos que tienen un 1 en el último bit de su descomposición binaria); el de la posición 2 es la paridad de los datos en las posiciones 3, 6 y 7 (tienen un 1 en el bit central de su descomposición), y el de la posición 4 se calcula con los datos en las posiciones 5, 6 y 7 (pues cuentan con un 1 en el primer bit). En otras palabras, el bit de error de la posición 2k2^k es la paridad de aquellos datos que tengan un 1 en el bit kk de la descomposición binaria de su posición. Veamos un ejemplo.

Datos que se quieren transmitir:

Paquete final

Si escribimos xix_i para referirnos al bit en la posición xx:

P1=x3+x5+x7=0+1+1=0P2=x3+x6+x7=0+0+1=1P3=x5+x6+x7=1+0+1=0P1=x_3+x_5+x_7=0+1+1=0 \quad P2 = x_3+x_6+x_7=0+0+1=1 \quad P3=x_5+x_6+x_7=1+0+1=0

Paquete final

Para comprobar que el mensaje recibido es correcto, el receptor tan solo tendría que volver a calcular los bits de paridad y ver que coinciden con los recibidos. Pero supongamos que el trayecto ha sufrido turbulencias y el paquete recibido tiene un error en la posición 6.

Paquete recibido

Al calcular los bits se obtiene

P1=x3+x5+x7=0+1+1=0CORRECTOP1=x_3+x_5+x_7=0+1+1=0 \quad \text{CORRECTO}

P2=x3+x6+x7=0+0+1=1ERRORP2 = x_3+x_6+x_7=0+0+1=1 \quad \text{\textcolor{red}{ERROR}}

P3=x5+x6+x7=1+0+1=0ERRORP3=x_5+x_6+x_7=1+0+1=0 \quad \text{\textcolor{red}{ERROR}}

Efectivamente, se detecta el error, y para saber cuál es el bit que se debe corregir, basta con ordenar los bits de error de mayor a menor, poniendo un 1 si ha fallado y un 0 si es correcto. Así obtenemos la posición en binario del error.

Bit erroˊneo=(P3,P2,P1)=110, \text{Bit erróneo} = (P3,P2,P1)=110,

Por lo tanto, el receptor tan solo tendría que invertir el bit en la posición 6 para obtener el mensaje correcto:

De este modo se podría seguir trabajando con información correcta a pesar de que hubiera fallos en la transmisión.
Una vez sabemos cómo funciona Hamming(7,4), veamos el caso general. Este tiene su base en el álgebra lineal, y toma mensajes de nn bits como vectores de nn unos o ceros. Antes de entrar en qué son y cómo funcionan los códigos de Hamming, hay que entender qué es un código y, más específicamente, qué son los códigos lineales binarios.

En primer lugar, un código es un conjunto de vectores (mensajes) que tienen una determinada forma o estructura. Por ejemplo, si pensamos en el código que a un mensaje de n1n-1 bits se le añade un bit de paridad, los vectores que pertenecen a este código son los vectores de F2\mathbb F_2^* cuya última componente es la suma del resto de componentes, es decir, C={(x1,,xn)F2nx1++xn1=xn}C = \{ (x_1, \cdots , x_n) \in \mathbb F_2^n | x_1 + \cdots + x_{n-1}=x_n\}. Otro código muy simple es el código de repetición, que repite parte o todo el mensaje, en este caso, los vectores que pertenecen a este código son aquellos cuya primera mitad es igual a la segunda. Para mensajes de nn bits el código sería
C={(x1,,xn,xn+1,,x2n)F22nxi=xi+n}C' = \{ (x_1, \cdots , x_n, x_{n+1}, \cdots, x_{2n}) \in \mathbb F_2^{2n} | x_i = x_{i+n}\}.

Todos estos ejemplos son códigos lineales binarios. La nomenclatura lineal surge de la noción de que las operaciones en el espacio vectorial F2\mathbb F_2 entre elementos del código resultan en otro elemento del código. Es decir, son conjuntos de mensajes que se pueden escribir como el núcleo de una matriz HH. El primer ejemplo se obtiene con H=(1...11)H = (1 ... 1 | 1) y el segundo, con H=(II)H = ( \mathcal{I} | \mathcal{I} ). Este tipo de códigos son más fáciles de entender, pues se basan en seleccionar algunos bits del mensaje y asociarles un bit de paridad.

Para deducir la matriz HH que determina un código basta con escribirlo como el conjunto de soluciones de un sistema lineal en F2\mathbb F_2. Para hacer el proceso inverso, es decir, hallar el código al que representa una matriz H, escalonamos la matriz H, transformándola en H=(AI)H' = ( A | \mathcal I ). A partir de ahí, extraemos el sistema de ecuaciones lineales que nos la estructura del código. Por ejemplo, si A=(1,1,1)(1,0,1)(1,0,0)A = (1,1,1)(1,0,1)(1,0,0) el sistema lineal resultante sería el siguiente:

x1+x2+x3+x4=0x1+x3+x5=0x1+x6=0x_1+x_2+x_3+x_4=0 \quad x_1+x_3+x_5=0 \quad x_1+x_6=0

O lo que es lo mismo, si x1,x2,x3x_1,x_2,x_3 son los datos que queremos transmitir y x4,x5,x6x_4, x_5, x_6 sus bits de control: x4,x5,x6x_4,x_5,x_6 deben ser los bits de paridad de (x1,x2,x3),(x1,x3)(x_1,x_2,x_3), (x_1,x_3) y (x1)(x_1), respectivamente. Si codificamos (x1,x2,x3)(x_1, x_2, x_3) de esta forma, xx será parte del código y el receptor podrá detectar si se han producido errores. Recordemos que como cambiar las columnas no nos supone ningún inconveniente en estas matrices, siempre podremos asumir que los bits de control están al final, aunque en la práctica pueden organizarse como en el ejemplo del Hamming(7,4).

Como hemos visto, una vez definido qué código lineal se va a usar, su codificación es muy sencilla. Se trata de una multiplicación de matrices en F2\mathbb F_2 (cuerpo de Z2\mathbb Z_2). Sin embargo, el método de decodificación es mucho más complejo. Si y=x+ey = x + e es el vector recibido, donde xx es el enviado y ee el error cometido al transmitirlo, entonces para decodificarlo es necesario encontrar el xx perteneciente al código más parecido a yy (mayor número de bits iguales). De esta dificultad de decodificar los códigos lineales surgen los códigos de Hamming, ya que un subconjunto de ellos que sí son sencillos de decodificar. En este artículo no vamos a entrar más en el método de decodificación de códigos lineales, pero para el lector interesado, en la bibliografía hay artículos sobre el tema.

Dando forma al mensaje: los unos y los ceros

Uno se preguntará cómo distintos tipos de mensajes pueden ser unificados bajo una misma teoría. Con este objetivo, Shannon desarrolló un sistema de codificación que trata igual a una imagen, a un texto y a un sonido. Para él, lo más importante no era el contenido, sino el número de opciones que podían ser recibidas. Imaginemos que queremos adivinar un mensaje haciendo preguntas que únicamente pueden ser respondidas con un “sí” o un “no”. En esta situación, si tenemos únicamente dos posibles mensajes, bastaría con hacer la pregunta correcta para poder distinguirlos. Por el contrario, si en lugar de dos se tienen ocho opciones, el número mínimo de preguntas que debemos hacer para distinguir cada una de las opciones es tres. Supongamos que quieres saber cuál es el personaje favorito de Phineas y Ferb de tu amigo. Sabes que es uno de los ocho más relevantes, por lo que si eliges las preguntas adecuadas puedes ir dividiendo el grupo por la mitad hasta acertar. Un ejemplo puede ser el siguiente:

Como puede verse en la gráfica de la página anterior, si hacemos las preguntas correctas, las posibilidades se van reduciendo a la mitad con cada pregunta. Así, cualquier posible mensaje puede recibirse conociendo solo tres respuestas concretas. Si tanto receptor como emisor conocen qué preguntas se van a realizar, sólo es necesario comunicar tres valores de “sí” o “no”, que pueden ser representados con un 1 si la respuesta es afirmativa y con un 0 en caso contrario. Si en esta situación quisiéramos codificar “Perry”, enviaríamos ‘101’, porque Perry sí vive con Phineas, no es un niño y sí que es agente secreto.

Es fácil ver que la forma de llegar a cualquier respuesta con la menor cantidad de preguntas es dividiendo el grupo de posibles mensajes entre dos con cada respuesta. Si, por ejemplo, hubiera 32 posibles mensajes, ¿Qué potencia de dos es o se acerca más a 32? En este caso, claramente 5 ya que log2(32)=5\log_2(32) = 5, por lo que se necesitan cinco bits. Cada bit actúa como una respuesta (siendo 1 equivalente a “sí” y 0 a “no”). Por lo tanto, usamos un bit para cada respuesta a los cinco interrogantes. Si el logaritmo no es exacto, tomamos el primer entero por arriba, o sea, el techo del mismo. Si en lugar de 32 opciones hubiese 30, tras la segunda división podría quedar un grupo de ocho o siete opciones, para las cuales ya hemos visto que se necesitan otras tres preguntas. En total quedan cinco bits.

Nº preguntas=log2(x) \text{Nº preguntas} = \lceil \log_2(x) \rceil

Más adelante, veremos cómo esta misma idea es utilizada por los ordenadores para codificar desde las imágenes de la pantalla hasta la música de tus auriculares pasando por un e-mail. Los famoso unos y ceros del sistema binario (bits) provienen en esencia de respuestas a preguntas. Familiaricémonos algo más con este sistema.

Sistema binario

El objetivo original de los ordenadores era realizar cálculos complejos lo más rápido posible. Por razones de simpleza de hardware y lógica, se propuso usar el sistema de numeración en binario. Nosotros estamos acostumbrados a usar el sistema decimal, es decir, solo hay diez dígitos {0,1,2,3,4,5,6,7,8,9} y el valor de un número depende del valor en las distintas posiciones, es decir, 123=1102+2101+3100123=1*102+2*101+3*100. El sistema en base 2 sólo tiene dos dígitos {0,1}. Esto implica que para representar el 2 se necesitan dos dígitos (10). Esto facilita notablemente la implementación física, pues se resume a que en un cable haya potencial o no. Primero vamos a recordar cómo leer binario, y luego, a escribirlo.

Por ejemplo, si quisiéramos hallar el valor decimal de la codificación de Phineas en el ejemplo (111), realizaremos la misma cuenta que hacemos con la base decimal pero en base dos. Es decir, 122+121+120=4+2+1=71*22 + 1 *21+1*20= 4+2+1 = 7.
Ahora aprendamos como se escriben los números decimales en binario. Para ello realizaremos el proceso inverso con el 57:

57=228+128=214+014=27+07=23+13=21+11=20+1 57 = 2*28 +1 \qquad 28=2*14+0 \qquad 14=2*7+0 \qquad 7 = 2*3+1 \qquad 3 = 2*1 + 1 \qquad 1 = 2*0+1

Al llegar a cociente 0, terminamos y leyendo los restos de abajo a arriba obtenemos el número 111001.
Como hemos visto, esta idea parece funcionar muy bien, ya que codifica cualquier mensaje en un sistema universal aparentemente óptimo. Sin embargo, Shannon se dio cuenta de una paradoja. Según su fórmula, la cantidad de información de un mensaje depende de las consultas que se realicen. Volviendo al ejemplo de los personajes, si nuestra primera pregunta es “¿Es un agente secreto?”, y la respuesta es afirmativa, entonces está claro que es Perry, necesitando un solo bit para codificar los datos. Pero, ¿no habíamos dicho que la elección de un personaje tiene 3 bits de información, es decir, que se necesitan tres preguntas para hallarlo? Y es que Shannon se dio cuenta de que la cantidad aportada por cada respuesta depende de los candidatos antes y después de obtener la respuesta. Postuló que la información de una respuesta viene dada por la siguiente fórmula:
log2(candidatos antes/candidatos despueˊs)\log_2 (\text{candidatos antes/candidatos después})

Si empezamos preguntando: “¿Es Perry?”, y la respuesta es afirmativa, tendríamos 3 bits de información (log2(8/1)log_2(8/1)). Si preguntáramos por cada personaje en concreto, observaríamos que la información del mensaje no varía:
log2(8/7)+log2(7/6)+log2(6/5)+log2(5/4)+log2(4/3)+log2(3/2)+log2(2/1)=log2(8/77/66/55/44/33/22/1)=log2(8)=3 bits.\log_2(8/7)+\log_2(7/6)+\log_2(6/5)+\log_2(5/4)+\log_2(4/3)+\log_2(3/2)+\log_2(2/1)=\log_2(8/7\cdot 7/6 \cdot 6/5 \cdot 5/4 \cdot 4/3 \cdot 3/2 \cdot 2/1) = \log_2(8) = 3 \text{ bits.}

De esta nueva aportación, descubrimos que la cantidad de información de un mensaje no depende de su contenido sino del abanico de posibles opciones que podemos enviar. La teoría anterior funciona a la perfección con situaciones en las que los candidatos son equiprobables. Sin embargo, Shannon tuvo que retocar su fórmula para incluir el resto de casos, porque en la práctica no todas las alternativas son igual de probables.Por ejemplo, supongamos que tenemos una imagen de 1024 píxeles hecha únicamente con 4 colores (negro, blanco, gris claro y oscuro), diríamos que tiene una información de 2048 bits (2 bits por píxel, 4 opciones).

Si conocemos las probabilidades de que aparezca cada color, podemos elegir preguntas que reduzcan las opciones al mínimo en la mayor parte de casos posibles. En esta imagen sabemos que la mitad de los píxeles son blancos, un cuarto son gris oscuro, un octavo negro y otro octavo gris claro. Teniendo en cuenta estos datos, si estructuramos las preguntas de la siguiente forma y realizamos el cálculo del número de bits necesarios para transmitir la imagen, resulta que la información del mensaje es menor:

Primero calculamos cuántos bits son necesarios para identificar el color de un píxel. Esto depende del color del píxel: si es blanco, con uno nos bastará; si es gris oscuro, necesitaremos dos, y si es negro o gris clarito, necesitaremos tres. Como la mitad de las veces que preguntamos la respuesta será blanco, un cuarto de las veces un gris y un octavo de las veces el resto, realizando una media ponderada concluimos que se necesitan 1,5 bits de media por píxel, menos que en el caso equiprobable.

121+142+183+183=12+24+38+38=128=1,75<2\frac12 \cdot 1 + \frac 14 \cdot 2 + \frac 18 \cdot 3 + \frac 18 \cdot 3 = \frac 12 + \frac 24 + \frac 38 + \frac 38 = \frac{12}{8} = 1,75 <2

Luego, la información real de la imagen es de 1,751024=1792<20481,75 \cdot 1024 = 1792 < 2048 bits. Es decir, si hacemos las preguntas adecuadas podremos obtener la imagen haciendo tan sólo 1792 preguntas.
La fórmula general del caso anterior es la siguiente:

ipilog2(1/π) \sum_i p_i \log_2 ( 1/\pi)

La única diferencia con el caso equiprobable es que hace una media ponderada de la cantidad de preguntas que se necesitan para codificar cada caso, es decir, se suman el número de preguntas necesarias para adivinar un mensaje (log2(1/π))(\log_2(1/\pi)) y se multiplica por la probabilidad de esa opción (π)(\pi). La probabilidad aquí no representa más que (candidatos válidos/candidatos posibles), donde lo que importa no es que haya cuatro posibles opciones (colores), sino la probabilidad o proporción de cada uno.

Para entender esta situación, es importante saber que la cantidad de información es un valor matemático bien definido y medible, pues no se refiere al tamaño de los datos, sino a la probabilidad de que ese mensaje sea recibido. Cuanto menor sea la probabilidad de recibirlo, mayor cantidad de información tendrá asociada. De la misma manera, si se tiene la certeza de que un determinado mensaje será recibido, no será necesario preguntar nada para conocerlo, y por lo tanto su cantidad de información será cero.

Ahora que ya está dada toda la teoría y conoces el potencial de esta tecnología, vamos a ver lo importante que ha sido para nuestras vidas. Hoy en día es sabido por todos que el mundo está construido sobre Internet; si este cae, nuestra civilización tal y como la conocemos irá detrás. Lo usamos para acceder a nuestra cuenta bancaria, hablar con nuestra madre, ver vídeos de gatitos y echarnos unos LoLetes. ¿Y qué creéis que es todo esto? Al fin y al cabo, todas estas actividades no son más que un conjunto de información almacenada en un lugar y transmitida a través de distintos medios. Dicho mensaje debe ser manejado con un cierto código, y cuanto más óptimo sea el sistema, mejor. A continuación, veremos cómo se codifican tres tipos distintos de información, para que puedan ser manejados por un ordenador, que tan sólo es capaz de manejar series de unos y ceros.

####Conversión de texto a bits
Para la conversión de texto a bits, se diseñó en la década de 1960 la tabla ASCII (American Standard Code for Information Interchange), un conjunto de caracteres asociados con códigos numéricos. Gracias a esta tabla, ya no es necesario transmitir caracteres, si no que se transmiten números asociados a caracteres. Originalmente, los caracteres tenían únicamente siete bits, pero en la década de 1980 se extendió para que soportara más caracteres y fueron codificados con ocho bits (un byte). Veamos cómo funciona este sistema:

Se observa que estos caracteres alfanuméricos representan una pequeña parte de los que hay; otros muchos se usan principalmente en contextos de programación y desarrollo de software. La expansión de esta codificación son los caracteres Unicode, que incluyen desde el alfabeto chino o árabe hasta algunos emoticonos de WhatsApp.
Una vez conocemos esta tabla, podemos codificar nuestro primer mensaje. Supongamos que queremos mandar a un amigo lejano la famosa sentencia “Hola mundo!”. Para ello, debemos sustituir cada carácter por su pareja de la tabla: Mensaje en español: Hola mundo!

Mensaje traducido con ASCII: 72 111 108 97 32 109 117 110 100 111 33

Mensaje en binario: 01001000 01101111 01101100 01100001 00100000 01101101 01110101 01101110 01100100 01101111 00100001.

El ordenador emisor hará las conversiones que hemos realizado juntos y emitirá la cadena de bits. Por su parte, el ordenador receptor deberá dividir la cadena recibida en grupos de ocho bits y convertir cada número binario a su carácter asociado. De este modo se construyen las telecomunicaciones actuales, pudiendo transmitir cualquier texto sin importar su longitud.

Conversión de una imagen a bits

Primero, se debe entender que una imagen digital se compone de píxeles, y cada píxel puede representarse mediante un conjunto de bits que indica su color. Se empieza muestreando cada píxel de la imagen y asignando un valor numérico que represente su color. Las imágenes digitales suelen utilizar un modelo de color como RGB (Rojo, Verde, Azul) o escala de grises. Para esta explicación nos centraremos en el modelo RGB, donde cada píxel se representa mediante una mezcla de los tres colores primarios de la luz: el rojo, el verde y el azul. Cada uno de estos componentes puede tomar valores en un rango de 0 a 255, expresado en binario, lo que corresponde a 8 bits por componente, necesitando en total 24 bits por cada píxel. Es necesario hacer la codificación anterior para cada uno de los píxeles de la cuadrícula en la que se divide la imagen. Finalmente, se almacena la secuencia que representa los conjuntos de bits de cada píxel de la imagen. Para ser capaces de visualizar la imagen a partir de dicha secuencia, se debe tener un ordenador que sea capaz de convertir los bits en los colores deseados y representarlos en una pantalla.

####Conversión de un sonido a bits
La conversión de una canción en formato de audio a bits implica la digitalización del sonido, es decir, pasar de una onda analógica (continua) a una digital (discreta). Los sonidos que escuchamos en el día a día son ondas continuas, que si cambian de frecuencia deben pasar por todas las intermedias, mientras que las digitales sólo pueden cambiar dando pequeños saltos de frecuencia.

Como la sensibilidad de nuestro oído es limitada y no es capaz de detectar cambios pequeños en la frecuencia, el truco es medir la onda cada muy poco tiempo y cambiar la onda muchas veces por segundo. Cuanto más frecuentes sean las muestras, mejor será la representación del sonido (aunque también aumentará el espacio que ocupan en memoria). La frecuencia de muestreo se mide en “muestras por segundo” o hercios (Hz). Un valor común es 44.100 Hz (44,1 kHz) para audio de alta calidad; esto significa que se mide 44.100 veces por segundo la frecuencia del sonido. También significa que, al reproducirse, también se modificaría 44.100 veces por segundo la velocidad de vibración de la membrana. Para cada muestra se toma el valor de la amplitud de la onda de la señal y se cuantifica con un número representado en binario, tomando su valor analógico y redondeándolo al valor binario más cercano. La precisión de cuantificación se mide en “bits por muestra”. Por ejemplo, en un formato de audio de 16 bits, cada muestra se representa con 16 bits, lo que permite 216 (65.536) valores posibles. Cuanto más alto sea el número de bits de cuantificación, más precisa será la precisión de las mediciones del audio. Una vez grabadas y cuantificadas las muestras de la señal de audio, se almacenan como una secuencia de bits en un archivo de audio.

Cuando deseas escuchar la canción, un reproductor de audio interpreta los bits en el archivo y los convierte nuevamente en una señal eléctrica que se envía a los altavoces o auriculares para que puedas escuchar el sonido, haciendo vibrar la membrana a la frecuencia adecuada.

La magia de esta teoría es que, a pesar de no ser muy compleja de comprender, sus aplicaciones tienen un valor inmenso. Sin ella, las apasionadas cartas jamás habrían sido sustituidas por los fríos mensajes de WhatsApp, las divertidas veladas familiares por solitarias noches en vela tratando de ser el mejor entrenador Pokémon y los retratos sobre lienzo seguirían colgados con orgullo a la entrada de las casas en lugar de esos horribles selfies. Hay quién diría que fueron tiempos mejores. Nosotros no; nos gustan demasiado Phineas y Ferb y los vídeos de gatitos.

Bibliografía

  1. Information theory. Wikipedia. https://en.m.wikipedia.org/wiki/Information_theory
  2. C. E. Shannon. (Julio 1948). A mathematical theory of communication. The Bell System Technical Journal, vol. 27, no. 3, pp. 379-423. https://people.math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf
  3. Bit. Wikipedia. https://en.wikipedia.org/wiki/Bit
  4. C.E. Shannon y W. Weaver. (1964). The mathematical theory of communication. The University of Illinois press. https://monoskop.org/images/b/be/Shannon_Claude_E_Weaver_Warren_The_Mathematical_Theory_of_Communication_1963.pdf
  5. (17 de noviembre de 2008). Compresión de datos. Textos científicos. https://www.textoscientificos.com/informacion/compresion