Я ищу формулу для эффективного сжатия аудио сигнала для ограничения пиков. Это не приложение «автоматического регулирования громкости», где можно управлять усилением усилителя для поддержания уровня громкости, а скорее я хочу ограничить («мягкое» усечение) отдельные пики. (Я знаю, что это вводит гармоники, но я пытаюсь анализировать данные, а не слушать их.)
Моя (очень грубая) формула такова:
factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))
Где уровень - это мгновенный уровень звука, средний - это исторический средний уровень звука, а коэффициент - это множитель, используемый для получения «скорректированного» уровня ( коэффициента, умноженного на уровень ).
Кроме того, этот множитель применяется только в том случае, если он вычисляется до значения, меньшего 1. В противном случае уровень остается нескорректированным.
Намерение состоит в том, чтобы ограничить скорректированный уровень некоторым кратным (приблизительно 15x с этой формулой) исторического среднего. Эта формула как раз то, что мне нужно, но демонстрирует «провал», когда числа становятся больше. То есть скорректированный уровень (т. Е. Коэффициент, умноженный на уровень ) увеличивается до точки с увеличением нескорректированного уровня, но затем, вместо того, чтобы идти асимптотически, начинает фактически уменьшаться. (Фактически, первый фактор был добавлен прежде всего для предотвращения перехода формулы в ноль с чрезвычайно высокими значениями.)
(Причина, по которой вы хотите ограничить значения таким способом, в первую очередь заключается в том, что переходный шум не сильно нарушает текущее среднее значение уровня звука. Но когда вы анализируете храпы, "переходный шум" довольно значительный, поэтому я могу просто подавить его .)
Итак, кто-нибудь может предложить что-то лучше? (Кажется, что асимптотическое поведение легко создать, когда вы этого не хотите, но трудно, когда вы этого хотите.)
источник
Ответы:
Здесь две проблемы: как получить достоверную оценку уровня и как сжать данные.
источник