Значения wav-файла
В C я использую библиотеку Libsndfile, чтобы помочь мне прочитать значения файла WAV, чтобы я мог сделать некоторые вычисления после них. Хотя, когда я получаю вывод файла, я не уверен, что означают эти числа. Почему цифры в миллионах? Сначала я думал, что это Гц, но это не имело смысла в моей голове. Информация, касающаяся файла WAV, представлена ниже. Под этим я использую функцию sf_read_int() для записи значений в память.
Что делает sf_read_int()? Это было получено из документации API libsndfile:
- Функции записи элементов в файл записывают данные в массив, на который указывает ptr, в файл. Параметр items должен быть целочисленным произведением количества каналов, иначе произойдет ошибка.
Я решил отобразить некоторые из этих огромных значений на графике, и это выглядит очень похоже на то, как должен выглядеть wav-файл (если бы я импортировал в Audacity и увеличил масштаб в определенном месте, я бы увидел это). Обратите внимание, что показанные значения не совпадают со значениями на графике, я выбрал значения в случайный момент времени. Поэтому я думаю, что реальный вопрос заключается в том, почему эти значения такие большие (в миллионах)? И что они представляют? (Это байты?)
1 ответ
В limits.h
Вы можете найти два таких определения (среди прочего):
#define INT_MAX 0x7FFFFFFF
#define INT_MIN 0x80000000
которые соответствуют десятичному диапазону от -2147483648 до 2147483647.
Руководство по libsndfile гласит:
sf_count_t sf_read_int(SNDFILE *sndfile, int *ptr, sf_count_t items);
т.е. считывает содержимое звукового файла в целочисленные значения, на которые указывает int *ptr
, Какое бы значение не находилось между INT_MIN
а также INT_MAX
является законной ценностью. В libsndfile API
тип данных, используемый вызывающей программой, и формат данных файла не обязательно должны совпадать.
Также обратите внимание, что в звуковом файле нет такой вещи, как "частота". Линейные файлы PCM состоят только из необработанных выборочных данных, которым предшествует заголовок, тогда как "частота" - это математическая абстракция или результат анализа.
Это может представлять ваш интерес:
При преобразовании между целочисленными форматами PCM различного размера (например, с помощью sf_read_int() для чтения 16-битного файла WAV в кодировке PCM) libsndfile соблюдает одно простое правило:
Всякий раз, когда целочисленные данные перемещаются из контейнера одного размера в контейнер другого размера, старший значащий бит в исходном контейнере становится самым значимым битом в целевом контейнере.
Обязательно внимательно прочитайте руководство, особенно когда оно четко написано.