Вы находитесь на странице: 1из 3

El Formato .

WAV
El formato .wav es un formato de archivo de audio, habitualmente sin compresión,
introducido en 1991 por las empresas Microsoft e IBM. Fue el formato nativo del sistema
operativo Windows para el almacenamiento de audio digital y uno de los más utilizados en
las computadoras hogareñas debido a la popularidad de Windows y a la gran cantidad de
software escrito para dicho sistema operativo.

- Endianness

El concepto de Endianness se refiere a la convención utilizada para la interpretación de un


dato almacenado en más de un Byte. Suponiendo que un número de cuatro cifras, que se
representa con dos Bytes, se almacena en dos posiciones de memoria consecutivas en una
computadora, indicadas con 0 y 1 en la tabla siguiente, existen dos convenciones para la
interpretación del mismo. En una de ellas, llamada Big Endian, el Byte de mayor significación
se almacena en la dirección de memoria más baja, mientras que en la otra, llamada Little
Endian, es a la inversa.

DIRECCIÓN de MEMORIA 0 1
DATOS ALMACENADOS 45 23
INTERPRETACIÓN 4523
BIG ENDIAN
INTERPRETACIÓN 2345
LITTLE ENDIAN

Los datos de audio en un archivo .wav utilizan la convención Little Endian.

- Estructura básica de un archivo .wav

La organización de un archivo .wav responde a una estructura llamada RIFF (Resource


Interchange File Format) que agrupa los bytes del archivo en grupos llamados ‘chunks’. Cada
chunk tiene una cabecera [header chunk] a lo cual siguen bytes de datos [data chunk bytes].
La cabecera se divide a su vez en dos partes que serán referidas como ChunkID y
ChunkDataSize. El ChunkID es un grupo de Bytes que identifican el chunk y el ChunkDataSize
especifica la cantidad de Bytes restantes del chunk en cuestión. Un archivo .wav tiene un
chunk cuya cabecera tiene 8 bytes, los primeros cuatro bytes, el ChunkID, tiene siempre los
bytes 0x52 0x49 0x46 0x46 que son, en BigEndian, las letras RIFF en ASCII. Siguen otros
cuatro Bytes que indican el número restante de Bytes en el archivo, por ejemplo, 0x2A 0x0E
0x00 0x00, este dato se interpreta en ‘little endian’, es decir 0x00 0x00 0x0E 0x2A, lo que
indica que hay 3626 bytes restantes, sumando los 8 de la cabecera da el total de bytes del
archivo, 3633 en este ejemplo. Los siguientes cuatro bytes, que ya son bytes de datos del
chunk, indican el tipo particular de archivo RIFF, en el caso de los archivos .wav los bytes
son precisamente 0x57 0x41 0x56 0x45, que en orden Big Endian y con el código ASCII
muestran la secuencia de caracteres WAVE.

Los archivos .wav tienen a continuación dos subconjuntos de bytes llamados ‘subchunks’
cuyos identificadores son “fmt “ y “data”. Se utiliza la convención Little Endian salvo para los
primeros cuatro Bytes de cada subchunk (donde rige Big Endian). Como ejemplo del
primero, donde se indica entre paréntesis el resultado de la interpretación Little Endian y
donde todos los números son hexadecimales, véase:

66 6D 74 20 - "fmt " (Big Endian)


10 00 00 00 (00 00 00 10) - tamaño del resto del subchunk (16)

01 00 (00 01) - formato PCM (cuantización lineal)


02 00 (00 02) - número de canales
44 AC 00 00 (00 00 AC 44) - sampling rate 44100
10 B1 02 00 (00 02 B1 10) - Byte rate: 176400 (44100x4)
04 00 (00 04) - Block align (bytes x muestra, tomando todos los canales)
10 00 (00 10) - bits por muestra: 16

Y del segundo:

64 61 74 61: "data" (Big Endian)


C8 0D 00 00: (00 00 0D C8) - 3528 (882 muestras x 4)

00 00 00 00 - muestra 1, canal izq. y der. Respectivamente


05 08 05 08 (08 05 -> 2053 en decimal) – muestra 2, ambos canales
02 10 02 10 (10 02 -> 4098 en decimal) – muestra 3, ambos canales
EE 17 EE 17 (17 EE -> 6126 en decimal) – muestra 4, ambos canales, etc...

Estos valores corresponden a una sinusoide a 440Hz, con fase inicial cero y
máxima amplitud (16 bits de profundidad). Entonces, la fórmula para
calcular el valor de la n-ésima muestra es: 32767*sen(2pi*440*n/44100) – o
por 32768 en caso de que el seno de negativo.
A continuación se describe el esquema general de un archivo .wav. La
primera columna indica la cantidad de Bytes precedentes (el ‘offset’) y la
segunda columna la cantidad de Bytes de la información que corresponda.

0 4 ChunkID Contiene las letras "RIFF" en ASCII


(0x52494646 en big-endian)
4 4 ChunkSize Cantidad de Bytes restantes en el chunk
8 4 Format Contiene las letras "WAVE"
(0x57415645 en big-endian)
12 4 Subchunk1ID Contiene las letras "fmt "
(0x666d7420 big-endian form).
16 4 Subchunk1Size Tamaño del resto del subchunk
20 2 AudioFormat Valores diferentes de 1 indican compresión
22 2 NumChannels Mono = 1, Stereo = 2, etc.
24 4 SampleRate 8000, 44100, etc.
28 4 ByteRate == SampleRate*NumChannels*BitsPerSample/8
32 2 BlockAlign == NumChannels * BitsPerSample/8
34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.

El subchunk "data" contiene el tamaño de los datos y al sonido mismo:

36 4 Subchunk2ID Contiene las letras "data"


(0x64617461 big-endian form).
40 4 Subchunk2Size == NumSamples*NumChannels*BitsPerSample/8
44 * Data Las muestras del sonido.

Вам также может понравиться