FFT für einen bestimmten Frequenzbereich.


11

Ich möchte ein Signal in einen Frequenzbereich umwandeln. Der gewünschte Frequenzbereich ist 0.1 Hzzu 1 Hzund die Frequenzauflösung ist 0.01 Hz.

Mit der Abtastrate von 30 Hzgibt FFT die Frequenzkomponenten bis zu 15 Hz an. Durch Erhöhen der Abtastrate wird eine bessere Frequenzauflösung erzielt. FFT bietet jedoch einen größeren Frequenzbereich. In meinem Fall möchte ich nur 0.1 Hzzu 1 Hzaufgibt, FFT 15 Hz(extra Berechnung).

Meine Frage ist, gibt es überhaupt eine Standardmethode, mit der ich einen Frequenzbereich eines Signals mit einem bestimmten Frequenzbereich und einer hohen Auflösung berechnen kann?


2
klingt wie Sie wollen die Zoom FFT arc.id.au/ZoomFFT.html
Endolith

Wenn Sie nur eine Standard-DFT mit einer Abtastrate von 2 Hz und einer Dauer von 100 s durchführen, erhalten Sie ein Frequenzband von 0 bis 1 Hz mit einer Auflösung von 0,01 Hz. Nur 10% Ihrer Stichproben befinden sich außerhalb des Bereichs, an dem Sie interessiert sind. Lohnt es sich wirklich, die Details eines "nicht so standardmäßigen" Algorithmus zu erarbeiten, um die Effizienz dieser relativ kleinen Berechnung zu verbessern?
Das Photon

Die Einschränkung ist, dass die Dauer so kurz wie möglich sein muss. 100s ist zu lang. Wir brauchen ungefähr 10+ s
NcJie

Antworten:


5

Ich denke, die beste Lösung für Ihr Problem ist die Verwendung der Chirp-DFT. Es ist wie eine Lupe für einen bestimmten Frequenzbereich. Es ist effizienter als die direkte Implementierung der DFT (ohne FFT), da ein FFT-Algorithmus mit einer geeigneten Vor- und Nachbearbeitung verwendet werden kann. Grundsätzlich müssen Sie Ihr Signal mit einem Chirp-Signal modulieren, dann mit einer FFT filtern und dann Ihr Signal erneut zwitschern, um den gewünschten Frequenzgang zu erhalten. Weitere Informationen zur Implementierung der Chirp-DFT finden Sie hier und hier .


2

Es besteht auch die Möglichkeit der Verwendung von Frequenzverzerrungen (auch als Lupe, da Sie eine verbesserte Auflösung in Ihrem interessierenden Frequenzbereich für dieselbe FFT-Größe auf Kosten einer niedrigeren Auflösung bei höheren Frequenzen erhalten). Sie speichern jedoch keine MIPS, da die FFT-Größe nicht reduziert wird und die Frequenzverzerrung alles andere als billig ist.

Wenn Sie nur bestimmte Bins in der FFT berechnen möchten (und damit MIPS speichern möchten), gibt es dafür mehrere Methoden. Zum Beispiel die gleitende DFT. Die Referenzen in diesem Artikel geben eine sehr schöne Erklärung http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdf . Ich denke auch, dass der Goertzel Algo etwas Ähnliches macht, aber ich weiß es nicht.

Dann besteht die Möglichkeit des Downsamplings vor dem FFT'ing. Das wird wahrscheinlich auch einige MIPS sparen.

Bearbeiten: Nur um den Kommentar zu verdeutlichen, dass der Goertzel-Algorithmus nicht nützlich ist. Durch direktes Einfügen von Werten in den Ausdruck am Ende dieser Wiki-Seite http://en.wikipedia.org/wiki/Goertzel_algorithm ist der Goertzel-Ansatz komplexer als eine FFT, wenn die erforderliche FFT größer als 128 ist (Angenommen, die FFT-Größe ist ein Faktor 2 und eine Radix-2-Implementierung).

Es gibt jedoch andere Faktoren, die berücksichtigt werden sollten, die für Goertzel sprechen. Um nur die Wiki-Seite zu zitieren: "FFT-Implementierungen und Verarbeitungsplattformen haben einen erheblichen Einfluss auf die relative Leistung. Einige FFT-Implementierungen [9] führen interne Berechnungen komplexer Zahlen durch, um im laufenden Betrieb Koeffizienten zu generieren, wodurch sich ihre" Kosten K pro "erheblich erhöhen Arbeitseinheit. "FFT- und DFT-Algorithmen können Tabellen mit vorberechneten Koeffizientenwerten verwenden, um eine bessere numerische Effizienz zu erzielen. Dies erfordert jedoch mehr Zugriff auf Koeffizientenwerte, die im externen Speicher gepuffert sind, was zu einer erhöhten Cache-Konkurrenz führen kann, die einen Teil des numerischen Vorteils zunichte macht . "

"Beide Algorithmen erzielen eine Effizienz von ungefähr dem Faktor 2, wenn eher realwertige als komplexwertige Eingabedaten verwendet werden. Diese Verstärkungen sind jedoch für den Goertzel-Algorithmus natürlich, werden jedoch für die FFT nicht erreicht, ohne bestimmte Algorithmusvarianten zu verwenden, die auf die Transformation von real spezialisiert sind -bewertete Daten. "


1
Die gleitende DFT ist tatsächlich im Zusammenhang mit der Echtzeit-Spektrumanalyse nützlich, bei der die Eingabesequenz sehr lang ist und das Spektrum in regelmäßigen Abständen neu berechnet werden muss. Der Goertzel-Algorithmus ist sehr effizient, wenn nur wenige DFT-Werte berechnet werden müssen. Es wäre nicht nützlich, um das gegebene Problem zu lösen, da die gewünschte Anzahl von Frequenzpunkten zu groß ist.
Matt L.

Danke @MattL. für den Hinweis auf die Schwäche des Goertzel-Algorithmus.
NcJie

1

Die Frequenzauflösung ist wobei die Abtastfrequenz und die FFT-Größe ist. Das Erhöhen der Abtastfrequenz erhöht also tatsächlich die Frequenzauflösung (ich nehme an, mit "besser" meinen Sie niedriger). Sie sollten daher die FFT-Größe erhöhen , dh die Anzahl der Abtastwerte, die von der FFT in einem Datenblock verarbeitet werden, um die Frequenzauflösung zu verringern. In Ihrem Beispiel würden Sie mindestens 300 Abtastwerte benötigen, um die gewünschte Frequenzauflösung zu erreichen.

Δf=fsN
fsNN

Wenn aufgrund der Rechenkomplexität nicht erhöht werden kann, könnte das bandbegrenzte Signal vor der FFT frequenzverschoben werden. Sei das kontinuierliche Signal, seine Mittenfrequenz und seine Bandbreite. ist die abgetastete Version von , nämlich . Dann kann eine Frequenzverschiebung erreicht werden durch wobei . Die Abtastfrequenz kann jetzt reduziert werden, da das Signal jetzt im Gegensatz zur Grenzfrequenz eine Grenzfrequenz vons ( t ) f c f b x ( n ) s ( t ) x ( n ) = s ( n / f s )Ns(t)fcfbx(n)s(t)x(n)=s(n/fs)

x~(n)=x(n)ej2πk0/N
k0=fc/fsfb˜ f s f b ˜ x ( n ) M = f s / f b N.fb+fc es vor der Frequenzverschiebung. Gemäß dem Abtasttheorem muss die neue Abtastfrequenz größer oder gleich und somit kann um einen Faktor von wodurch die Frequenzauflösung erhöht wird, während konstant gehalten wird.f~sfbx~(n)M=fs/fbN

Diese Methode funktioniert nur, wenn streng bandbegrenzt ist. Ist dies nicht der Fall, muss die Bandpassfilterung zum Herausfiltern des gewünschten Frequenzbandes im Voraus angewendet werden. Beachten Sie auch, dass das Downsampling um eine Bruchzahl auch zusätzliche Rechenkomplexität mit sich bringt.M.s(t)M

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.