Paso 4: decodificar el audio
Por lo tanto, ahora tenemos un montón de audio en nuestro dispositivo. ¿Cómo descifra? Basé mi código en un Android tutorial que muestra cómo grabar y luego reproducir. En mi caso, me aseguré de guardar ese audio como 16 bits PCM codificado. Muestrean a 44100hz. En Android (y en otros lugares, supongo) los datos PCM de 16 bits significa que cada muestra es un valor firmado de 16 pedacitos. Ya sólo nos importa la frecuencia, sólo necesitamos cuidado cuánto tiempo hay entre "cruces por cero". Un cruce por cero es cuando la señal pasa de positiva a negativa o viceversa. Un bit 0 estará representada por el espacio entre 2 cruces, y un 1 tendrá un cruce adicional en aproximadamente el mismo período de tiempo.Datos de tarjetas en cada pista comienza con un número (variable) de 0s, para establecer la frecuencia base. Lo que hice fue escuchar la primera muestra por encima de cierto umbral "tranquilo", luego contar el número de muestras entre cruces por cero. Ese número se convierte en el valor base para un 0. Puesto que estas tarjetas son birlados a mano, las frecuencias reales va a cambiar algo desde el inicio de la exploración hasta el final. Por lo tanto, hice un método sencillo que determina si el número de muestras desde el último cruce por cero está más cercano de la frecuencia base o doble de la frecuencia base (mitad del base número de muestras). A continuación ajusta la frecuencia base por consiguiente. Esto funciona bien, siempre y cuando los cambios entre cualquier dos bits lógicos son bastante pequeños. Y casi con toda seguridad.
Para detectar un cruce por cero, tenemos que mirar el signo de cada muestra y se compara con la señal de la muestra anterior. Si son diferentes (uno positivo, uno negativo) la señal cruza 0 entre las muestras.
El algoritmo básico es iterar a través de la matriz de bytes, extracción de muestras. Contar el número de muestras entre cruces por cero y comparar la cuenta de la cantidad esperada de un 0 o un 1.
Bueno, después de algunos saludando de mano, ahora tenemos una secuencia binaria de datos, que queremos volver a ASCII. La codificación más común (y el único escribe un controlador para) codifica cada carácter como un número de bits más un bit de paridad. En el caso de pista 2, es decir 4 bits para el carácter y 1 para paridad, hacer grupos de 5 bits. Los bits se leen desde el menos significativo a la mayoría, con el bit de paridad última. El bit de paridad se establece para que el número de 1s en el grupo impar. En mi aplicación, simplemente ignorar el bit de paridad, pero ayudaría a determinar si la lectura era buena o no. En la pista 1, es 6 bits para el carácter, además de la paridad.
El conjunto de caracteres de las pistas varían demasiado, pero ambos son subconjuntos de ASCII con alguna compensación. En el caso de pista 2, que sólo codifica algunos símbolos y números, el conjunto de caracteres comienza en 48, que es el código ASCII para "0". Así si conseguimos 0,0,0,0,1 como nuestro personaje, tenemos convertir en 0, añadir 48 y obtener 48. Asimismo, 1,0,0,0,0 es 1. 1 + 48 = 49 = ASCII "1".
Pista 1, el conjunto de caracteres comienza con "" (espacio) que es ASCII 32. Así que añadir 32 al valor numérico descifrado y conseguir nuestro juego de caracteres ASCII. Después de eso, tenemos los datos, así que todo que permanece es conectar la cola de interfaz de usuario.