Ich versuche, eine FFT zu implementieren, um zu verstehen, wie sie funktioniert. Ich verwende eine zufällige Sounddatei (also i kann die Größe des Signals nicht steuern) mit einer Abtastfrequenz von 44,1 kHz. Ich verwende diese Bibliothek
https://www.nayuki.io/res/free-small-fft-in-multiple-languages/Fft.java
Ziel ist es, diese Formel auf anzuwenden Ermitteln Sie die Häufigkeit: F = n * Fs / N
Mit n Anzahl der Fächer. Fs Abtastfrequenz und N Größe der FFT
1) Eine Fft soll eine Länge haben, die meisten von ihnen verwenden eine Potenz von 2 Radix. Aber wie kann ich die Länge der FFT ermitteln, wenn ich sie auf ein ganzes Datenarray anwende? Ist es die Größe dieses Arrays?
2) Ich verstehe die Bins nicht, wie wird sie verarbeitet? Ich weiß, dass FFT mit Datenblöcken funktioniert, aber wenn ich ein vollständiges Array von Daten gebe, wie werden die Bins „erstellt“.
Kommentare
- Diese Fragen können mit ein wenig Suchen und Lesen im Internet beantwortet werden. Ich empfehle Ihnen auch, Ihre Codierung mit mathematisch konstruierten zu beginnen Signale von ziemlich kurzer Dauer und wenden Sie Ihre FFT-Software auf diese an und untersuchen Sie die Ergebnisse.
- Ich habe tatsächlich viel gesucht, aber ich konnte ' nicht verstehen, aber vielleicht Ich ' bin einfach zu langsam. Vielen Dank für Ihre Besorgnis.
- Versuchen Sie, nach " Diskrete Fourier-Transformation " oder " Wie funktioniert eine DFT " anstelle von " Wie funktioniert eine FFT? " Eine schnelle Fourier-Transformation ist eine rechnerische Verknüpfung einer diskreten Fourier-Trans bilden. Bei der letzteren Suche finden Sie eher Informationen zur Recheneffizienz als zum zugrunde liegenden Prozess. Ich sehe ' nicht, wie Sie erwarten können, dass jemand die Grundlagen in einer schnellen Forumantwort besser erklärt als eine Reihe von Websites, die sich genau dem widmen. Die ersten vier Artikel in meinem Blog sollten auch für Sie nützlich sein. Beginnen Sie mit dsprelated.com/showarticle/754.php .
Antwort
Frage 1
Wenn Sie sie über die gesamte Länge des Arrays anwenden, entspricht die Länge der FFT der Länge des Arrays. Die FFT ist jedoch effizienter, wenn die Länge eine Zweierpotenz ist. Daher ist es üblich, 0 „s auf das Ende des Signals aufzufüllen, bis ihre Länge eine Potenz von 2 ist.
Übermäßig einfaches Beispiel …
x = [3.4, 2.56, 1.3]
x
hat eine Länge von 3, die nächste Potenz von 2 nach 3 ist 4, daher ändern wir x
in
x = [3.4, 2.56, 1.3, 0]
und wenden Sie eine FFT mit der Länge 4 an.
Ein weiteres großes ABER! Wenn Ihr Signal lang ist, ist es wird extrem ineffizient, um das Ganze auf einmal zu erledigen. Sie möchten nicht versuchen, eine FFT für eine Audiodatei mit der Länge eines kurzen Songs durchzuführen. In diesem Fall teilen wir das Signal in Stücke von angemessener Größe auf FFT für jeden und Durchschnitt der Ergebnisse.
Die Chancen stehen gut, dass das, was Sie tatsächlich mit Ihren Daten tun möchten, nicht nur eine Standard-FFT ist, sondern der oben beschriebene Mittelungsprozess. Google Bartlett und Welch Methoden für mehr d Details.
Frage 2
Ich bin mir nicht 100% sicher, worüber Sie hier fragen. Ich werde es so interpretieren, wie Sie wissen möchten, wie die Breite der Frequenzfächer bestimmt wird, und damit laufen.
Die Breite jedes Frequenzbeins wird ausschließlich durch die Rate bestimmt, mit der das Signal abgetastet wurde, und Die Länge jedes Fachs ist die Abtastfrequenz geteilt durch die Anzahl der Abtastungen in Ihrer FFT.
df = fs / N
Frequenzfächer beginnen bei -fs/2
und gehen bis zu fs/2
. Das heißt, wenn Sie bei 100 Hz für 100 Abtastwerte abgetastet werden, sind Ihre Frequenzfächer breit 1 Hz. Wenn Sie 200 Samples nehmen, haben Sie jetzt 2x so viele Frequenzbereiche und ihre Breite beträgt jeweils 1/2 Hz.
Kommentare
- Vielen Dank, es war alles, was ich ' nicht verstanden habe.