Какова правильная формула усиления звука WaveForm? - PullRequest
1 голос
/ 18 мая 2011

Мне интересно, какова правильная формула усиления звука WaveForm из C ++.

Допустим, есть следующие 16-битные данные формы волны: 0x0000 0x2000, 0x3000, 0x2000, 0x0000, (отрицательная часть), ...

Из-за акустической причины, только удвоение числа не даст вдвое больше звука, как это: 0x0000 0x4000, 0x6000, 0x4000, 0x0000, (удвоенная отрицательная часть), ...

Если есть кто-то, кто хорошо знает о модификации звука, пожалуйста, дайте мне знать.

Ответы [ 3 ]

6 голосов
/ 18 мая 2011

Если вы удвоите все значения семпла, он будет звучать «вдвое громче», то есть на 6 дБ громче.Конечно, вы должны быть осторожны, чтобы избежать искажений из-за отсечения - это главная причина, по которой все профессиональное программное обеспечение для обработки звука сегодня использует сэмплы с плавающей запятой для внутреннего использования.

Возможно, вам потребуется вернуться к целому числу при окончательном выводе звукаданные.Если вы просто пишете плагин для какой-то DAW (как я бы порекомендовал, если вы хотите программировать простой, но эффективный звук FX), он сделает все это за вас: вы просто получите поплавок, сделаете что-нибудь с ним ивывести плавающее число снова.Но если вы хотите, например, напрямую выводить файл .wav, вам необходимо сначала ограничить вывод, чтобы все, что выше 0 дБ (что составляет + -1 в обычном потоке с плавающей запятой), обрезалось до + -1.Затем вы можете умножить на максимальное значение желаемого целочисленного типа, равное -1, и просто привести его к этому типу.Готово.

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

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

1 голос
/ 18 мая 2011

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

так

float amp=1.2;
short sample;
short newSample=(short)amp*sample;

Если вы хотите, чтобы ваше затухание было линейным, в цикле обработки образца выполните

amp-=0.03;

и, если вы хотите быть логарифмическим, в цикле обработки образца выполните

amp*=0.97;

пока усилитель не достигнет небольшого значения (усиление <0,1) </p>

0 голосов
/ 18 мая 2011

Это может быть проблема восприятия. Ваши уши (и глаза - посмотрите гамма-видео), не воспринимайте громкость в линейном ответе на вход. Хорошей моделью этого является то, что ваши уши реагируют на увеличение ln (n) при увеличении объема n. Посмотрите разницу между линейными горшками и аудио горшками.

В любом случае, я не знаю, имеет ли это здесь значение, потому что ваш выходной усилитель может объяснить это, но если вы хотите, чтобы он был воспринят в два раза громче, вам, возможно, придется сделать его в ^ 2 раза громче. Что может означать, что вы сейчас находитесь в сфере отсечения.

...