2012-04-16 10 views
8

Questa è più che altro una domanda teorica, ma eccola:dissolvenza incrociata di potenza uguale nell'unità audio?

Sto sviluppando un'unità audio ad effetto e ha bisogno di una dissolvenza incrociata di potenza uguale tra segnali asciutti e bagnati.

Ma sono confuso sul modo corretto di eseguire la funzione di mappatura dal fader lineare al fattore di scala (guadagno) per le ampiezze del segnale di flussi asciutti e bagnati.

Fondamentalmente, l'ho visto fatto con funzioni cos/sin o radici quadrate ... sostanzialmente approssimative a curve logaritmiche. Ma se la nostra percezione dell'ampiezza è logaritmica per iniziare, queste curve che associano la posizione del fader a un'ampiezza non dovrebbero essere effettivamente esponenziali?

Questo è ciò che intendo:

Ipotesi:

  • signal[i] significa il campione esimo in un segnale.
  • ogni campione è un float che va [-1, 1] per le ampiezze tra [0,1].
  • il nostro controllo GUI è un NSSlider che va da [0,1], quindi è in linea di principio lineare.
  • fader è una variabile con il valore di NSSlider.

Prima osservazione: percepiamo ampiezza in modo logaritmico. Quindi, se abbiamo un fader lineare e semplicemente aggiustare l'ampiezza di un segnale facendo: signal[i] * fader quello che stiamo percependo (udito, indipendentemente dalla matematica) è qualcosa sulla falsariga di:

enter image description here

Questa è la cd chiamato crappy fader-effect: passiamo dal silenzio ad un drastico aumento di volume attraverso il segmento più a sinistra nel cursore e oltre il centro il volume non sembra diventare più forte.

Quindi per fare il fader "a destra", noi invece lo esprimiamo in una scala dB e poi, per quanto riguarda il segnale, facciamo: signal[i] * 10^(fader/20) oppure, se dovessimo mantenere o dissolvere unità in [0, 1], che possiamo fare: signal[i] * (.001*10^(3*fader))

in entrambi i casi, la nostra nuova mappatura della NSSlider alla variabile fader che useremo per moltiplicare nel nostro codice, simile a questo ora:

enter image description here

Che è ciò che realmente vogliamo, perché poiché percepiamo l'ampiezza logaritmicamente, siamo essenzialmente mappi ng da lineare (intervallo NSSLider 0-1) a esponenziale e alimentando questo output esponenziale alla nostra percezione logaritmica. E si scopre che: log(10^x)=x quindi finiamo per percepire il cambiamento di ampiezza in modo lineare (ovvero corretto).

Grande.

Ora, il mio pensiero è che un crossfade di uguale potenza tra due segnali (in questo caso un NSSlider orizzontale secco/umido per combinare l'input con l'UA e l'output elaborato da esso) è essenzialmente lo stesso solo con un cursore che agisce su entrambi i segnali ipotetici secco [i] e bagnato [i].

Quindi, se i miei campi di scorrimento da 0 a 100 e secco è full-sinistra e umido è pieno-destra), sarei andato a finire con il codice lungo le linee di:

Float32 outputSample, wetSample, drySample = <assume proper initialization> 
Float32 mixLevel = .01 * GetParameter(kParameterTypeMixLevel); 
Float32 wetPowerLevel = .001 * pow(10, (mixLevel*3)); 
Float32 dryPowerLevel = .001 * pow(10, ((-3*mixLevel)+1)); 
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel); 

Il grafico di cui sarebbe:

enter image description here

E come prima, perché percepiamo ampiezza logaritmica, questa mappatura esponenziale dovrebbe effettivamente fare, dove si sente il crossfade come lineare.

Tuttavia, ho visto le implementazioni del crossfade utilizzando le approssimazioni per registrare le curve. Significato, invece:

enter image description here

Ma non sarebbero queste curve in realtà sottolineare la nostra percezione di ampiezza logaritmica?

+0

Suggerirei di chiedere questo sul sito della sorella DSP: http://dsp.stackexchange.com/ –

+0

Penso di averlo capito ora ma hey non sapevo di quel sito! – SaldaVonSchwartz

+0

Fresco. Se hai capito, dovresti rispondere alla tua stessa domanda - io per primo vorrei sapere la risposta che hai trovato. –

risposta

7

La dissolvenza incrociata "equal power" a cui si pensa ha a che fare con il mantenimento costante della potenza di uscita totale del mix mentre si dissolve da bagnato a secco. Mantenere costante la potenza totale serve come una ragionevole approssimazione per mantenere costante il volume percepito totale (che in realtà può essere abbastanza complicato).

Se si dissolvenze fra due segnali non correlati di pari potenza, è possibile mantenere una potenza costante durante la dissolvenza incrociata utilizzando qualsiasi due funzioni i cui valori quadrata sommare a 1. Un esempio comune di questo è l'insieme di funzioni

.

g1 (k) = (0,5 + 0,5 * cos (pi * k))^5

g2 (k) = (0,5 - 0.5 * cos (pi * k))^5,

.

dove 0 < = k < = 1 (notare che g1 (k)^2 + g2 (k)^2 = 1 è soddisfatto, come menzionato). Ecco una prova che questo si traduce in un crossfade di potenza costante per segnali non correlati:

Supponiamo di avere due segnali x1 (t) e x2 (t) con le stesse potenze E [x1 (t)^2] = E [x2 (t)^2] = Px, che sono anche non correlati (E [x1 (t) * x2 (t)] = 0). Si noti che qualsiasi serie di funzioni di guadagno che soddisfano la condizione precedente avrà quel g2 (k) = (1 - g1 (k)^2) ^. 5. Ora, formando il y somma (t) = g1 (k) * x1 (t) + g2 (k) * x2 (t), si ha che:

E[ y(t)^2 ] = E[ (g1(k) * x1(t))^2 + 2*g1(k)*(1 - g1(k)^2)^.5 * x1(t) * x2(t) + (1 - g1(k)^2) * x2(t)^2 ] 
= g1(k)^2 * E[ x1(t)^2 ] + 2*g1(k)*(1 - g1(k)^2)^.5 * E[ x1(t)*x2(t) ] + (1 - g1(k)^2) * E[ x2(t)^2 ] 
= g1(k)^2 * Px + 0 + (1 - g1(k)^2) * Px = Px, 

dove abbiamo usato che g1 (k) e g2 (k) sono deterministici e possono quindi essere tirati fuori dall'operatore di attesa E [], e che E [x1 (t) * x2 (t)] = 0 per definizione perché x1 (t) e x2 (t) sono assunti essere non correlato. Ciò significa che indipendentemente da dove ci troviamo nella dissolvenza incrociata (qualunque sia la k che scegliamo) il nostro output avrà comunque la stessa potenza, Px, e quindi si spera che il volume percepito sia uguale.

Si noti che per segnali completamente correlati, è possibile ottenere una potenza di uscita costante eseguendo un dissolvenza "lineare" e due funzioni che sommano a uno (g1 (k) + g2 (k) = 1). Quando si miscelano segnali che sono in qualche modo correlati, le funzioni di guadagno tra questi due sarebbero teoricamente appropriate.

Cosa stai pensando di quando si dice

E come prima, perché percepiamo ampiezza logaritmica, questa mappatura esponenziale dovrebbe effettivamente fare, dove sentiamo la crossfade come lineare.

è che un segnale dovrebbe percettivamente diminuire di volume come funzione lineare di posizione del cursore (k), mentre l'altro segnale dovrebbe percettivamente aumentare in volume come funzione lineare di posizione del cursore, quando si applica la vostra dissolvenza incrociata derivato. Anche se la tua derivazione sembra abbastanza precisa, sfortunatamente questo potrebbe non essere il modo migliore per armonizzare i segnali secchi e bagnati in termini di coerenza - spesso, mantenere un volume di uscita uguale, indipendentemente dalla posizione del cursore, è la cosa migliore da fare. In ogni caso, potrebbe valere la pena provare un paio di funzioni diverse per vedere cosa è più usabile e coerente.

Problemi correlati