2012-04-16 4 views
8

Dies ist eigentlich eher eine theoretische Frage, aber hier geht es:gleiche Leistung Crossfade in Audio Unit?

Ich entwickle eine Effekt-Audio-Einheit und es braucht eine gleiche Power-Crossfade zwischen trockenen und nassen Signalen.

Aber ich bin verwirrt über den richtigen Weg, um die Mapping-Funktion vom linearen Fader zum Skalierungsfaktor (Gain) für die Signalamplituden von trockenen und nassen Streams zu tun.

Grundsätzlich habe ich gesehen, dass es mit cos/sin-Funktionen oder Quadratwurzeln gemacht wurde ... im Wesentlichen approximierenden logarithmischen Kurven. Aber wenn unsere Amplitudenwahrnehmung zu Beginn logarithmisch ist, sollten diese Kurven, die die Faderposition auf eine Amplitude abbilden, tatsächlich exponentiell sein? Diese

ist, was ich meine:

Annahmen:

  • signal[i] bedeutet die i-te Probe in einem Signal.
  • Jede Probe ist eine Float Range [-1, 1] für Amplituden zwischen [0,1].
  • unsere GUI-Steuerung ist ein NSSlider von [0,1], so ist es in Prinzip linear.
  • fader ist eine Variable mit dem Wert des NSSlider.

Erste Beobachtung: Wir sehen Amplitude in logarithmischer Weise. Wenn wir also eine lineare Fader haben und lediglich ein Signal der Amplitude einstellen, indem Sie: signal[i] * fader, was wir wahrnehmen (Hören, unabhängig von der Mathematik) ist etwas entlang der Linien von:

enter image description here

Dies ist die so genannte cappy fader-effect genannt: Wir gehen von Stille zu einem drastischen Lautstärkeanstieg über das linke Segment im Schieberegler und über die Mitte hinaus scheint die Lautstärke nicht so lauter zu werden.

Um also den Fader "richtig" zu machen, drücken wir ihn entweder in dB aus und dann, was das Signal angeht: signal[i] * 10^(fader/20) oder, wenn wir Einheiten in [0 beibehalten oder vertauschen würden, 1], was wir tun können: signal[i] * (.001*10^(3*fader))

So oder so, unsere neue Zuordnung vom NSSlider auf die Fader Variable, die wir für die Multiplikation in unserem Code verwenden werden, sieht wie folgt aus jetzt:

enter image description here

Was wir eigentlich wollen, denn da wir die Amplitude logarithmisch wahrnehmen, sind wir im Wesentlichen mappi ng von linear (NSSLider Bereich 0-1) bis exponentiell und diese exponentielle Ausgabe zu unserer logarithmischen Wahrnehmung zu füttern. Und es stellt sich heraus, dass: log(10^x)=x wir am Ende die Amplitudenänderung auf eine lineare (aka korrekte) Weise wahrnehmen.

Großartig.

Nun, mein Gedanke ist, dass ein Equal-Power-Crossfade zwischen zwei Signalen (in diesem Fall eine trockene/nasse horizontale NSSlider, um den Eingang der AU und die verarbeitete Ausgabe von ihm zu mischen) ist im Wesentlichen das gleiche nur das mit ein Schieberegler wirkt auf beide hypothetischen Signale trocken [i] und nass [i].

Also, wenn mein Schieber Bereich von 0 bis 100 und trocken ist voll nach links und nass ist Voll rechts), ich mit Code würde am Ende entlang der Linien von:

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); 

Der Graph von denen wäre:

enter image description here

Und wie zuvor, weil wir Amplitude logarithmisch wahrnehmen, diese Exponentialabbildung sollte es eigentlich machen, wo wir die Überblendung als lineare hören.

Allerdings habe ich Implementierungen der Überblendung mit Annäherungen zu Log-Kurven gesehen. Das heißt, statt:

enter image description here

Aber nicht diese Kurven betonen tatsächlich unsere logarithmische Wahrnehmung der Amplitude?

+0

Ich würde vorschlagen, fragen Sie dies auf der DSP Schwesterseite: http://dsp.stackexchange.com/ –

+0

Ich glaube, ich habe es jetzt aber hey ich wusste nicht über diese Website! – SaldaVonSchwartz

+0

Kühl. Wenn du es herausgefunden hast, solltest du deine eigene Frage beantworten - ich möchte die Antwort, die du gefunden hast, wissen. –

Antwort

7

Der "Equal Power" Crossfade, an den Sie denken, hat damit zu tun, dass Sie die Gesamtausgangsleistung Ihres Mix konstant halten, während Sie von nass zu trocken verblassen. Die Gesamtleistung konstant zu halten, ist eine vernünftige Annäherung, um die wahrgenommene Gesamtlautstärke konstant zu halten (was in der Realität ziemlich kompliziert sein kann).

Wenn zwischen zwei unkorrelierte Signale gleicher Leistung Blenden sind, können Sie eine konstante Ausgangsleistung während der Überblendung aufrechtzuerhalten, indem zwei beliebige Funktionen verwendet, deren quadrierten Werte Summe 1. Ein typisches Beispiel hierfür ist der Satz von Funktionen

.

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

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

.

wobei 0 < = k < = 1 (beachte, dass g1 (k)^2 + g2 (k)^2 = 1 erfüllt ist, wie erwähnt). Hier ist ein Beweis, dass dies zu einer konstanten Leistungsüberblendung für unkorrelierte Signale führt:

Angenommen, wir haben zwei Signale x1 (t) und x2 (t) mit gleichen Leistungen E [x1 (t)^2] = E [x2 (t)^2] = Px, die ebenfalls unkorreliert sind (E [x1 (t) * x2 (t)] = 0). Man beachte, dass jeder Satz von Verstärkungsfunktionen, der die vorherige Bedingung erfüllt, g2 (k) = (1 - g1 (k)^2)^5 aufweist. Nun bildet die Summe y (t) = g1 (k) * x1 (t) + g2 (k) * x2 (t) haben wir, dass:

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, 

wo wir verwendet haben, daß g1 (k) und g2 (k) sind deterministisch und können daher per Definition aus dem Erwartungsoperator E [] herausgezogen werden, und E [x1 (t) * x2 (t)] = 0, weil x1 (t) und x2 (t) angenommen werden unkorreliert sein. Dies bedeutet, dass unabhängig davon, wo wir uns im Crossfade befinden (was auch immer wir wählen), unsere Ausgabe immer die gleiche Stärke, Px, und somit hoffentlich die gleiche wahrgenommene Lautstärke haben wird.

Beachten Sie, dass Sie für vollständig korrelierte Signale eine konstante Ausgangsleistung erreichen können, indem Sie eine "lineare" Fade - Using und zwei Funktionen mit einer Summe durchführen (g1 (k) + g2 (k) = 1). Wenn Signale gemischt werden, die etwas korreliert sind, wären Verstärkungsfunktionen zwischen diesen beiden theoretisch geeignet.

Was Sie denken an, wenn Sie sagen

Und wie zuvor, weil wir Amplitude logarithmisch wahrnehmen, diese Exponentialabbildung sollte es eigentlich machen, wo wir die Blendung als lineare hören.

ist, dass ein Signal in perzeptuell Lautstärke als eine lineare Funktion der Schieberposition (k), abnehmen sollte, während das andere Signal in perzeptuell Loudness als eine lineare Funktion der Schieberstellung zunehmen sollte, wenn die abgeleitete Blendung Anwendung. Während Ihre Herleitung davon ziemlich gut scheint, ist dies leider nicht der beste Weg, um Ihre trockenen und nassen Signale in Bezug auf Konsistenz zu mischen - oft ist das Aufrechterhalten der gleichen Ausgangsamplitude unabhängig von der Schieberposition das bessere Ding, um zu schießen. In jedem Fall könnte es sich lohnen, ein paar verschiedene Funktionen auszuprobieren, um zu sehen, was am nützlichsten und konsistent ist.

Verwandte Themen