2017-02-21 13 views
0

Я пытаюсь выполнить линейное масштабирование аудиовхода с тем же масштабированием на каждом канале.Масштабирование звука Java

Общий эффект заключается в том, что входной поток постепенно уменьшается по амплитуде до тех пор, пока он не станет тихим. Таким образом, мой первый образец останется таким же, и мой последний образец будет равен 0 по амплитуде. Мне было интересно, как вы это реализуете.

До сих пор это то, что у меня есть для кода масштабирования, и задавался вопросом, нужно ли еще масштабировать образец, чтобы он находился между диапазоном до 16 цифр.

for (int i=0; i<data.length; ++i){ // data[i] is sample in intger form 
     data[i] = (int) (data[i]*(something/something)); 
} 

Было бы полезно, если бы было объяснено масштабирование до определенного фактора?

Спасибо!

+1

Каков ваш фактический вопрос? Если вы сделали масштабирование правильно, и вы только уменьшаете амплитуду, он будет автоматически находиться в 16-битном диапазоне. Однако ваш код неверен - зачем вам нужно несколько экземпляров с максимальным значением, что делает его 32-битным диапазоном и намного громче? И что произойдет, если вы разделите ноль на первой итерации цикла? Вы даже запустили код? –

+0

@erwin bolwidt мой вопрос: как вы масштабируете линейно до 0. Разве я бы просто разделил каждый образец на 0? – Hawwa

ответ

1

Я предполагаю, что вы работаете с короткими значениями для ваших аудиоданных (например, [-32768..32767]), а преобразование в и из байтов обрабатывается в другом месте.

В вашей фракции «что-то/что-то» числитель будет варьироваться от значения, равного знаменателю, до нуля, а знаменатель остается фиксированным.

Пример: если вы нарушаете диапазон громкости на 128 шагов, самым громким объемом будет 128/128, самым тихим томом будет 0/128.

Чтобы избежать деления, вы можете предварительно рассчитать коэффициент, равный 1/128, и умножить его на значение в пределах диапазона [0,128] включительно.

Тогда у вас будет «что-то» precalculatedFactor », которое может работать немного быстрее.

Но есть проблемы, связанные с линейным масштабированием объема. Фактический воспринимаемый объем не отслеживается линейно. Таким образом, интервал объема X может едва создать разницу в объеме на высоком конце, но будет настолько большим, чтобы вызвать разрыв и щелкнуть по нижнему концу.

Я думаю, что люди часто используют экспоненциальную функцию для лучшего отображения объема на линейный вход. Есть разногласия относительно того, что лучше. Но предположим, что ваш регулятор громкости идет от [0..1]. Если вы кубируете значение перед его применением, например, ввод 0,5 в попытке создать 1/2, громкость становится (0,5 * 0,5 * 0,5) => 0,125, это будет ближе к 1/2 громкости, чем 0,5.

Таким образом, «что-то» что-то «что-то» precalculatedFactorCubed «может работать лучше.

+0

Как работает использование двух каналов с масштабированием? – Hawwa

+0

Каналы чередуются влево и вправо. Вы должны применить те же факторы и вычисления к каждому из двух значений. –