# [Aporte] Conversor de archivos WAV a TXT



## mp005 (Ago 5, 2014)

Buenas tardes queridos compañeros del foro. Hoy no vengo a reclamar el conocimiento de nadie sino a colaborar con esta comunidad (y otras también) que tanto me han ayudad y aportan a la sociedad a través de la inteligencia colectiva.
En este caso les traigo un pequeño programita que hice en una macro de Excel (porque era el lenguaje de programación que dispongo en mi lugar de trabajo en mi tiempo libre).

Sin más preámbulos, el programa es un decodificador de archivos de audio WAV.
Para entender qué es lo que hace, primero debemos saber cómo se graban los sonidos en la PC. No quiero entrar en mayores detalles, pero básicamente para poder grabar sonidos hay que convertir la presión sonora en pulsos eléctricos.
Para ello se necesita de un transductor. En este caso el transductor es el micrófono. Existen distintos tipos de micrófonos, por nombrar los más comunes, están los dinámicos o de bobina móvil que en esencia es un parlante usado al revés los electret que funcionan como una especie de capacitor.
Las señales eléctricas son muy débiles por lo que requieren de un preamplificador. Hasta aquí la señal eléctrica generada es analógica, es decir que su forma es continua y tiene la misma forma que las ondas de audio que las generan.
La señales llegan a la placa o tarjeta de audio de la PC, la cual no es otra cosa que un conversor analógico/Digital (A/D) de una determinada cantidad de bits. En general son de 8 bits. El conversor transforma esta señal continua en una muestra discreta de puntos en el tiempo. La frecuencia de muestreo de la señal en general es de 44.1Hz, esto es el doble que la máxima frecuencia audible y no es casualidad. También hay frecuencias superiores, pero cuanto mayor la frecuencia, tanto menor es el periodo de muestreo, por lo que la señal es más fiel, pero el archivo generado es más pesado.

Pero qué es lo que me da el programa?
Al cargarle un archivo de audio, el programa genera un archivo txt donde dice información sobre cómo se grabó ese archivo de audio… la frecuencia de muestreo, si la señal es mono o estero, los bits de conversor y algún otro dato.
Luego de esto muestra los datos recopilados. Si la frecuencia de muestreo es de 44.1KHz, el tiempo entre muestra y muestra es de 1/44.1KHz=0.02268ms=22.68us (microsegundos). Si el conversor es de 8bits la señal se divide en 256 niveles, esto es de 0 a 255. Como la presión sonora puede ser positiva o negativa, se asume como silencio el nivel 127. El pico máximo no puede superar el valor 255 y el mínimo el 0, de otro modo satura el conversor y se deforma la señal de audio.

Los datos del archivo generado pueden copiarse y pegarse en una hoja de Excel y observar la forma de la onda. Además con un poco de habilidad en la programación se puede modificar el programa y aplicar filtros, derivar, integrar, etc.

Este proyecto abre las puertas de la imaginación. Por ejemplo (con la precaciones correspondientes para evitar quemar todo) podríamos grabar como audio las señales analogicas de un generador de señales, luego llevar el archivo de audio a la PC y con este programa ver la forma de la onda, su periodo y realizar un análisis como si fuese un osciloscópio.
En mi caso particular, grabe el audio del chispazo de la bujia de un karting, simplemente con una pinza cocodrilo, un jack de audio y un reproductor de mp3 viejo. Como digo, el limite es la imaginación.

Espero les sea de utilidad en sus proyectos, que lo modifiquen y mejoren y adapten.
Saludos

Matías


Adjunto el archivo de Excel y dos imágenes del análisis del ruido de una bujía de karting.
Saludos!



Les adjunto el codigo fuente de la macro en un archivo txt


----------



## Dr. Zoidberg (Ago 6, 2014)

Supongo que será del orden de 1 a 2... en promedio. Cada canal de un WAV calidad CD tiene 2 bytes. Si cada número codificado en binario (en dos bytes)  tiene - en promedio - 4 dígitos y vá 1 ASCII por cada dígito (suponiendo que el programa use ASCII y no unicode), entonces van 4 bytes del TXT por cada 2 bytes del WAV... y el TXT es *al menos* 2 veces mas grande que el WAV (supongo que la realidad será del orden de 2.5 a 3 veces mas grande)
Como te imaginarás, depende mucho de la grabación que estés usando, del nivel de compresión, etc, etc...


----------



## mp005 (Ago 6, 2014)

Los archivos WAV guardan la info en la forma más explicita, sin mediar ningún tipo de compresión. Los archivos tienen un encabezado de 45 caracteres donde se guarda la configuración del archivo de audio (bits, frecuencia, etc). Los demás caracteres son los datos almacenados. Hagan la prueba de abrir un archivo WAV con el NotePad y verán lo que les digo (que no sea un archivo muy grande sino tarda mucho en abrirlo). Luego de que en el encabezado dice "data", 4 caracteres más adelante comienzan a guardarse los datos. La primera vez que me di cuenta de lo que quería decir cada cosa sentí que había decodificado la Piedra Rosetta jajaja. Como el conversor A/D de audio es de 8 bits, cada valor medido se guarda como un caracter ASCII que también es de 8 bits. Si estaríamos programando un PIC en lenguaje C, el sonido se declararía como "signed char sonido", es decir una variable de 8 bits con signo almacenada como texto, esto quiere decir que se asignan 127 valores positivos y 127 negativos, si hay silencio, se va a medir el nivel 127, esto en ASCII es "⌂", si fuese el nivel 64 sería la conocida "@" e implicaría una presión negativa, si fuese 164 el caracter en el archivo sería "ñ", y así con todos los caracteres visibles y no visibles (como retorno de carro). En el notepad solo se verán los caracteres visibles, por eso en el código fuente, cuando se abre el archivo de audio hay que abrirlo como Binary.

Entiendo que esto no responde la pregunta respecto del tamaño, pero vamos de a poco. Dado que el archivo se escribe con caracteres ASCII y que cada caracter ASCII representa un valor de 8 bits o sea un Byte, en el encabezado tenemos 45 caracteres, o sea, 45bytes (solo en el encabezado y este es el tamaño mínimo del archivos WAV), luego cada caracter ASCII que mida el conversor será 1byte más. Supongamos que muestrea 1500 valores, entonces el archivo WAV sera de 45+1500=1545bytes que divido por 1024bytes/KByte nos da 1,5Kbyte.

Para saber el tamaño del archivo generado hay que contar la cantidad de caracteres. Sin duda este valor es mayor en el archivo generado puesto que por cada punto de muestreo el programa te dice más datos que el archivo WAV: el número de la muestra, el tiempo en segundos de la muestra y su valor. 

Probando... si convierto un archivo WAV de 321KB obtengo un archivo de texto de 8.99MB, pero son más datos respecto de 328889 muestras.

Adjunto una imagen del archivo WAV abierto con el NotePad donde se puede ver resaltado el encabezado. Lo demás son los datos, donde a simple vista se puede apreciar el patrón de repetición de los caracteres. Esto es porque entre muestra y muestra (22.67us) la señal no varía. Se hace fácilmente visible con esto cómo trabaja un compresor de archivos también, ya que en lugar de escrbir por ejemplo @@@@@@@@@@@@@@@@@@@@ y ocupar 20 bytes, escriben 20@ y reducen significativamente el tamaño (no digo que ese sea literalmente el funcionamiento de un compresor, es solo ejemplificativo).

Espero haber sido de utilidad.
Saludos

Matías





Dr. Zoidberg dijo:


> Supongo que será del orden de 1 a 2... en promedio. Cada canal de un WAV calidad CD tiene 2 bytes. Si cada número codificado en binario (en dos bytes)  tiene - en promedio - 4 dígitos y vá 1 ASCII por cada dígito (suponiendo que el programa use ASCII y no unicode), entonces van 4 bytes del TXT por cada 2 bytes del WAV... y el TXT es *al menos* 2 veces mas grande que el WAV (supongo que la realidad será del orden de 2.5 a 3 veces mas grande)
> Como te imaginarás, depende mucho de la grabación que estés usando, del nivel de compresión, etc, etc...




Cada muestra ocupa dos bytes si el audio se grabó como STEREO. Si esta como MONO es solo un byte. El programa también te dice, eso, si es ESTEREO o MONO y el valor en el parlante izquierdo y derecho.

Saludos


----------



## Dr. Zoidberg (Ago 6, 2014)

mp005 dijo:


> Cada muestra ocupa dos bytes si el audio se grabó como STEREO. Si esta como MONO es solo un byte.


Naaaa.... eso es si está digitalizdo solo con 8 bits, que no es el caso de calidad CD que son 16 bits por muestra y por canal


----------



## mp005 (Ago 7, 2014)

Dr. Zoidberg dijo:


> Naaaa.... eso es si está digitalizdo solo con 8 bits, que no es el caso de calidad CD que son 16 bits por muestra y por canal



Me retracto. Por lo menos con los archivos de audio que yo trabajé cuando hice el programa eran como mencioné, pero es cierto que nunca analicé una canción de CD por ejemplo. Por eso dejo el archivo y codigo fuente para que se mejore. 
Saludos


----------



## prafamaju (Jul 9, 2021)

Estimados amigos, trabajo en acústica ambiental haciendo medidas con diversos tipos de sonómetros, determinando Leq, 24h, Ld, Le, Ln, Lden, etc. Pero me surje la idea de hacer grabaciones de audio de esos paisajes sonoros mediante grabadora acústica de pequeñas dimensiones y resistente a la intemperie que permiten grabar hasta 200 horas en formato wav, en vez de hacer mediciones con un sonómetro, que tiene mucha menos autonomía.
He abierto los ficheros WAV con Matlab, obteniendo un fichero txt de una columna con 360000 datos (teniendo en cuenta que la frecuencia de muestreo del fichero es de 24000 Hz y 16 bits, y que el audio es de solo 15 segundos). Mi pregunta es: ¿Qué representan exactamente esos datos del fichero txt, presión sonora, señal eléctrica? y por tanto ¿Qué unidades tienen? 
¿Alguien podría responderme?

Gracias


----------



## Eduardo (Jul 10, 2021)

prafamaju dijo:


> Estimados amigos, trabajo en acústica ambiental haciendo medidas con diversos tipos de sonómetros, determinando Leq, 24h, Ld, Le, Ln, Lden, etc. Pero me surje la idea de hacer grabaciones de audio de esos paisajes sonoros mediante grabadora acústica de pequeñas dimensiones y resistente a la intemperie que permiten grabar hasta 200 horas en formato wav, en vez de hacer mediciones con un sonómetro, que tiene mucha menos autonomía.
> He abierto los ficheros WAV con Matlab, obteniendo un fichero txt de una columna con 360000 datos (teniendo en cuenta que la frecuencia de muestreo del fichero es de 24000 Hz y 16 bits, y que el audio es de solo 15 segundos). Mi pregunta es: ¿Qué representan exactamente esos datos del fichero txt, presión sonora, señal eléctrica? y por tanto ¿Qué unidades tienen?
> ¿Alguien podría responderme?
> 
> Gracias


Representa la salida del conversor analógico digital (ADC), en este caso es un entero con signo de 16bits, es adimensional.

Si querés relacionarlo con la presión sonora tenés que hacer una comparacion de los valores leidos respecto a un sonómetro.
Con varios inconvenientes:
- El micrófono de la grabadora es direccional, la ganancia dependerá de la dirección del sonido.
- La respuesta en frecuencia de la grabadora no es plana.
- Si incorpora un control automático de ganancia, vas muerto porque te cambia la ganancia en función de la intensidad de sonido.


----------



## Eduardo (Jul 10, 2021)

Aclaro mejor el primer párrafo.
Un entero de 16bits es como está guardado en el .wav,  Matlab al leer te lo pasa a punto flotante y = ADC/ 32768.  ,  resultando -1<= y < 1


----------



## prafamaju (Jul 13, 2021)

Eduardo dijo:


> Aclaro mejor el primer párrafo.
> Un entero de 16bits es como está guardado en el .wav,  Matlab al leer te lo pasa a punto flotante y = ADC/ 32768.  ,  resultando -1<= y < 1


Muchas gracias, Eduardo.


----------

