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

РЕДАКТИРОВАНИЕ: на Этот вопрос ответили почти 9-летний назад, когда не было очень полезных встроенных методов в Array.prototype.

Теперь, конечно, я просто рекомендовал бы Вам использовать filter метод.

Берут в памяти, что этот метод возвратит Вас новый массив с элементами, которые передают критерии функции обратного вызова, которую Вы предоставляете ему, например, если Вы хотите удалить null или undefined значения:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

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

Один общий шаблон, который я часто вижу используемый, должен удалить элементы, которые являются falsy, которые включают пустую строку "", 0, NaN, null, undefined, и false.

можно просто передать filter метод, Boolean функция конструктора, или просто возвратить тот же элемент в функции критериев фильтра, например:

var filtered = array.filter(Boolean);

Или

var filtered = array.filter(function(el) { return el; });

обоими способами это работает, потому что filter метод в первом случае, вызовы Boolean конструктор как функция, преобразовывая значение, и во втором случае, filter метод внутренне преобразовывает возвращаемое значение обратного вызова неявно к [1 121].

, Если Вы работаете с разреженными массивами, и Вы пытаетесь избавиться от "дыр", можно просто использовать filter метод, передающий обратный вызов, который возвращает true, например:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

Старый ответ: не делают этого!

я использую этот метод, расширяя собственный прототип Массива:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

Или можно просто продвинуть существующие элементы в другой массив:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
29
задан Clement Herreman 22 July 2009 в 12:55
поделиться

6 ответов

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

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

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

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

greetz

back2dos

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

greetz

back2dos

30
ответ дан 28 November 2019 в 01:38
поделиться

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

2
ответ дан 28 November 2019 в 01:38
поделиться

A 3db increase means you are doubling the volume, but the human ear requires ~6db increase to perceive a doubling in volume.

However, a strictly logarithmic curve, while accurately modeling the human perception of volume, has a usability problem.

When people want a loud volume, the knob becomes too sensitive at the upper end, making it difficult to find the "right" volume.

You've probably had this problem before... 7 is too soft, 8 is too loud, meanwhile 1-3 are inaudible over background noise.

So, I recommend a logarithmic scale, but with a floor at the low end and a soft knee at the top to allow a more linear response, especially in the "loud" part of the knob.

Oh, and make sure the knob goes up to 11. ;)

1
ответ дан 28 November 2019 в 01:38
поделиться

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

Для Ln:

e^x

Для Log:

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

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

9
ответ дан 28 November 2019 в 01:38
поделиться

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

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

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

0
ответ дан 28 November 2019 в 01:38
поделиться

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

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

Повышенная чувствительность при низком уровне громкости:

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

Повышенная чувствительность при высоком уровне громкости:

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

или

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

Если база> 1, попробуйте другие значения и посмотрите, как они чувствует. Или, что более решительно,

5
ответ дан 28 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: