У меня есть задание, основанное на вышеуказанной проблеме. Частота выборки и размер выборки будут известны в этой проблеме. Мне просто нужна идея о кодировании, которое потребуется для этого.
Частота дискретизации для этого не имеет значения, но размер каждой выборки (обычно 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 в память, все, что вам нужно сделать, это:
fopen()
).