Algorytm (y) do miksowania sygnałów audio bez obcinania

49

Chciałbym miksować dwa lub więcej kanałów audio PCM (np. Nagrane próbki) cyfrowo w akustycznie wierny sposób, najlepiej w czasie zbliżonym do rzeczywistego (co oznacza brak lub brak podglądu).

Fizycznie „poprawnym” sposobem na to jest zsumowanie próbek. Jednak po dodaniu dwóch dowolnych próbek wynikowa wartość może być nawet dwukrotnością wartości maksymalnej.

Na przykład, jeśli twoje próbki mają 16-bitowe wartości, wynik wyniesie do 65536 * 2. To powoduje obcinanie.

Naiwnym rozwiązaniem jest tutaj dzielenie przez N, gdzie N jest liczbą miksowanych kanałów. Jednak powoduje to, że każda próbka jest 1 / N jako tak głośna, co jest całkowicie nierealne. W prawdziwym świecie, gdy dwa instrumenty grają jednocześnie, każdy instrument nie staje się o połowę tak głośny.

Po przeczytaniu, powszechną metodą miksowania jest: wynik = A + B - AB, gdzie A i B to dwie znormalizowane próbki, które są miksowane, a AB to termin zapewniający, że głośniejsze dźwięki są coraz bardziej „miękko przycinane”.

Wprowadza to jednak zniekształcenie sygnału. Czy ten poziom zniekształceń jest akceptowalny w wysokiej jakości syntezie dźwięku?

Jakie są inne metody rozwiązania tego problemu? Interesują mnie wydajne algorytmy niskiej jakości, a także mniej wydajne algorytmy wysokiej jakości.

Zadaję pytanie w kontekście cyfrowej syntezy muzyki, w celu miksowania wielu ścieżek instrumentów razem. Ścieżki mogą być zsyntetyzowane audio, nagrane próbki lub wejście mikrofonu w czasie rzeczywistym.

bryhoyt
źródło
Zastanawiam się, jak często można uniknąć przesterowania, zmieniając jedynie czasowo sygnały.
Sebastian Reichelt,
Dobry pomysł, choć podejrzewam, że nie jest to takie proste, szczególnie gdy nie masz dużo czasu na przyszłość (np. W czasie rzeczywistym). Problem polega na tym, że musisz znać próbkę z wyprzedzeniem, aby wiedzieć, jakie przesunięcie czasowe byłoby właściwe. To powiedziawszy, w większości muzyki istnieje duże prawdopodobieństwo korelacji, więc trochę przypadkowego przesunięcia czasu może działać bardzo dobrze. Czy ktoś ma tu jakieś doświadczenie?
bryhoyt
2
@bryhoyt: Prawdziwe miksery sumują sygnały razem. Otóż ​​to. Nie wymaga opóźnień ani przetwarzania nieliniowego. Przycinanie nie stanowi problemu, ponieważ oryginalne sygnały nie były aż tak głośne.
endolith,
2
16 + 16 bitów = 17 bitów ;-)
nikwal
1
po prostu podziel przez liczbę wejść, wtedy przycinanie nie będzie możliwe. a jeśli dźwięk jest zbyt cichy, podkręć wzmacniacz…
Sarge Borsch

Odpowiedzi:

14

Bardzo trudno jest wskazać odpowiednie techniki, nie znając kontekstu problemu.

Oczywistą odpowiedzią byłoby, abyś powiedział, aby wyregulować wzmocnienie każdej próbki, tak aby rzadko występowało obcinanie. Zakładanie, że muzycy zagraliby łagodniej w zespole, nie jest wcale nierealistyczne, niż kiedy proszeni są o solo.

Zniekształcenie wprowadzone przez A + B - AB jest po prostu niedopuszczalne. Tworzy lustrzane odbicie A po każdej stronie harmonicznych B - równoważne modulacji pierścieniowej - co jest dość okropne, jeśli A i B mają bogate spektrum z harmonicznymi, które nie są w stosunkach całkowitych. Wypróbuj na przykład na dwóch falach kwadratowych przy 220 i 400 Hz.

Bardziej „naturalną” funkcją przycinania, która działa na zasadzie próbka na próbkę, jest funkcja tanh - w rzeczywistości odpowiada ona ograniczeniu miękkiego działania niektórych elementów analogowych. Poza tym możesz przyjrzeć się klasycznym technikom dynamicznej kompresji - jeśli Twój system może patrzeć w przyszłość i widzieć nadchodzące szczyty, jest to jeszcze lepsze.

fenenety
źródło
4
Dodatki i twarde obcinanie. Wystarczy spojrzeć na dowolny odtwarzacz modów open source. Używanie dodatku do miksowania, z odpowiednio skalowanymi wejściami, aby zminimalizować przesterowanie, a następnie twardy ogranicznik (opcjonalnie miękki) jest normą, a nie wyjątkiem ...
pikenety
4
W większości sytuacji nie jest to deweloper odpowiedzialny za rozwiązanie problemu. Dajesz użytkownikowi / kompozytorowi możliwość regulacji głośności każdego kanału, a użytkownik musi wykonać miks, aby przycinanie było dla niego akceptowalne. Na przykład w Renoise domyślnie wzmocnienie każdego instrumentu / nuty wynosi 1, a rzeczy zaczynają się źle przycinać podczas dodawania ścieżek - użytkownik musi dostosować głośność nut lub instrumentów w module, aby zapobiec przycinaniu na ścieżka główna (chyba że jest to pożądane). Oto zrzut ekranu pokazujący, że: i.imgur.com/KVxDt.png .
pikenety
2
IIRC, FastTracker był bardziej konserwatywny, ponieważ zastosował tłumienie na każdej ścieżce, a następnie miał globalny „przyrost makijażu” w oknie dialogowym preferencji od x1 do x32. Pamiętam, że kiedy musiałem wyrenderować wszystkie moje moduły w formacie .WAV na płytę CD, musiałem wypróbować wartości wzmocnienia, dopóki nie znalazłem najniższego, który nie spowodował przycinania ...
pikenety
2
Jeśli chodzi o poziom tłumienia, w przypadku, gdy nie możesz mieć użytkownika w pętli; 1/32 to absolutnie bezpieczny poziom (bez obcinania). Zakładając, że kanały nie są skorelowane (co nie jest zbyt prawdziwe w przypadku muzyki - bardziej poprawne podczas miksowania tła), wartość 1 / sqrt (32) byłby dobrym kompromisem między głośnością a prawdopodobieństwem przycinania. Najlepszym rozwiązaniem byłoby użycie 1/32, a następnie przetworzenie próbek za pomocą kompresora dynamicznego.
pikenety
3
Wzbogacenie. Tak właśnie robią miksery sprzętowe i tak ludzie oczekują, że się zachowają. Miksery na poziomie systemu po prostu zaczepiają. Byłoby dużym problemem, gdyby sterowniki systemu wdrożyły jakiekolwiek przetwarzanie nieliniowe - wyobrażam sobie ból mistrzów inżynierów próbujących dowiedzieć się, czy słyszą ustawienia wtyczki kompresora, czy jakieś dynamiczne przetwarzanie na poziomie systemu. Oprogramowanie do produkcji muzyki oferuje szeroką paletę wtyczek kompresji dynamiki, od użytkowników zależy, czy ich miks nie zostanie przycięty.
pikenety
16

Fizycznie „poprawnym” sposobem na to jest zsumowanie próbek. Jednak po dodaniu dwóch dowolnych próbek wynikowa wartość może być nawet dwukrotnością wartości maksymalnej. ... Naiwnym rozwiązaniem jest tutaj dzielenie przez N, gdzie N to liczba miksowanych kanałów.

To nie jest „naiwne” rozwiązanie, to jedyne rozwiązanie. Tak właśnie działa każdy mikser analogowy i cyfrowy, ponieważ robi to powietrze i to robi mózg.

Niestety wydaje się, że jest to powszechne nieporozumienie, na co wskazują inne nieprawidłowe nieliniowe algorytmy „mieszania” (zniekształcenia):

„Dzielenie przez N” nazywa się rezerwą ; dodatkowe miejsce dla pików, które jest przydzielone powyżej poziomu RMS kształtu fali. Ilość nadmiaru wymagana dla sygnału zależy od współczynnika szczytu sygnału . (Niezrozumienie cyfrowych poziomów sygnału i rezerwy jest prawdopodobnie częściowo odpowiedzialne za wojnę w Loudness i Elephunk ).

W sprzęcie analogowym headroom może wynosić 20 dB. W sprzętowym procesorze DSP często stosowany jest punkt stały z ustalonym zapasem; Na przykład SigmaDSP AD ma 24 dB wolnej przestrzeni. W oprogramowaniu komputerowym przetwarzanie dźwięku odbywa się zwykle w 32-bitowym zmiennoprzecinkowym, więc nadmiar jest ogromny.

Idealnie, nie musiałbyś wcale dzielić przez N, po prostu sumowałbyś sygnały razem, ponieważ twoje sygnały nie byłyby generowane przy 0 dBFS.

Zauważ, że większość sygnałów i tak nie jest ze sobą skorelowana, więc rzadko zdarza się, aby wszystkie kanały miksera konstruktywnie zakłócały w tym samym momencie. Tak, mieszanie 10 identycznych fal sinusoidalnych w fazie zwiększy poziom szczytowy 10 razy (20 dB), ale mieszanie 10 niespójnych źródeł hałasu zwiększy poziom szczytowy tylko 3,2 razy (10 dB). W przypadku sygnałów rzeczywistych wartość będzie znajdować się między tymi skrajnościami.

Aby uzyskać zmiksowany sygnał z przetwornika cyfrowo-analogowego bez obcinania, wystarczy zmniejszyć wzmocnienie miksu. Jeśli chcesz utrzymać wysoki poziom RMS miksu bez twardego przycinania, musisz zastosować pewien rodzaj kompresji, aby ograniczyć piki fali, ale to nie jest część miksowania, to osobny krok. Najpierw miksujesz z dużą ilością miejsca, a następnie poddajesz go kompresji zakresu dynamicznego później, jeśli to konieczne.

endolit
źródło
1
Rozumiem te pojęcia, ale nie jestem pewien, czy są całkiem poprawne. Jasne, jeśli dodam kilka 16-bitowych próbek, 32 bity dają mi mnóstwo miejsca numerycznego. Ale nadal muszę odtwarzać powstały miks ze znormalizowaną głośnością na prawdziwym systemie dźwiękowym. Chcę, aby 2 kanały brzmiały głośniej niż każdy kanał odtwarzany osobno, ale nie chcę przycinania. Robienie moich sum w 32 lub nawet 64 bitach nie pomaga w tym. Być może zaczynam odpowiadać na własne pytanie: oryginalne próbki powinny zostać znormalizowane na poziomie cichszym niż maksymalna amplituda. Jak sugerujesz, pozostawiając trochę miejsca na mieszanie.
bryhoyt
3
@bryhoyt: Tak, ale musisz również pamiętać, że fale rzadko są ze sobą skorelowane, więc dodanie 5 dźwięków nie powoduje szczytów 5 razy wyższych.
endolith,
1
Dzięki, @endolith, to chyba sedno tego wszystkiego i wyjaśnia mi, dlaczego nie jest to aż tak duży problem, jak na początku myślałem.
bryhoyt,
Więc jeśli 10 niespójnych źródeł da 10 dB, czy dzielenie przez sqrt (liczbę źródeł) byłoby rozsądną heurystyką? To znaczy, jeśli masz 3 źródła, zsumuj je i podziel przez sqrt (3)? (przepraszam za komentowanie starożytnego wątku)
nerdfever.com
@ nerdfever.com Tak łączą się poziomy RMS, więc ... prawdopodobnie?
endolith
6

Formuła

result=A+BAB

nie ma sensu, nawet jeśli masz na myśli coś innego niż . Jedną z rzeczy, o których należy pomyśleć, jest to, że dźwięk zmienia się powyżej i poniżej zera. Lepszy sposób myślenia o tym jest następujący:AB=AB

result=g(A+B)

gdzie .g1

Najprostszym podejściem jest powiedzenie , które jest zachowawcze, liniowe i zawsze działa, ale może nie być tak „głośne”, jak chcesz. Mniej konserwatywne podejście, które „zwykle działa” i jest „głośniejsze”, to . Dzięki temu podejściu rozszerzenia do większej liczby kanałów działają lepiej.g=0.5g=1/2

Alternatywnie, może zmieniać się w czasie, w którym to przypadku jest zwykle wynikiem algorytmu kompresora / ogranicznika. Zatem naprawdę masz równanie różnicy:g

result[i]=g[i](A[i]+B[i])

g[i] jest następnie funkcję poprzedniego , , i .ABgresult

Być może to:

g[i]=f(A[i]+B[i],g[i1])

AKTUALIZACJA: Jak sugeruje hotpaw2, możesz opóźnić sygnał wejściowy, ale nie tłumić wzmocnienia. Nazywa się to „ogranicznikiem wybiegającym w przyszłość”.

Bjorn Roche
źródło
Przez „AB” rozumiem „A * B”. Rozumiem, że amplituda może być dodatnia lub ujemna. Masz rację, moje równanie nie ma większego sensu dla kombinacji obejmującej ujemne amplitudy.
bryhoyt
Muszę mieszać od 8 do 10 (N) różnych fal zatokowych. Empirycznie wiedziałem, że właściwa wartość wynosiła około 0,3 ... 1 / √N wydaje się słuszna ... jakikolwiek związek z tym, dlaczego ta formuła jest poprawna?
Zibri
5

Można to zrobić w przypadku miksowania w czasie rzeczywistym, aby użyć wyprzedzającego AGC, w którym wzmocnienie jednego lub obu kanałów jest obniżane z trudną do zauważenia szybkością, zanim amplituda sumy przekroczy granicę przesterowania. Im mniej wybiegamy w przyszłość, albo regulacja wzmocnienia AGC stanie się bardziej słyszalna, albo maksymalne wzmocnienie dla bardziej miękkiej rampy regulacji wzmocnienia będzie coraz bliżej 0,5 na kanał na granicy. W przypadku źródeł dźwięku z pewną przewidywalnością można również użyć statystyk dotyczących zachowania obwiedni w czasie, aby adaptacyjnie odgadnąć limit wzmocnienia, ale z pewnym prawdopodobieństwem awarii (co byłoby nagłą regulacją wzmocnienia AGC).

hotpaw2
źródło
Jest to ogranicznik wybiegający w przyszłość, a nie wybiegający w przyszłość AGC.
Bjorn Roche,
2
@BjornRoche: Czy ogranicznik nie może być uważany za rodzaj AGC?
endolith
Niektóre ograniczniki to AGC, ale ogranicznik wyprzedzający nie jest AGC.
Bjorn Roche,
1
@BjornRoche dobrze, że jest automatyczny i kontroluje wzmocnienie ...
Olli Niemitalo
2

Rozmawiałem z projektantem mikserów z końca lat 90. i pierwszych 2000., który pojawiał się na fali cyfrowej (po tym, jak przeszedł na palcach). Myślę, że ten facet był projektantem SPL, ale może nie tak duży, absolutnie nie pamiętam ani nazwy, ani marki, po prostu pamiętam, jak naprawdę naprawdę duża i droga była maszyna.

Rozmawialiśmy długo i wreszcie rozmawialiśmy o technikach naprawdę gwarantujących, że ich zmiksowane razem kanały 64/128 @ 24 bity pozostały dokładnie 24-bitowym kanałem miksowanym bez przycinania.

Technika, którą wyjaśnił, była raczej prosta. 64 ścieżki (na 24 bitach) zostały dodane w 48-bitowym kanale, w którym obcinanie nie może wystąpić. Proste.

Nie mogę powiedzieć, w jaki sposób ten sygnał został następnie cofnięty z 48 do 24 bitów. Może właśnie tam stosuje się trudne przepisy kulinarne.

Być może istnieje wiele technik, aby to osiągnąć, przede wszystkim różne, niezależnie od tego, czy wykonano je w czasie rzeczywistym, czy przy użyciu całego sygnału już zarejestrowanego z wysokimi pikami, które można łatwo ustalić ... wszelkiego rodzaju normalizacje, które można sobie wyobrazić.

Stephane Rolland
źródło
2

Zmniejsz globalny wolumen. Moduł śledzenia impulsów klasycznie domyślnie wysyła kanały przy około 33% głośności.

Wydaje się to być zarówno wystarczająco głośne dla muzyki z kilkoma kanałami (4-kanałowe MODY Amigi), jak i wystarczająco miękkie dla utworów z 50 kanałami (ponieważ zawartość kanału zwykle nie jest skorelowana, więc głośność nie sumuje się tak szybko po pewnym poziomie ... plus kilka kanałów będzie nadawało z maksymalną głośnością przy tak dużej ilości rzeczy). Pozostawia również wystarczającą ilość miejsca dla kanałów z lewej strony lub z prawej strony (które wykorzystują 66% zakresu).

Ponadto nie chcesz dodawać swoich kanałów razem w 16 bitach, chcesz dodać je razem w 32 bitach, a następnie przyciąć wynik i zredukować do 16 bitów na samym końcu. Będziesz potrzebował wyższego zasięgu, aby nie zawinął się podczas matematyki. Inną opcją jest użycie 32-bitowej liczby zmiennoprzecinkowej (co jest wygodne do robienia filtrów, efektów itp.).

Hubert Lamontagne
źródło
0

Myślę, że kluczem jest to, że jeśli masz 16-bitowe wartości i dodając 2 wartości razem, które mogą potencjalnie być większe niż wartość maksymalna, masz 2 opcje:

1) rzutuj oba na 32-bitowe dodawanie, a następnie zwróć maksymalną wartość, jeśli suma przekroczy tę wartość. Następnie wróć do 16 bitów. Na przykład, jeśli twoje wartości to 32768 i 34567, przekracza 65535, a kluczem jest zwrócenie 65535. Zrobiłbyś to samo, jeśli użyjesz wartości ze znakiem na końcu wartości minimalnej.

2) skompresuj obie wartości, a następnie dodaj je razem.

Pierwszy to zasadniczo wycinanie twarde, drugi to wycinanie miękkie. Wszystkie systemy analogowe są mocno przesterowane.

Wogster
źródło
0

Będą dwa razy więcej miejsca, jeśli częstotliwości obu ścieżek zajmą tę samą częstotliwość przestrzenną. Użyj eq i kompresji, aby obejść ten problem, wycinając obszary spektrum częstotliwości dla każdego dźwięku i kontrolując transjenty i podtrzymania dźwięków, aby wszystko wystrzeliło tam, gdzie powinno. Może to jednak nie odpowiada na pytanie. Możesz opóźnić sygnały o niższej częstotliwości nawet o 2 ms. Nie anuluje się w fazie, ponieważ długości fal są dłuższe niż wyższe częstotliwości, i doda przestrzeni, ponieważ transjenty nie są w pełni zgodne z energochłonnymi sygnałami basowymi. Coś liniowo zwiększającego opóźnienie, tym niższy sygnał byłby interesujący do przetestowania.

Max Cherry
źródło
-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

To znaczy, jeśli zarówno A, jak i B mają wspólny znak, zastosuj przesunięcie graniczne. Wielkość przesunięcia jest iloczynem A i B. Kierunek przesunięcia jest przeciwny do kierunku A i B.

Jeśli A i B nie mają wspólnego znaku, nie ma zastosowania żaden limit, ponieważ nie ma możliwości przepełnienia.

Rich Remer
źródło
Uwaga: nie jest to przemienne. Jeśli chcesz miksować więcej niż 2 głosy, musisz miksować je wszystkie naraz. W takim przypadku powinieneś „spłaszczyć” wszystko w jednym kierunku (jeśli jesteś zbyt wysoki, spłaszcz wartości dodatnie w dół wartościami ujemnymi; jeśli jesteś zbyt niski, spłaszcz wartości ujemne w dół wartościami dodatnimi). Po uwzględnieniu przesunięcia (zastosowanego proporcjonalnie do pozostałych wartości); użyj podejścia binarnego, ale skaluj ogranicznik na podstawie liczby mieszanych wartości.
Rich Remer
-1

Moja sugestia:

  1. Konwertuj format ścieżki audio z 16-bitowego punktu stałego na 32-bitowy zmiennoprzecinkowy.
  2. Dodaj bieżącą wartość próbki wszystkich ścieżek do miksowania.
  3. Nie rób nic więcej.

Użytkownik może chcieć przetworzyć ten mieszany strumień z kompresją i / lub ograniczeniem przed ditheringiem i konwersją do 16-bitowego formatu stałego punktu (przy założeniu, że ta konwersja ... miksowanie w celu przekazania inżynierom masteringowym jest zwykle pozostawione w formacie wyższej rozdzielczości)

Paw Aaron
źródło
2
Witaj i witaj w DSP.se. Dziękujemy za próbę wniesienia wkładu, ale nie wydaje mi się, żeby to w ogóle odpowiadało na pytanie OP. OP nie wspominał o „użytkownikach” swojego systemu: mógł bawić się nim samodzielnie lub pisać program zgodnie z określonymi wymaganiami. Przykro mi z góry głosować: Z przyjemnością zrewiduję mój głos, jeśli udzielisz bardziej trafnej odpowiedzi. Zadbaj również o formatowanie: zapoznaj się z często zadawanymi pytaniami, aby dowiedzieć się, jak pisać dobre odpowiedzi.
penelopa