2009-07-08 6 views
3

Hi, ich würde gerne wissen, ob es überhaupt möglich ist, einen "parametrischen" Equalizer im Flash zu erstellen. Nicht nur die üblichen grafischen Effekte, sondern auch ein Werkzeug, um die Ausgabe des Sounds zu modifizieren, der durch die Anwendung geht. Jede Referenz, Tipps Idee begrüßt. DankeErstelle einen Flash Equalizer (ändere den Ausgangsound)

Antwort

6

Es ist nicht sehr einfach sein ... aber hier könnte ein Weg sein:

var parameters:Array = [1,1,1,1,0.5] 
var sound:Sound = new Sound(); 
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, filter); 
sound.load(soundURLRequest); 
sound.play(); 

private function filter(event:SampleDataEvent):void 
{ 
    var freqDomain:Array = FFT(event.data, parameters.length); // You will need to find a FFT(Fast Fourier Transform) function to generate an array. 
    for(var i:int = 0; i < freqDomain.length; i++) 
    { 
     freqDomain[i] = freqDomain[i] * parameters[i]; // This is where your EQ parameters get applied. 
    } 
    var timeDomain:Array = IFFT(freqDomain, event.data.length); // Inverse FFT 

    for(value:Number in timeDomain) 
    { 
     event.data.writeFloat(value); 
    } 
} 

Einige auf der FFT und Funktionen IFFT, gibt in der Regel FFT komplexe Werte (real + komplexe Komponenten), der in Größen- und Phasenkomponenten umgewandelt werden. Was Sie wirklich brauchen, ist nur die Größe, die eine Formel = (sqrt (real^2 + complex^2)) hat. Menschen Ohren sind nicht empfindlich auf die Phase (im Gegensatz zu den Augen, die sehr empfindlich auf Phase sind), so wenn Sie die inverse FFT, können Sie eine zufällige oder flache Phase mit wenig Unterschied einfügen. Beachten Sie, dass mein Ansatz hinsichtlich der Filterimplementierung sehr gering ist.

Hier ist eine Fourier-Transformationsfunktion (nicht Fast, es ist nur eine Faltung (O (n^2)) vs FFT O (nlogn)) nur als Referenz (err .. es ist von der Spitze meines Kopfes, also wenn könnte mit den Konstanten falsch sein):

// Note that this only returns the magnitude, I am discarding the phase. 
function FFT(sample:Array, size):Array 
{ 
    var frequencies = new Array(size); 
    for(int i = 0; i < sample.size; i++) 
    { 
     for(int j = 0; i < frequencies.size; j++) 
     { 
      var real:Number = sample[i] * Math.cos(Math.PI/2 * i * j); 
      var complex:Number = sample[i] * Math.sin(Math.PI/2 * i * j); 
      frequencies[j] += Math.sqrt(real * real + complex * complex); 
     } 
    } 
    return frequencies; 
} 
+0

das Objekt event.data von Sample vergangen ist ein bytearray, kein Array. Empfehlungen zum Aktualisieren des Codes für die Verarbeitung eines Bytearrays Was ist auch erforderlich, um die IFFT zu machen? – klamping

+1

ByteArrays ermöglichen die Indexierung (mit [i], um Teile zu greifen), so dass Sie es im Wesentlichen wie ein Array verwenden. Sie können IFFT-Algorithmen online finden, aber es wird im Wesentlichen die FFT erneut ausgeführt, aber mit unterschiedlichen Größen- und Phasenfaktoren. – CookieOfFortune

1

Überprüfen Sie Andre Michelle's labs page. Er macht eine Menge Arbeit mit Audo in Flash ... wahrscheinlich einer der besten. Ich bin mir nicht sicher, was eine parametrische Gleichung ist, aber Sie sollten in der Lage sein, einige gute Informationen auf dieser Seite zu finden.

0

Wahrscheinlich ein Satz von digital filters wäre die beste Wahl sein. Anders als bei der FFT müssen Sie mit dem digitalen Filter nicht die gesamte Wellenform im Speicher halten, da die digitalen Filter kausal sind und nur wenige Punkte in die Vergangenheit und/oder Zukunft schauen. Auch wenn Sie den Sound streamen können, können Sie diese einfach im laufenden Betrieb anwenden. Einfache Filter können einfach miteinander verkettet werden, um kompliziertere Filter zu erstellen.

Es gibt eine free book on digital filters, die einige grundlegende Theorie hat, aber wo man auch Formeln durchblättern und heben kann. Zum Beispiel, eine schnelle Durchsicht von Ch. 19 listet einfache Formeln für rekursive Hochpass-, Tiefpass- und Bandpassfilter auf, die wahrscheinlich den Zweck erfüllen werden, aber wenn Sie raffinierter werden wollen, gibt es im ganzen Buch viele andere Filter. diese

+0

Das Problem mit FIR- und IIR-Filtern ist, dass es nicht trivial ist, dass sie an willkürlichen Frequenzparametern arbeiten. – CookieOfFortune

+0

@Cookie - Dies gilt für einige digitale Filter, aber nicht für alle. Die Referenz, die ich erwähnte, listet mehrere Filter auf, die einfach zu berechnen sind, in nur ein paar sehr einfachen Codezeilen. – tom10

1

Update: fand ich ein Beispiel einer 3-band equalizer using Flash 10. Es verwendet andere Mathematik als CookieOfFortune erwähnt, aber es funktioniert (gut, es tat). Mit diesem Update habe ich das Beispiel für 5-Bänder aktualisiert und es für die Ausführung in Flex konvertiert. Sie können see the code on GitHub.

Wenn jemand irgendwelche Vorschläge hat, wie die Mathematik ausgeführt wird, wäre ich mehr als glücklich, davon zu hören. Ich weiß wirklich nicht viel in Bezug auf Klangmodifikation.


Original-Beitrag: Ich bin nicht sicher, wie viel dies helfen wird, aber das ist eine Notlösung, ohne den Schmerz der FFT und solche die Wirkung des Equalizers zu bekommen.

http://www.webdesign.org/web/flash/tutorials/sound-equalizer.5020.html

Grundsätzlich Sie mehrere Versionen der Sounddatei erstellen, legt jeweils eine vorgefertigte Equalizer-Einstellung. Wenn der Benutzer dann die Bässe oder Höhen einstellt, stellen Sie einfach die Lautstärke der jeweiligen Datei ein.

Sie können auch die extract() Funktion hilfreich auf dem Sound Variable finden: http://livedocs.adobe.com/flex/3/langref/flash/media/Sound.html#extract

+0

Es scheint, dass sie FFT verwenden. Sie können diese Anweisungen ziemlich einfach verallgemeinern, um beliebige Bänder zu erzeugen (auf Kosten der Erhöhung der Pufferlänge). – CookieOfFortune