Ich bin ziemlich neu in Java und Signalverarbeitung, aber mir wurde ein Projekt zugewiesen, das sich mit Audioverarbeitung befasst. Mein Thema ist ein Spiel, das eine Komponente zum Analysieren eines Songs (eines bestimmten Songs) enthält und Daten abhängig von der aktuell gespielten Frequenz (Echtzeit) ausgibt. dh: Während der Wiedergabe des Songs wird die aktuelle Frequenz ausgegeben (jede Sekunde wird die aktuelle Frequenz ausgegeben).
Mir wurde beim Stackoverflow gesagt, dass ich FFT verwenden soll. sie sagen "mach einfach eine FFT", aber das bedeutet mir nichts? WIE machst du eine FFT? Ich habe Tutorials gelesen und verstehe im Grunde, was es ist, habe aber keine Ahnung, wie ich es wie folgt implementieren soll:
- Welcher Datentyp der Audiodatei ist für eine solche Verarbeitung am besten geeignet?
- Was genau ist der Eingang der FFT
- Wie interpretiere ich die Ergebnisse?
Kann jemand ein einfach zu befolgendes Tutorial zur Verarbeitung eines Audiosignals vorschlagen? Wenn jemand eine gute Implementierung von FFT für Java kennt, würde ich mich über die Vorschläge freuen.
Antworten:
Wir werden sehen. Ich habe keine Ahnung von Java-Klassen oder der Art der Unterstützung für die Signalverarbeitung, aber ich werde Ihnen einige Richtlinien geben. Die besonderen Details der Implementierung in der Sprache müssen Sie herausfinden.
Für jede Art der Verarbeitung einer Audiodatei benötigen Sie die "Rohdaten", dh eine Audiodatei mit unkomprimierten Audiobeispielen. Zum Beispiel das WAV-Format, das normalerweise Samples im 16-Bit-2-Komplement mit Vorzeichen enthält.
Wenn Sie einen Computer verwenden und eine Offline-Verarbeitung durchführen, ist es möglicherweise eine gute Idee, diesen Wert in ein Doppel umzuwandeln (was in den meisten Prozessoren heutzutage eine 64-Bit-Gleitkommazahl bedeutet).
Daher haben Sie einen kontinuierlichen Strom von doppelten Zahlen aus der Datei. Dann müssen Sie einen Weg definieren, um mit den kontinuierlichen Daten umzugehen. Eine weit verbreitete Standardmethode ist die Verwendung eines Ringpuffers (auch wenn dieser offline ist, gehe ich davon aus, dass Ihr Code effizient sein soll und das Laden der gesamten Datei in den Speicher als Array nicht die beste Lösung ist). Entweder das oder nur ein normaler Puffer ist Ihre Wahl. Die Pufferlänge sollte eine Potenz von 2 sein (Do zur Effizienz des Cooley-Tukey-Radix-2-Algorithmus).
Jetzt müssen Sie die eigentliche FFT durchführen. Dies ist lediglich eine Multiplikation des Puffers (der mathematisch ein Vektor ist) mit der FFT-Matrix. Wie diese Operation tatsächlich in Java ausgeführt wird, ist keine Ahnung. In C wäre es nur, den Zeiger an das Array und die Länge an eine FFT-Routine zu übergeben, die entweder einen Zeiger auf den dinamisch zugewiesenen Speicher zurückgibt oder das Ergebnis in einem Array belässt, das Sie an dieses übergeben.
Schließlich gelangen Sie zu einem Array von M komplexen Zahlen (Angenommen, die Länge des Arrays / Puffers / Vektors mit dem Signal ist M). Und dann machst du damit, was du willst.
Zum Beispiel könnten Sie die Größe jeder der komplexen Zahlen nehmen und das Maximum finden, um zu erkennen, wo die Grundfrequenz sein könnte (allerdings sehr ungefähr).
Extras: Fortgeschrittenere zu verarbeitende Techniken umfassen eine Vorfensterung, um Leckagen zu vermeiden, Null-Padding, um eine höhere Auflösung des Fensterspektrums zu erzielen usw.
Ich hoffe es hilft.
quelle
Wenn Sie gut genug damit umgehen
JAVA
können, können Sie mit den JTRANSFORMS eine Java-Bibliothek verwenden, fürFFT
die Sie möglicherweise Hilfe benötigenund nach deinem Bedürfnis klingt es wie ein
Musikvisualisierung mit Java Sound API
Musikvisualisierung mit FFT in Ruby in 7Steps
Sie können diese einfachen Schritte je nach Anforderung ausführen:
* Gewöhnen Sie sich an eine Audio-Terminologie
1.Lesen Sie den Wiedergabe-Frame (sagen wir 20-30 ms). Ihre Frame-Größe hängt davon ab, ob
sampling rate
Sie eine Abtastrate von 8000 verwenden und jedes Sample ist16bit
signed
little endian
. Dann beträgt Ihr Frame von 20 ms 160 SamplesHinweis: Versuchen Sie, eine
raw
Datei abzuspielen , keine komprimiertemp3
Datei.2.Nehmen Sie den Rahmen der Rohdaten und führen Sie a
FFT
3. Richtig durchführen
Windowing
4.Ihr Ausgabe-FFT-Ergebnis besteht aus zwei realen und komplexen Komponenten. Versuchen Sie, daraus ein Betragsdiagramm zu erstellen, das nur den
absolute
Wert der komplexen Komponente darstellt. Ihr Peak gibt Ihnen diedominant frequency
5. Schauen Sie sich einfache Tutorials wie unten an
Gutes Tutorial zu FFT
Leitfaden für Ingenieure zu FFT
FFT Tutorial
Übersicht über FFT
quelle