Получение реальных значений из файла WAV c++

Итак, я работаю над очень важным школьным проектом. Теперь я знаю, как прочитать все из файла WAVE, включая данные. Дело в том, что мне нужны не только реальные~ значения данных, но и знак. Файл 16 бит/с, но я понятия не имею, как получить фактическое значение, например, -365 или +19934. Это то, что я делаю до сих пор

leer = fread(&sbyte, 1, X, аудио);

Какое число поставить вместо «Х». 4?

Я определил sbyte как знаковый символ, но подписанный символ идет только от -128 до 127, что означает, что он не дает мне необходимой информации.

Мне нужны эти цифры для анализа. Если бы вы могли помочь мне здесь, потому что я слишком потерян.

Спасибо.


person Luxk    schedule 23.04.2013    source источник
comment
leer = fread(&sshort, 2, X, аудио)   -  person Lefteris E    schedule 23.04.2013
comment
Какие еще типы кроме char вы знаете? Также поищите sizeof. Это может быть полезно.   -  person Alexey Frunze    schedule 23.04.2013
comment
16 бит на выборку означает, что 2 байта на выборку, очевидно, что символ равен 1 байту, поэтому он не подходит. Помните, что волновые данные хранятся в формате Little Endian, поэтому короткое замыкание должно быть идеальным.   -  person Lefteris E    schedule 23.04.2013


Ответы (2)


На этой странице: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

16-битные выборки хранятся как целые числа со знаком в дополнении до 2 в диапазоне от -32768 до 32767.

В этом случае вы хотите использовать 16-битный тип данных, который в C++/C является short.

short data;
fread(&data, sizeof(short), 1, audio);

Это прочитает для вас 2 байта и сохранит их в файле short. Вы захотите сделать это в цикле

person Salgar    schedule 23.04.2013
comment
Это сработало! Спасибо! Хотя у меня все еще есть сомнения. Цикл, который я использую, выглядит так: for (i = 0; i < csize; i++), где csize — длина данных. Это правильно или вместо этого я должен иметь i=i+2, так как я читаю 16 бит, а не 8 бит, как раньше. - person Luxk; 24.04.2013
comment
Привет, да, вы можете иметь i+=2 вместо i++ и убедиться, что fread(&data, sizeof(short), 1, audio+i); В качестве альтернативы, взгляните на аргументы для fread, 3-й аргумент — это количество данных для чтения. По сути, вы можете поместить туда csize, если вы выделили достаточно места для data. т. е. аналогично тому, что сказал LefterisE ниже. - person Salgar; 24.04.2013

Во-первых, вам нужно прочитать header информацию в первых 44 байтах, как видно из следующей ссылки: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

Оттуда вы можете получить BitsPerSample и преобразовать прочитанные байты в целое число short, если оно равно 16, char, если оно равно 8, или int, если оно равно 32.

person fatihk    schedule 23.04.2013