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:
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:
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:
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:
Aber nicht diese Kurven betonen tatsächlich unsere logarithmische Wahrnehmung der Amplitude?
Ich würde vorschlagen, fragen Sie dies auf der DSP Schwesterseite: http://dsp.stackexchange.com/ –
Ich glaube, ich habe es jetzt aber hey ich wusste nicht über diese Website! – SaldaVonSchwartz
Kühl. Wenn du es herausgefunden hast, solltest du deine eigene Frage beantworten - ich möchte die Antwort, die du gefunden hast, wissen. –