Desentrelazado de un archivo WAV de 2 canales en dos archivos de texto que contienen datos sin procesar

Tengo una tarea basada en el problema mencionado anteriormente. La frecuencia de muestreo y el tamaño por muestra serían conocidos en el problema. Solo necesito una idea sobre el tipo de encoding que se requeriría para esto.

La frecuencia de muestreo es irrelevante para esto, pero el tamaño por muestra (normalmente 8 o 16 bits por canal por muestra) decide qué tamaño de puntero debe usar, por lo que aquí está el ejemplo de 8 bits por canal:

char* reader = begin; // interleaved char* left = malloc(numsamples); // de-interleaved char* right = malloc(numsamples); while(reader 

Para hacer lo mismo con el audio intercalado de 2 canales y 16 bits, simplemente declare los 3 buffers como short* y en su lugar malloc(numsamples*2)

Utilice una especificación de formato de archivo como esta para ver cómo leer el encabezado del archivo, determinar la frecuencia de muestreo, la velocidad de bits, etc.

 The canonical WAVE format starts with the RIFF header: 0 4 ChunkID Contains the letters "RIFF" in ASCII form (0x52494646 big-endian form). 4 4 ChunkSize 36 + SubChunk2Size, or more precisely: 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) This is the size of the rest of the chunk following this number. This is the size of the entire file in bytes minus 8 bytes for the two fields not included in this count: ChunkID and ChunkSize. 8 4 Format Contains the letters "WAVE" (0x57415645 big-endian form). The "WAVE" format consists of two subchunks: "fmt " and "data": The "fmt " subchunk describes the sound data's format: 12 4 Subchunk1ID Contains the letters "fmt " (0x666d7420 big-endian form). 16 4 Subchunk1Size 16 for PCM. This is the size of the rest of the Subchunk which follows this number. 20 2 AudioFormat PCM = 1 (ie Linear quantization) Values other than 1 indicate some form of compression. 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 The number of bytes for one sample including all channels. I wonder what happens when this number isn't an integer? 34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc. 2 ExtraParamSize if PCM, then doesn't exist X ExtraParams space for extra parameters The "data" subchunk contains the size of the data and the actual sound: 36 4 Subchunk2ID Contains the letters "data" (0x64617461 big-endian form). 40 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8 This is the number of bytes in the data. You can also think of this as the size of the read of the subchunk following this number. 44 * Data The actual sound data. 

Después de eso, encontrará datos de pcm en bruto, intercalados como

 [sample 1 ][sample 2 ] [s1,ch1][s1,ch2][s2,ch1][s2,ch2] 

Puede abrir un archivo de texto por muestra en modo de escritura, binario, luego recorrer los datos de audio, leer los bytes de una muestra / canal y luego usar fprintf o fwrite para escribirlos en el archivo correcto.

Suponiendo que haya cargado los datos WAV en la memoria, todo lo que necesita hacer es:

  1. Abra los dos archivos de salida (usando fopen() ).
  2. Recorra los datos de la muestra, y para cada muestra:
    • Pon el valor del canal izquierdo en el primer archivo.
    • Ponga el valor del canal correcto en el segundo archivo
  3. Cierra los archivos.