Ich möchte ein Signal in einen Frequenzbereich umwandeln. Der gewünschte Frequenzbereich ist 0.1 Hz
zu 1 Hz
und die Frequenzauflösung ist 0.01 Hz
.
Mit der Abtastrate von 30 Hz
gibt 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 Hz
zu 1 Hz
aufgibt, 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?
Antworten:
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 .
quelle
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. "
quelle
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.
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 )N s(t) fc fb x(n) s(t) x(n)=s(n/fs)
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
quelle