Обратное перемещение 2-канального файла WAV в два текстовых файла, содержащих необработанные данные

У меня есть задание, основанное на вышеуказанной проблеме. Частота выборки и размер выборки будут известны в этой проблеме. Мне просто нужна идея о кодировании, которое потребуется для этого.

Частота дискретизации для этого не имеет значения, но размер каждой выборки (обычно 8 или 16 бит на канал на выборку) определяет размер указателя, который вам нужно использовать, поэтому здесь пример 8 бит на канал:

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

Чтобы сделать то же самое для 2-канального 16-битного чередующегося аудио, вы просто объявляете все 3 буфера как short* и вместо этого malloc(numsamples*2)

Используйте спецификацию формата файла, такую ​​как этот, чтобы увидеть, как читать заголовок файла, определять частоту дискретизации, скорость передачи и т. Д.

 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. 

После этого вы найдете необработанные данные pcm, чередующиеся как

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

Вы можете открыть текстовый файл для каждого образца в режиме записи, в двоичном режиме, затем перебрать аудиоданные, прочитать байты для одного образца / канала, а затем использовать fprintf или fwrite чтобы записать их в правильный файл.

Предполагая, что вы загрузили данные WAV в память, все, что вам нужно сделать, это:

  1. Откройте два выходных файла (используя fopen() ).
  2. Перебирайте образцы данных и для каждого образца:
    • Поместите значение левого канала в первый файл
    • Поместите значение правильного канала во второй файл
  3. Закройте файлы.