Algoritmo (i) per mescolare segnali audio senza clipping


49

Mi piacerebbe mescolare due o più canali audio PCM (ad es. Campioni registrati) digitalmente in maniera acusticamente fedele, preferibilmente in tempo quasi reale (che significa anticipare poco o niente).

Il modo fisicamente "corretto" per farlo è la somma dei campioni. Tuttavia, quando si aggiungono due campioni arbitrari, il valore risultante potrebbe essere fino al doppio del valore massimo.

Ad esempio, se i campioni sono valori a 16 bit, il risultato sarà fino a 65536 * 2. Ciò si traduce in ritaglio.

La soluzione ingenua qui è quella di dividere per N, dove N è il numero di canali miscelati. Tuttavia, ciò comporta che ogni campione sia 1 / Nth più forte, il che è completamente irrealistico. Nel mondo reale, quando due strumenti suonano simultaneamente, ogni strumento non diventa mezzo rumoroso.

Dalla lettura in giro, un metodo comune di missaggio è: risultato = A + B - AB, dove A e B sono i due campioni normalizzati da miscelare, e AB è un termine per garantire che i suoni più forti siano sempre più "soft-clipped".

Tuttavia, ciò introduce una distorsione del segnale. Questo livello di distorsione è accettabile nella sintesi audio di alta qualità?

Quali altri metodi ci sono per risolvere questo problema? Sono interessato a algoritmi efficienti di qualità inferiore e algoritmi di alta qualità meno efficienti.

Sto ponendo la mia domanda nel contesto della sintesi musicale digitale, allo scopo di mescolare insieme più tracce di strumenti. Le tracce potrebbero essere audio sintetizzato, campioni preregistrati o ingresso per microfono in tempo reale.


Mi chiedo quanto spesso sia possibile evitare il clipping semplicemente spostando un po 'il tempo dei segnali.
Sebastian Reichelt,

Buona idea, anche se sospetto che non sia così semplice, soprattutto quando non hai molto aspetto (ad esempio in tempo reale). Il problema è che devi conoscere il campione in anticipo per sapere quale tipo di spostamento temporale sarebbe appropriato. Detto questo, nella maggior parte della musica, avresti un'alta probabilità di correlazione, quindi un po 'di spostamento temporale casuale potrebbe funzionare molto bene. Qualcuno ha qualche esperienza su cui attingere qui?
Bryhoyt,

2
@bryhoyt: i veri mixer sommano i segnali insieme. Questo è tutto. Nessun ritardo o elaborazione non lineare richiesta. Il ritaglio non è un problema perché i segnali originali non erano così rumorosi.
endolith

2
16 + 16 bit = 17 bit ;-)
nikwal

1
basta dividere per numero di input, quindi il clipping non sarà possibile. e se il suono è troppo basso, alza l'amplificatore ...
Sarge Borsch

Risposte:


14

È molto difficile indicarti tecniche pertinenti senza conoscere alcun contesto per il tuo problema.

La risposta ovvia sarebbe quella di dirti di regolare il guadagno di ciascun campione in modo che raramente si verifichi il clipping. Non è irrealistico supporre che i musicisti suonerebbero più morbidi in un ensemble rispetto a quando gli viene chiesto di suonare da solo.

La distorsione introdotta da A + B - AB non è accettabile. Crea immagini speculari di A su ciascun lato delle armoniche di B - equivalenti alla modulazione ad anello - il che è abbastanza terribile se A e B hanno uno spettro ricco con armoniche che non sono in rapporti interi. Provalo su due onde quadrate a 220 e 400 Hz per esempio.

Una funzione di ritaglio più "naturale" che funziona in base al campione per campione, è la funzione tanh, che corrisponde effettivamente al comportamento di limitazione soft di alcuni elementi analogici. Oltre a ciò, puoi esaminare le classiche tecniche di compressione dinamica: se il tuo sistema può guardare avanti e vedere in anticipo i picchi, questo è ancora meglio.


4
Aggiunte e ritaglio duro. Guarda tutti i mod player open source. Usare un'aggiunta per il missaggio, con input ridimensionati in modo appropriato per ridurre al minimo il clipping, e quindi un hard limiter (opzionalmente morbido) è la norma, non l'eccezione ...
Pichenettes,

4
Nella maggior parte dei casi questa non è la responsabilità dello sviluppatore di risolvere il problema. Dai all'utente / compositore la possibilità di regolare il volume di ciascun canale e spetta all'utente fare il mix in modo che il clipping sia accettabile per loro. Ad esempio, in Renoise, per impostazione predefinita, il guadagno di ogni strumento / nota è 1 e le cose iniziano a tagliare male quando si aggiungono tracce - spetta all'utente regolare il volume delle note o degli strumenti nel modulo per evitare il clipping sul traccia master (a meno che non sia desiderato). Ecco uno screenshot che mostra che: i.imgur.com/KVxDt.png .
Pichenettes,

2
IIRC, FastTracker era più conservativo, in quanto applicava un'attenuazione su ciascuna traccia, e quindi aveva un "guadagno di trucco" globale nella finestra di dialogo delle preferenze da x1 a x32. Ricordo che quando dovevo eseguire il rendering di tutti i miei moduli su .WAV per un CD, dovevo provare i valori del guadagno fino a quando non ho trovato quello più basso che non ha causato il clipping ...
Pichenettes,

2
Per quanto riguarda il livello di attenuazione, nel caso in cui non si possa avere un utente nel loop; 1/32 è un livello assolutamente sicuro (nessun ritaglio). Supponendo che i canali non siano correlati (il che non è molto vero per la musica, più corretto quando si mescolano ambienti di sottofondo), un valore di 1 / sqrt (32) sarebbe un buon compromesso tra volume e probabilità di clipping. La soluzione migliore sarebbe comunque utilizzare 1/32 e quindi post-processare i campioni con un compressore dinamico.
Pichenettes,

3
Aggiunte. Questo è ciò che fanno comunque i mixer hardware ed è il modo in cui le persone si aspettano che le cose si comportino. I mixer a livello di sistema semplicemente clip. Sarebbe un grosso problema se i driver di sistema implementassero qualsiasi tipo di elaborazione non lineare - immaginerei il dolore degli ingegneri di mastering che cercano di capire se ciò che sentono è l'impostazione del plug-in del compressore o qualche elaborazione dinamica a livello di sistema. Il software di produzione musicale offre una vasta gamma di plug-in di compressione dinamica, spetta agli utenti assicurarsi che il loro mix non si blocchi.
Pichenettes,

16

Il modo fisicamente "corretto" per farlo è la somma dei campioni. Tuttavia, quando si aggiungono due campioni arbitrari, il valore risultante potrebbe essere fino al doppio del valore massimo. ... La soluzione ingenua qui è quella di dividere per N, dove N è il numero di canali miscelati.

Questa non è la soluzione "ingenua", è l' unica soluzione. Questo è ciò che fa ogni mixer analogico e digitale, perché è ciò che fa l'aria, ed è ciò che fa il tuo cervello.

Sfortunatamente, questo sembra essere un malinteso comune, come dimostrato da questi altri algoritmi non lineari di "miscelazione" (distorsione) non corretti:

La "divisione per N" si chiama headroom ; lo spazio aggiuntivo per i picchi allocato al di sopra del livello RMS della forma d'onda. La quantità di headroom richiesta per un segnale è determinata dal fattore di cresta del segnale . (L'incomprensione dei livelli del segnale digitale e del margine di manovra è probabilmente in parte responsabile della guerra di Loudness e di Elephunk .)

Nell'hardware analogico, l'headroom è forse di 20 dB. In un DSP hardware, viene spesso utilizzato il punto fisso, con un margine di sicurezza fisso; Il SigmaDSP di AD , ad esempio, ha 24 dB di headroom. Nel software per computer, l'elaborazione audio viene solitamente eseguita in virgola mobile a 32 bit, quindi l'headroom è enorme.

Idealmente, non dovresti dividere per N, sommeresti semplicemente i segnali, perché i tuoi segnali non sarebbero generati a 0 dBFS in primo luogo.

Si noti che la maggior parte dei segnali non sono correlati tra loro, comunque, quindi è raro che tutti i canali di un mixer interferiscano in modo costruttivo nello stesso momento. Sì, mescolando 10 onde sinusoidali in fase identiche aumenterebbe il livello di picco di 10 volte (20 dB), ma mescolando 10 fonti di rumore non coerenti aumenterà il livello di picco solo di 3,2 volte (10 dB). Per segnali reali, il valore sarà tra questi estremi.

Al fine di ottenere il segnale misto da un DAC senza clipping, è sufficiente ridurre il guadagno del mix. Se vuoi mantenere alto il livello RMS del mix senza hard clipping, dovrai applicare un certo tipo di compressione per limitare i picchi della forma d'onda, ma questo non fa parte del mix, è un passo separato. Mescoli prima, con un sacco di headroom, e poi lo sottoponi alla compressione della gamma dinamica in seguito, se lo desideri.


1
Capisco questi concetti, ma non sono sicuro che sia del tutto corretto. Certo, se aggiungo un mucchio di campioni a 16 bit, 32 bit mi danno un sacco di spazio numerico. Ma devo ancora riprodurre il mix risultante a un volume normalizzato su un sistema audio del mondo reale. Voglio che 2 canali suonino più forte di ogni canale riprodotto separatamente, ma non voglio il clipping. Fare le mie somme in 32 o anche 64 bit non aiuta a questo. Forse sto iniziando a rispondere alla mia domanda: i campioni originali dovrebbero essere normalizzati a un livello più basso rispetto all'ampiezza massima. Come suggerisci, lasciando un po 'di headroom di miscelazione.
Bryhoyt,

3
@bryhoyt: Sì, ma devi anche ricordare che le onde sono raramente correlate tra loro, quindi sommando 5 suoni non si raggiungono picchi 5 volte più alti.
endolith

1
Grazie, @endolith, immagino che sia davvero al centro di tutto ciò, e mi spiega perché non è un problema così grave come pensavo inizialmente.
Bryhoyt,

Quindi, se 10 fonti non coerenti danno 10 dB, la divisione per sqrt (numero di fonti) sarebbe una euristica ragionevole? Cioè, se hai 3 fonti, sommale e dividi per sqrt (3)? (scusate per aver commentato un filo antico)
nerdfever.com

@ nerdfever.com Ecco come si combinano i livelli RMS, quindi ... probabilmente?
endolith,

6

la formula

result=A+BAB

non ha alcun senso, anche se vuoi dire qualcosa di diverso da . Una cosa a cui devi pensare è che il suono varia sopra e sotto lo zero. Un modo migliore di pensarci è così:AB=AB

result=g(A+B)

dove .g1

L'approccio più semplice è dire , che è conservativo, lineare e funziona sempre, ma potrebbe non essere "rumoroso" come si desidera. Un approccio meno conservativo che "di solito funziona" ed è "più forte", è . Le estensioni a più canali con questo approccio funzionano meglio.g=0.5g=1/2

In alternativa, può cambiare nel tempo, nel qual caso di solito è il risultato di un algoritmo compressore / limitatore. Quindi hai davvero un'equazione di differenza:g

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

g[i] è un allora una funzione della precedente , , e .ABgresult

Forse questo:

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

AGGIORNAMENTO: come suggerito da hotpaw2, è possibile ritardare il segnale di ingresso ma non la soppressione del guadagno. Questo si chiama "limitatore del futuro".


Per "AB" intendo "A * B". Capisco che l'ampiezza può essere positiva o negativa. Hai ragione, la mia equazione non ha molto senso per la combinazione che coinvolge ampiezze negative.
Bryhoyt,

Devo mescolare da 8 a 10 (N) diverse onde sinusali. Empiricamente sapevo che il valore giusto era circa 0,3 ... 1 / √N sembra giusto ... qualsiasi link al perché quella formula è corretta?
Zibri,

5

Un modo può essere fatto per il missaggio non in tempo reale per utilizzare un AGC look-ahead, in cui il guadagno di uno o entrambi i canali viene ridotto a una velocità difficile da percepire prima che l'ampiezza della somma superi il limite di clipping. Quanto meno disponibile, o la regolazione del guadagno AGC diventerà più udibile, o il guadagno massimo per una rampa di regolazione del guadagno più morbida si avvicinerà sempre di più a 0,5 per canale al limite. Per le fonti sonore con una certa prevedibilità, si potrebbero anche usare statistiche sul comportamento dell'inviluppo nel tempo per indovinare in modo adattativo un limite di guadagno, ma con qualche probabilità di fallimento (che sarebbe una brusca regolazione del guadagno AGC).


Questo è un limitatore del futuro, non un AGC del futuro.
Bjorn Roche,

2
@BjornRoche: un limitatore non può essere considerato un tipo di AGC?
endolith

Alcuni limitatori sono AGC, ma un limitatore lookahead non è un AGC.
Bjorn Roche,

1
@BjornRoche bene è automatico e i controlli guadagnano ...
Olli Niemitalo,

2

Avevo parlato con un mixer designer della fine degli anni '90 e dei primi 2000 che andava sull'onda digitale (dopo aver camminato in punta di piedi). Penso che il ragazzo fosse un designer per SPL, ma forse non così grande, non ricordo assolutamente né il nome né il marchio, ricordo solo quanto fosse davvero grande e costosa la macchina.

Abbiamo parlato a lungo e alla fine abbiamo parlato delle tecniche per garantire davvero che i loro canali 64/128 @ 24 bit mescolati insieme rimanessero un canale di uscita misto accurato a 24 bit senza clipping.

La tecnica che ha spiegato era piuttosto semplice. Le 64 tracce (su 24 bit) sono state aggiunte in un canale a 48 bit, in cui il clipping non può avvenire. Dritto.

Non posso dire come quel segnale sia stato quindi retirato da 48 a 24 bit. Forse è qui che vengono applicate le ricette difficili della cucina.

E forse ci sono molte tecniche per raggiungere questo obiettivo, soprattutto diverse se fatte in tempo reale o con tutti i segnali già registrati con picchi alti semplici da determinare ... tutti i tipi di normalizzazioni da immaginare, penso.


2

Abbassa il volume globale. L'impostazione predefinita del tracker di impulsi emette canali con un volume massimo di circa il 33%.

Questo sembra sia abbastanza forte per la musica con pochi canali (Amiga MOD a 4 canali) e abbastanza morbido per le canzoni con 50 canali (poiché i contenuti del canale non sono in genere correlati, quindi il volume non si somma così velocemente oltre un certo livello ... inoltre pochi canali verranno emessi al massimo volume con così tante cose in corso). Inoltre, lascia abbastanza spazio per i canali con panning hard-left o hard-right (che utilizzano il 66% dell'intervallo).

Inoltre non vuoi aggiungere i tuoi canali insieme a 16 bit, vuoi aggiungerli insieme a 32 bit, quindi tagliare il risultato e ridurlo a 16 bit alla fine. Avrai bisogno della gamma più alta in modo che non si avvolga mentre fai la matematica. Un'altra opzione è quella di utilizzare il virgola mobile a 32 bit (che è conveniente per fare filtri, effetti ecc.).


0

Penso che la chiave sia che se si hanno valori a 16 bit e si sommano 2 valori che potrebbero potenzialmente essere più del valore massimo, allora si hanno 2 opzioni:

1) eseguire il cast di entrambi a 32 bit, quindi restituire il valore massimo se l'aggiunta supera tale valore. Quindi cast indietro a 16 bit. Ad esempio, se i valori sono 32768 e 34567 supera 65535 e la chiave è quindi restituire 65535. Farebbe la stessa cosa se si utilizzassero i valori con segno alla fine del valore minimo.

2) comprimere entrambi i valori, quindi sommarli.

Il primo è essenzialmente il ritaglio duro, il secondo è il ritaglio morbido. I sistemi analogici sono tutti hard clipping.


0

Saranno solo il doppio dello spazio se le frequenze in entrambe le tracce occupano la stessa frequenza spaziale. Usa l'equalizzazione e la compressione per aggirare questo problema ritagliando le aree dello spettro di frequenza per ciascun suono e controllando i transienti e i sostegni dei suoni in modo che tutto sporga dove dovrebbe. Forse questo non risponde alla domanda però. È possibile ritardare i segnali di frequenza inferiore fino a 2 ms. Non si cancellerà attraverso la fase perché le lunghezze d'onda sono più lunghe delle frequenze più alte e aggiungerà spazio perché i transitori non sono completamente in tempo con i segnali dei bassi affamati di potenza. Qualcosa che aggiunge linearmente più di un ritardo più basso è il segnale che sarebbe interessante testare.


-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

Cioè, se sia A che B condividono un segno, applicare un offset di limitazione. L'entità dell'offset è il prodotto di A e B. La direzione dell'offset è opposta a quella di A e B.

Se A e B non condividono un segno, non viene applicato alcun limite, poiché non è possibile traboccare.


Nota che questo non è commutativo. Se vuoi mescolare più di 2 voci, devi mescolarle tutte in una volta. In questo caso, dovresti "appiattire" tutto in una direzione (se sei troppo alto, appiattisci i valori positivi con quelli negativi; se sei troppo basso, appiattisci i valori negativi con quelli positivi). Dopo aver calcolato l'offset (applicato proporzionalmente ai valori rimanenti); usa l'approccio binario, ma ridimensiona il limitatore in base al numero di valori misti.
Rich Remer

-1

Il mio consiglio:

  1. Converti il ​​formato audio della traccia da punto fisso a 16 bit a virgola mobile a 32 bit.
  2. Aggiungi il valore di esempio corrente di tutte le tracce da miscelare.
  3. Non fare nient'altro.

L'utente potrebbe voler elaborare questo flusso misto con compressione e / o limitazione prima del dithering e della riconversione in formato a punto fisso a 16 bit (supponendo che questa conversione ... il mixdown da tramandare agli ingegneri di mastering di solito venga lasciato in un formato a risoluzione più alta)


2
Ciao e benvenuto su DSP.se. Vi ringraziamo per aver cercato di contribuire, ma non credo che questo risponda alla domanda del PO. L'OP non ha menzionato "utenti" del suo sistema: potrebbe giocarci da solo o scrivere il programma secondo requisiti specifici. Mi dispiace sottovalutare: sarò felice di rivedere il mio voto se rendi la tua risposta più approfondita al punto. Inoltre, prenditi cura della tua formattazione: dai un'occhiata alle FAQ per vedere come scrivere buone risposte.
penelope,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.