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

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

2
Вам придется значительно расширить свой вопрос, чтобы он не закрывался. У вас есть код? Любая конкретная проблема? Любой O/S в виду?
добавлено автор Joe, источник

3 ответы

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

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 (i.e. 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 , чтобы напишите их в правильный файл.

3
добавлено
Я не понимаю. В моем ответе есть достаточное содержание, чтобы помочь плакату решить его домашнюю проблему. Мой ответ кажется эквивалентным для разматывания, но идет немного дальше, также намекая на то, как найти аудиоданные внутри WAV-файла. Можете ли вы объяснить, почему вы находите ссылку нежелательной, пожалуйста?
добавлено автор simonc, источник
Нет ссылок для ссылок
добавлено автор John Dvorak, источник
Я думаю, что без ссылки есть недостающие ключевые части. Например, формат файла .wav . Можете ли вы скопировать интересные части здесь?
добавлено автор John Dvorak, источник

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

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

To do the same for 2 channel 16 bit interleaved audio you just declare all 3 buffers as short* and instead malloc(numsamples*2)

1
добавлено
уверенный вещь! принимайте и/или повышайте ответы, если вам нравятся (esp mine ;-))
добавлено автор Bernd Elkemann, источник
Я думаю, что у меня есть своя идея о том, что нужно сделать. Спасибо вам за помощь.
добавлено автор vaibh24, источник

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

  1. Open the two output files (using fopen()).
  2. Loop over the sample data, and for each sample:
    • Put the left channel's value in the first file
    • Put the right channel's value in the second file
  3. Close the files.
0
добавлено