So analysieren Sie Audioeingang / -spektrum richtig


9

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.


2
Diese Frage scheint nicht zum Thema zu gehören, da es sich um grundlegende Java-Arrays, Datentypen und das Lesen von Dateien handelt.
hotpaw2

1
Sie sagten, ich muss hier fragen, wie es mit Signalverarbeitung zu tun hat
user3241507

Nur der letzte Teil Ihrer Frage scheint sich mit DSP zu befassen. Versuchen Sie, die ersten 2 oder 3 Teile zu entfernen, die hier zum Thema gehören.
hotpaw2

Antworten:


8

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.


5

Wenn Sie gut genug damit umgehenJAVA können, können Sie mit den JTRANSFORMS eine Java-Bibliothek verwenden, für FFTdie Sie möglicherweise Hilfe benötigen

und nach deinem Bedürfnis klingt es wie ein

Geben Sie hier die Bildbeschreibung 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 rateSie eine Abtastrate von 8000 verwenden und jedes Sample ist 16bit signed little endian. Dann beträgt Ihr Frame von 20 ms 160 Samples

Hinweis: Versuchen Sie, eine rawDatei abzuspielen , keine komprimierte mp3Datei.

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 absoluteWert 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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.