10 Stimmen

Fast Fourier Transform (FFT) Input und Output zur Analyse der Frequenz von Audiodateien in Java?

Ich muss die FFT verwenden, um die Frequenz einer Audiodatei zu analysieren. Aber ich weiß nicht, was die Eingabe und Ausgabe ist.

Muss ich ein 1-dimensionales, 2-dimensionales oder 3-dimensionales Array verwenden, wenn ich die Audiodatei des Spektrums zeichnen möchte? Und kann mir jemand eine Bibliothek für FFT auf J2ME vorschlagen?

35voto

Ernest Barkowski Punkte 451

@thongcaoloi,

Die einfache Antwort bezüglich der Dimensionalität Ihrer Eingabedaten lautet: Sie benötigen 1D-Daten. Jetzt werde ich erklären, was das bedeutet.

Da Sie Audiodaten analysieren wollen, ist Ihre Eingabe für die diskrete Fourier-Transformation (DFT oder FFT) eine eindimensionale Folge von reellen Zahlen, die die sich im Laufe der Zeit ändernde Spannung des Audiosignals darstellt, und Ihre Audiodatei ist eine digitale Darstellung dieser sich im Laufe der Zeit ändernden Spannung.

Ihre Audiodatei wurde durch Abtasten der Spannung eines kontinuierlichen Audiosignals mit einer festen Abtastrate (auch als Abtastfrequenz bezeichnet) erzeugt, in der Regel 44,1 KHz für Audio in CD-Qualität.

Ihre Datendatei könnte jedoch mit einer viel niedrigeren Frequenz abgetastet worden sein. Versuchen Sie daher, die Abtastfrequenz Ihrer Daten herauszufinden, bevor Sie eine FFT mit diesen Daten durchführen.

Nun müssen Sie die einzelnen Samples aus Ihrer Audiodatei extrahieren. Wenn es sich um eine Stereodatei handelt, enthält sie zwei separate Sample-Sequenzen, eine für den rechten und eine für den linken Kanal. Handelt es sich um eine Mono-Datei, enthält sie nur eine Sample-Sequenz.

Wenn Ihre Datei in Stereo oder einem anderen Mehrkanal-Audioformat wie 5.1 oder 7.1 vorliegt, können Sie jeden Kanal separat fFTen oder eine beliebige Anzahl von Kanälen durch Spannungsaddition kombinieren. Das bleibt Ihnen überlassen und hängt davon ab, was Sie mit Ihren FFT-Ergebnissen erreichen wollen.

Das Ergebnis der DFT oder FFT ist eine Folge von komplexen Zahlen. Jede komplexe Zahl ist ein Paar, das aus einem Realteil und einem Imaginärteil besteht und in der Regel als Paar (re,im) dargestellt wird.

Wenn Sie die Leistungsspektraldichte Ihrer Audiodatei grafisch darstellen wollen, was die meisten Leute von der FFT erwarten, werden Sie 20*log10( sqrt( re^2 + im^2 ) ) grafisch darstellen, wobei Sie die ersten N/2 komplexen Zahlen der FFT-Ausgabe verwenden, wobei N die Anzahl der Eingangsabtastwerte für die FFT ist.

Sie können versuchen, Ihr eigenes Spektrum-Analyseprogramm zu erstellen, aber ich empfehle, etwas zu verwenden, das bereits erstellt und getestet wurde.

Diese beiden FFT-Spektrumanalysatoren liefern sofort Ergebnisse und verfügen über eine integrierte IFFT-Synthese, d. h., Sie können die Spektraldaten im Frequenzbereich invers Fourier-transformieren, um das ursprüngliche Signal im Zeitbereich zu rekonstruieren.

http://www.mathworks.com/help/techdoc/ref/fft.html

http://www.sooeet.com/math/fft.php

Es gibt noch viel mehr zu diesem Thema und zum Thema der digitalen Signalverarbeitung im Allgemeinen, aber diese kurze Einführung sollte Ihnen den Einstieg erleichtern.

4voto

Jeremy Salwen Punkte 7576

Im theoretischen Sinne bildet eine FFT komplex[N] => komplex[N] ab. Wenn es sich bei Ihren Daten jedoch nur um eine Audiodatei handelt, dann sind Ihre Eingaben einfach komplexe Zahlen ohne imaginäre Komponente. Sie werden also real[N] =>komplex[N] abbilden. Mit ein wenig Mathematik sehen Sie jedoch, dass das Format der Ausgabe immer output[i]==complex_conjugate(output[N-i]) ist. Sie brauchen sich also wirklich nur die ersten N/2+1 Stichproben anzusehen. Außerdem liefert die komplexe Ausgabe der FFT sowohl Informationen über die Phase als auch über den Betrag. Wenn Sie sich nur für Folgendes interessieren wie wie viel von einer bestimmten Frequenz in Ihrem Audio enthalten ist, müssen Sie nur den Betrag, der als Quadratwurzel(imaginär^2+real^2) berechnet werden kann, für jedes Element der Ausgabe betrachten.

Natürlich müssen Sie in der Dokumentation der von Ihnen verwendeten Bibliothek nachsehen, welches Array-Element dem Realteil der n-ten komplexen Ausgabe entspricht, und ebenso, um den Imaginärteil der n-ten komplexen Ausgabe zu finden.

1voto

Soweit ich mich erinnere, ist der FFT-Algorithmus nicht sehr komplex, ich habe für meine Diplomarbeit eine Klasse von FFT-Berechnungen geschrieben. Damals war die Eingabe ein 1D-Array von Werten, die aus den *.WAV-Dateien gelesen wurden. Aber vor der FFT wurden einige Filterungen und Normalisierungen durchgeführt.

0 Stimmen

Danke für die Hilfe. Sie können mir sagen, was ist die Ausgabe, es ist ein Wert oder ein Array? Können Sie mir den Quellcode der FFT mitteilen? Ich danke Ihnen vielmals!

1 Stimmen

Ich muss mal auf meiner Backup-Festplatte nachsehen, ob ich den Code noch habe, das ist schon lange her. Bitte schreiben Sie mir eine E-Mail für eine Erinnerung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X