необходима формула ограничения пиков / сжатия звука

9

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

Моя (очень грубая) формула такова:

factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))

Где уровень - это мгновенный уровень звука, средний - это исторический средний уровень звука, а коэффициент - это множитель, используемый для получения «скорректированного» уровня ( коэффициента, умноженного на уровень ).

Кроме того, этот множитель применяется только в том случае, если он вычисляется до значения, меньшего 1. В противном случае уровень остается нескорректированным.

Намерение состоит в том, чтобы ограничить скорректированный уровень некоторым кратным (приблизительно 15x с этой формулой) исторического среднего. Эта формула как раз то, что мне нужно, но демонстрирует «провал», когда числа становятся больше. То есть скорректированный уровень (т. Е. Коэффициент, умноженный на уровень ) увеличивается до точки с увеличением нескорректированного уровня, но затем, вместо того, чтобы идти асимптотически, начинает фактически уменьшаться. (Фактически, первый фактор был добавлен прежде всего для предотвращения перехода формулы в ноль с чрезвычайно высокими значениями.)

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

Итак, кто-нибудь может предложить что-то лучше? (Кажется, что асимптотическое поведение легко создать, когда вы этого не хотите, но трудно, когда вы этого хотите.)

Даниэль Р Хикс
источник

Ответы:

9

Здесь две проблемы: как получить достоверную оценку уровня и как сжать данные.

  • Используйте надежную статистику по исходным (не ограниченным пиками) данным, таким как медиана или квантили, вместо скользящего среднего, чтобы сделать ваше обнаружение «типичного уровня» устойчивым к выбросам.
  • К×TANH(ИксК)С

пример

  • Синий: оригинальный сигнал
  • Зеленый: 2 х медиана абсолютного значения по скользящему окну в качестве обнаружения «типичного уровня»
  • Красный: tanh компрессия (формула приведена выше, где k равен уровню, показанному зеленым)
pichenettes
источник
Спасибо, это выглядит многообещающе. Я подключу его и посмотрю, как оно работает.
Даниэль Р Хикс
1
Я попробовал это, и это, кажется, работает хорошо (после того, как я убрал пару проверок пальца). Моя единственная проблема в том, что, похоже, нет никакого способа отрегулировать резкость «колена» без поднятия уровня клипа или чего-либо еще.
Даниэль Р Хикс
Почему «скользящее среднее» лучше, чем «скользящее среднее»? Я читал во многих местах, что он менее чувствителен к выбросам. Но я не могу увидеть это с реальными данными . Есть идеи по этому вопросу?
Basj