#c #audio #double #wav
Вопрос:
Я работаю над обработкой аудиоданных (из/в WAV
файлы, 16 бит), представляющих образцы со double
значениями (64 бита).
Поскольку я работаю с большим количеством свертки в амплитудной области, часто мои результирующие выборки имеют (положительные или отрицательные ) значения, которые «превышают» «максимальные данные», которые могут быть представлены в 16 битах, и в результате они усекаются.
Поэтому мне нужно нормализовать свои данные, прежде чем записывать их в WAV
файл.
Но мне не ясно, каковы максимальные (и минимальные) double
значения, которые могут быть представлены в 16 битах.
обратите внимание: здесь я называю минимальное значение максимальным отрицательным двойным числом, которое может быть представлено в 16 битах.
редактировать: с 16-bits double
помощью я ссылаюсь на данные, считанные из 16-битного файла WAV, сохраненные в моем коде в качестве double
значения. После свертки амплитуды эти данные становятся больше 1 или меньше -1.
Комментарии:
1. @Ted Lyngmo спасибо за ответ, мне нужно разъяснение: как я могу снова преобразовать его в
double
? Мне понадобятся двойные значения, которые будут записаны в wav-файл. Простоеstatic_cast<double> resu<
сработало бы?2. От -32 768 до 32 767-это диапазон 16-разрядного целого числа со знаком. Включение этого в двойник не должно этого менять. https://ideone.com/ZnbKfR
3. Вот запись в Википедии, описывающая битовую компоновку для 16-разрядной плавающей точки: IEEE 16-разрядная плавающая точка
Ответ №1:
Каково максимальное (и минимальное) 16-разрядное двойное значение?
Неясно, что вы подразумеваете под «16-битным двойным».
double
В C существует числовой тип. Это тип с плавающей запятой. Язык C не определяет свои максимальные или минимальные представимые значения (хотя он определяет минимальный диапазон, который реализации могут превышать), но можно проверить эти пределы с помощью std::numeric_limits
.
Однако в большинстве систем double
используется 64-разрядный тип, а именно тип с плавающей запятой «двойной точности», как указано в стандарте IEEE-754.
16-разрядный тип может представлять не более 2 16 различных значений.
Если используется для представления целого числа без знака, диапазон будет равен [0, 2 16).
Если используется для представления целого числа со знаком, диапазон будет зависеть от того, как представлен знак. В наиболее распространенном представлении дополнения 2 диапазон будет равен [-2 16-1, 2 16-1)
Файлы WAV
В формате Microsoft WAVE 16-битные образцы представляют собой 2 целых числа со знаком дополнения. Диапазон их значений приведен в предыдущем абзаце.
Комментарии:
1. Я отредактировал сообщение, чтобы уточнить, что я имею в виду под 16-битным двойником.
2. Незначительный момент: C (через C) определяет минимальные требуемые диапазоны
float
иdouble
типы. Как и в случае с целочисленными типами, они поступают через макросы языка Си, которые описывают типы. Так, например,FLT_MAX
,DBL_MAX
, иLDBL_MAX
должно быть не менее 1E 37.
Ответ №2:
Простой ответ заключается в том, что ваш знаменатель (для нормализации 16-разрядных данных) равен 2^15 при условии, что PCM подписан.
Разделите все ваши входящие 16-битные данные на 32767-это мое решение для нормализации. Возможно, можно указать 32768, так как данные варьируются от -32768 до 32767. Но я всегда использовал 32767.