Подтвердить что ты не робот

Какие алгоритмы можно использовать для уровня громкости звука?

Скажем, у меня есть ползунок, который может идти между 0 и 1. SoundTransform.volume также колеблется между 0 (тихий) и 1 (полный объем), но если я использую линейную функцию, скажем SoundTransform.volume = slider.volume, результат не является приятным.

Я действительно не изучал человеческое ухо, но однажды услышал, что человеческое восприятие логарифмическое или что-то подобное. Какие алгоритмы я должен использовать для установки SoundTransform.volume?

4b9b3361

Ответ 1

человеческое восприятие в целом логарифмическое, также когда дело доходит до вещей как светимости и т.д.... это позволяет нам регистрировать небольшие изменения в небольших "входных сигналах" нашего environement или, говоря иначе: всегда перенять изменение воспринимаемой физической величины по отношению к ее значению...

таким образом, вы должны изменить объем для экспоненциального роста, например:

y = (Math.exp(x)-1)/(Math.E-1)

вы также можете попробовать другие базы:

y = (Math.pow(base,x)-1)/(base-1)

Чем больше значение base, тем сильнее эффект, медленный объем начинает расти в начале и тем быстрее он растет в конце...

немного более простой подход, дающий вам аналогичные результаты (вы находитесь только в интервале от 0 до 1, поэтому на самом деле аппроксимации довольно просты), заключается в экспонировании исходного значения, поскольку

y = Math.pow(x, exp);

для exp больше 1, эффект заключается в том, что выход (т.е. объем в вашем случае) сначала идет медленнее, а затем быстрее к концу... это очень похоже на экспоненциальные функции... больше exp, тем сильнее эффект...

Greetz

back2dos

Ответ 2

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

Для Ln:

e^x

Для журнала:

10^x

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

Обновление

После небольшого исследования кажется, что база 2 будет уместна, поскольку мощность связана с квадратом давления. Если кто-нибудь знает лучше, пожалуйста, поправьте меня.

Я думаю, что вы хотите:

v' = 2^v.a^v - 1
a  = ( 2^(log2(m+1)/n) )/2

v - ваше линейное входное значение в диапазоне от 0..n v '- ваше логарифмическое значение в диапазоне от 0..m

-1 в первом уравнении дает вам выходной диапазон от 0 вместо 1 (так как k ^ 0 = 1).

m + 1 должен компенсировать это, поэтому вы получите 0..m не 0..m + 1

Вы можете, конечно, настроить его в соответствии с вашими требованиями.

Ответ 3

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

Вы находите в данный момент, что изменение управления на нижнем конце диапазона мало влияет на кажущийся объем, но что громкость быстро увеличивается в верхнем конце диапазона? Или вы слышите обратное, громкость слишком быстро меняется на нижнем конце и недостаточно на высоком конце? Или вам лучше контролировать громкость на средних уровнях?

Увеличенная чувствительность с низким уровнем громкости:

SoundTransform.volume = Math.sin(x * Math.PI / 2);

Повышенная чувствительность большого объема:

SoundTransform.volume = (Math.pow(base,x) - 1)/(base-1);

или

SoundTransform.volume = Math.pow(x, base);

Где base > 1, попробуйте разные значения и посмотрите, как они себя чувствуют. Или более резко, круговая дуга на 90 градусов:

SoundTransform.volume = 1 - Math.sqrt(1-(x * x));

Где x есть slider.volume и находится между 0 и 1.

Пожалуйста, дайте нам знать, как вы продвигаетесь!

Ответ 4

Да, человеческое восприятие логарифмическое. Учитывая это, вы должны отрегулировать объем экспоненциально, чтобы воспринимаемое увеличение становилось линейным. См. decibel в Википедии

Ответ 5

Android уже делает такие вещи из Audio Framework. Он использует децибелы для настройки томов. Пользователь может использовать такие шаги, как от 1 до 7 для мелодии звонка или от 1 до 15 для музыки. Формула:

svg.latex?%5Cinline&space;%5Cfn_phv&space;%5Cbegin%7Balign*%7D&space;%5Cleft%5C%7B&space;%5Cbegin%7Bmatrix%7D&space;V_%7Bdb%7D&=&20&space;logV_%7Bam%7D%5C%5C&space;%5Cfrac%7BV_%7Bdb%7D%7D%7B20%7D&=&logV_%7Bam%7D%5C%5C&space;%5Cfrac%7BV_%7Bdb%7D%7D%7B20%7D&=&%5Cfrac%7Bln%7BV_%7Bam%7D%7D%7D%7Bln%7B10%7D%7D%5C%5C&space;%5Cfrac%7Bln10%7D%7B20%7DV_%7Bdb%7D&=&lnV_%7Bam%7D%5C%5C&space;V_%7Bam%7D&=&e%5E%7B%5Cfrac%7Bln10%7D%7B20%7DV_%7Bdb%7D%7D&space;%5Cend%7Bmatrix%7D%5Cright.&space;%5Cend%7Balign*%7D

Пользовательский набор задает объем API линейно, но получает амплитуду экспоненциально. график, как показано ниже: введите описание изображения здесь

Ответ 6

Увеличение 3db означает, что вы удваиваете громкость, но человеческое ухо требует увеличения ~ 6 дБ, чтобы воспринимать удвоение объема.

Однако строго логарифмическая кривая, точно моделируя человеческое восприятие объема, имеет проблему юзабилити.

Когда люди хотят громкий громкость, ручка становится слишком чувствительной в верхнем конце, что затрудняет поиск "правильного" объема.

У вас, вероятно, была эта проблема раньше... 7 слишком мягкая, 8 слишком громкая, между тем 1-3 не слышны в фоновом шуме.

Итак, я рекомендую логарифмическую шкалу, но с полом на нижнем конце и мягким коленом наверху, чтобы обеспечить более линейный отклик, особенно в "громкой" части ручки.

О, и убедитесь, что ручка поднимается до 11.;)

Ответ 7

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

Обратите внимание, однако, что вы должны сначала проверить с другими людьми и посмотреть, что они думают, на всякий случай; что звучит странно для вас, может показаться странным для других. Если они согласны с вами, тогда идите прямо вперед и делайте это экспоненциально, но если вы в меньшинстве, то это могут быть ваши собственные уши, которые являются проблемой.

РЕДАКТИРОВАТЬ: Игнорировать мой предыдущий третий абзац. Обратитесь к ответу back2dos, если вы решите сделать это экспоненциально.

Ответ 8

Это функция javascript для логарифмической шкалы для dbm. Вход представляет собой процент (от 0,00 до 1,00) и максимальное значение (моя реализация использует 12 дБ)

Средняя точка установлена ​​на 0,5 и будет 0 дБ.

Когда процент равен нулю, выход отрицательный. Бесконечность.

function percentageToDb(p, max) {
     return max * (1 - (Math.log(p) / Math.log(0.5)));
};