Нужно ли беспокоиться об общем усилении звука в моей программе? - PullRequest
1 голос
/ 17 февраля 2011

Есть ли ограничение уровня где-нибудь в цепочке цифрового звука?

Я работаю над игрой защиты башен с OpenAL, и будет много башен, стреляющих одновременно, и все они будут использовать один и тот же звуковой эффект.(по крайней мере на данный момент).Меня беспокоит то, что одновременное срабатывание слишком большого количества звуков может привести к сбою колонок или, по крайней мере, к головной боли для пользователя.

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

Кто-нибудь может подтвердить это, и если да, то скажите мне, где существует этот ограничитель?Спасибо!

1 Ответ

1 голос
/ 17 февраля 2011

как бы то ни было, вам повезет, если сигнал просто обрезается в программном обеспечении до того, как он попадет на ЦАП.Вы можете легко реализовать это самостоятельно.когда я говорю «обрезано», я имею в виду, что амплитуды, которые превышают максимум, устанавливаются на максимум, а не на переполнение, наложение или другие менее неприятные результаты.отсечение на этом этапе часто звучит ужасно, но упомянутые мною альтернативы звучат хуже.

на самом деле следует учитывать большое значение в этом отношении: вы рендерите в float или int?если int, какой у вас запас?с int вы можете обрезать или переполнить практически на любой стадии.с плавающей точкой, это произойдет только как серьезный недостаток дизайна.конечно, вам часто приходится в конечном итоге преобразовывать в int при взаимодействии с ЦАП / оборудованием.ЦАП ограничит выход, потому что он обрабатывает сигналы в очень определенных пределах.в худшем случае это будет эквивалент (сэмплированный) белого шума при 0 дБ полной шкалы (что может быть ужасным для пользователя).итак ... ЦАП служит ограничителем, хотя на этом этапе значительно снижается вероятность того, что сигнал вызовет слух или повреждение оборудования.

во всяком случае, вы можете легко избежать этого, и я рекомендую вамсделайте это сами, так как вы непосредственно контролируете количество звуков и их амплитуду.в худшем случае сэмплы с пиками 0 дБ полной шкалы будут сходиться на одном и том же сэмпле, и вам нужно будет умножить сигнал (сумму выстрелов) на величину, обратную сумме выстрелов:

output[i] = numShots > 1 ? allThoseShots[i]*(1.0/numShots) : allThoseShots[i];

это не идеально во многих случаях (потому что будет преувеличенный звук приглушения).поэтому вы должны ввести ограничитель в дополнение к общему уменьшению количества одновременных выстрелов.затем вы уменьшаете сигнал выстрелов с более низким коэффициентом, поскольку их пики вряд ли будут сходиться в один и тот же момент времени.простой ограничитель с ~ 10 мс предвкушения должен помешать вам сделать что-то ужасное.также было бы неплохо обнаружить сильные ограничения в режиме отладки, это улавливает проблемы проектирования в восходящем направлении.

в любом случае, вы обязательно должны рассмотреть вопрос о надлежащей компенсации усиления - вы никогда не захотите обрезать выходной ЦАП.на самом деле вы хотите оставить некоторый запас (см .: пики между образцами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...