Jakich algorytmów mogę użyć dla poziomu głośności audio? [zamknięte]

Powiedzmy, że mam suwak, który może przejść między 0 a 1. SoundTransform.volume również waha się między 0 (cichy) i 1 (pełny wolumen), ale jeśli użyję funkcji liniowej, powiedzmy SoundTransform.volume = slider.volume, wynik raczej nie jest przyjemny.

Naprawdę nie badałam ludzkiego ucha, ale kiedyś usłyszałam, że ludzka percepcja jest logarytmiczna, czy coś podobnego. Jakich algorytmów powinienem użyć do Ustawienia SoundTransform.volume?
Author: Clement Herreman, 2009-07-22

8 answers

Postrzeganie człowieka w ogóle jest logarytmiczne, także jeśli chodzi o rzeczy, takie jak jasność itp. ... pozwala to na rejestrowanie niewielkich zmian w małych "sygnałach wejściowych" naszego otoczenia, lub inaczej mówiąc: zawsze dostrzegać zmianę dostrzegalnej ilości fizycznej w stosunku do jej wartości ...

Dlatego powinieneś zmodyfikować objętość, aby rosła wykładniczo, tak:

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

Możesz wypróbować również inne bazy:

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

Im większa jest wartość base, silniejszy efekt, im wolniejsza objętość zaczyna rosnąć na początku i tym szybciej rośnie na końcu ...

Prostszym podejściem, dającym podobne wyniki (jesteś tylko w przedziale od 0 do 1, więc przybliżenia są dość proste, w rzeczywistości), jest wykładnik pierwotnej wartości, jak

y = Math.pow(x, exp);

Dla exp większych niż 1, efekt jest taki ,że wyjście (tzn. głośność w Twoim przypadku) najpierw idzie w górę wolniej, a następnie szybciej pod koniec ... jest to bardzo podobne do funkcje wykładnicze ... im większy exp, tym silniejszy efekt ...

Greetz

Back2dos

 29
Author: back2dos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 15:01:24

Ludzki słuch jest logarytmiczny, więc chcesz, aby funkcja wykładnicza (odwrotna) zastosowała się do liniowego wyjścia suwaka. Nie wiem czy słuch ludzki jest bliższy ln Czy log:

Dla Ln:

e^x

Dla Logu:

10^x
Możesz też eksperymentować z innymi bazami. Następnie trzeba będzie przeskalować dane wyjściowe tak, aby pokrywały one dostępny zakres wartości.

Update

Po odrobinie badań wydaje się, że baza 2 byłaby odpowiednia ponieważ moc jest związana z kwadratem ciśnienia. Jeśli ktoś wie lepiej, proszę mnie poprawić.

Myślę, że chcesz:

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

V jest liniową wartością wejściową w zakresie od 0..n v ' to wartość logarytmiczna w zakresie od 0..m

-1 w pierwszym równaniu daje zakres wyjściowy od 0 zamiast 1 (ponieważ K^0=1).

M + 1 ma to zrekompensować, więc otrzymasz 0..m Nie 0..m + 1

Możesz oczywiście dostroić to, aby pasowało do twojego wymagania.

 9
Author: Draemon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 17:42:25

Słyszenie jest skomplikowane, głośność jest różna w zależności od częstotliwości, czasu trwania próbki i od osoby do osoby. Tak więc nie można tego rozwiązać matematycznie, ale poprzez wypróbowanie różnych funkcji sterowania i wybranie tej, która "czuje się" najlepiej.

Czy zauważyłeś w tej chwili, że zmiana regulacji na dolnym końcu zakresu ma niewielki wpływ na pozorną głośność, ale że głośność wzrasta gwałtownie na górnym końcu zakresu? Czy słyszysz odwrotnie, głośność zmienia się zbyt szybko na niskim końcu, a nie wystarczająco na wysokim końcu? A może chcesz mieć lepszą kontrolę nad głośnością na średnim poziomie?

Zwiększona czułość małej głośności:

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

Zwiększona czułość dużej głośności:

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

Lub

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

Gdzie baza > 1, Spróbuj różnych wartości i zobacz, jak to jest. Lub bardziej drastycznie, łuk kołowy 90 stopni:

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

Gdzie x jest {[4] } i wynosi od 0 do 1.

Proszę dać nam znać, jak można uzyskać dalej!

 5
Author: Matt Howells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 14:46:25

Tak, ludzka percepcja jest logarytmiczna. Biorąc to pod uwagę, należy wyregulować głośność wykładniczo, tak aby uzyskany wzrost stał się liniowy. Zobacz decybel na Wikipedii

 2
Author: Tamás Szelei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 13:07:51

Android już robi takie rzeczy z Audio Framework.It ustaw głośność za pomocą decybeli. Użytkownik może użyć kroków takich jak od 1 do 7 Dla dzwonka lub od 1 do 15 dla muzyki. Wzór wynosi:

User call set volume API linearly but get amplitude exponentially. Wykres jak poniżej: Tutaj wpisz opis obrazka

 2
Author: beetlej,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 15:10:43

Zwiększenie o 3db oznacza podwojenie głośności, ale ludzkie ucho wymaga zwiększenia o ~6dB do postrzegania podwojenia głośności.

Jednakże, krzywa ściśle logarytmiczna, przy dokładnym modelowaniu ludzkiej percepcji objętości, ma problem z użytecznością.

Kiedy ludzie chcą głośnej głośności, pokrętło staje się zbyt czułe na górze, co utrudnia znalezienie "właściwej" głośności.

Już pewnie miałeś ten problem... 7 jest za miękkie, 8 jest za głośne, tymczasem 1-3 są niesłyszalne nad szumem tła.

Polecam więc skalę logarytmiczną, ale z podłogą na dole i miękkim kolanem na górze, aby umożliwić więcej liniowej odpowiedzi, szczególnie w "głośnej" części gałki.

I upewnij się, że gałka idzie do 11. ;)
 1
Author: richardtallent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 14:46:30

Ludzkie ucho rzeczywiście postrzega dźwięki w logarytmicznej skali rosnącej intensywności i dlatego jednostką powszechnie używaną do pomiaru natężenia akustycznego jest decybel (który w rzeczywistości jest używany do wszelkiego rodzaju intensywności i mocy, nie tylko dźwięku, a także jest jednostką bezwymiarową). Poziom odniesienia, 0 dB, jest zwykle ustawiony na dolną granicę ludzkiego słuchu, a każdy wzrost powyżej dziesięciu decybeli odpowiada wzrostowi mocy o współczynnik 10.

Zauważ jednak, że powinieneś najpierw skontaktować się z innymi ludźmi i zobaczyć, co myślą, na wszelki wypadek; to, co brzmi dziwnie dla ciebie, może nie brzmieć dziwnie dla innych. Jeśli się z Tobą zgodzą, to śmiało i zrób to wykładniczo, ale jeśli jesteś w mniejszości, to może tylko twoje własne uszy są problemem.

EDIT: Ignoruj mój poprzedni trzeci akapit. Zapoznaj się z odpowiedzią back2dos, jeśli zdecydujesz się to zrobić wykładniczo.

 0
Author: JAB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 15:38:22

To jest funkcja javascript, którą mam dla skali logarytmicznej dla dbm. Dane wejściowe to procent (0.00 do 1.00) i wartość maksymalna (moja implementacja używa 12db)

Środkowy punkt jest ustawiony na 0.5 i będzie to 0db.

Gdy wartość procentowa wynosi zero, wynik jest ujemny w nieskończoności.

function percentageToDb(p, max) {
     return max * (1 - (Math.log(p) / Math.log(0.5)));
};
 0
Author: san1t1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-12 16:25:50