So berechnen Sie effizient nur die niedrigen Koeffizienten einer mit Nullen aufgefüllten FFT


14

Ich habe einen Algorithmus, der eine Sequenz mit Null auf 4N auffüllt, eine FFT durchführt und nur die niedrigsten Frequenz-N-Punkte aus den generierten 4N verwendet.

Dies scheint eine Menge verschwendeter Arbeit zu sein. Gibt es Ideen, wie dies schneller erledigt werden kann?


@ Dilip. Ich werde FFTW- oder IMKL-Bibliotheken verwenden. Ich könnte natürlich meine kissfft-Bibliothek benutzen, aber sie beginnt mit einem Geschwindigkeitsnachteil gegenüber den anderen
Mark Borgerding,

2
Ich habe den Kommentar gelöscht, auf den Sie geantwortet haben, da ich "Dezimierung in der Frequenz" sagen wollte, aber stattdessen "Dezimierung in der Zeit" geschrieben habe. Aber schauen Sie sich das Schmetterlingsdiagramm hier an. Wenn Sie einen Code für die ersten beiden Stufen für den Schreib -FFT zu berücksichtigen , um die große Anzahl von Nullen und die entsprechenden Multiplikationen überspringen, können Sie dann die FFT - Bibliothek Subroutine aufrufen mal für -FFTs in der die Eingangsvektoren sind "voll". Natürlich benötigen Sie nur der Ausgaben von jedem Unterprogrammaufruf. 4N4NN/4
Dilip Sarwate

Antworten:


2

Wenn Sie nur ein paar Fächer haben, kann das Folgende für Sie sehr effizient sein:
1. Machen Sie einfach die DFT für jede Frequenz, die Sie benötigen.
2. Verwenden Sie für jede Frequenz den Goertzel-Algorithmus.


Mark sagte er brauchte Bins aus 4 N , so 1) scheint keine vernünftige Option. Der Goertzel-Algorithmus bietet Vorteile wie Online-Berechnung beim Empfang der Daten, geringer Speicherkapazität usw., benötigt jedoch 2 N + 4 Multiplikationen pro Bin, während jede Bin, die als Polynomauswertung nach der Horner-Regel berechnet wird, nur N Multiplikationen benötigt. Daher erscheint auch 2) nicht als besonders sinnvolle Option. N4N2N+4N
Dilip Sarwate

Sie haben Recht, als ich die Frage las, sind mir die Details irgendwie entgangen. Während ich antwortete, dachte ich: "Gee, es wäre schön zu wissen, wie viele Fächer er haben möchte ..." Ich schätze, ich sollte die Frage vor der Beantwortung noch einmal lesen.
Jacob

2

Das Null-Auffüllen auf die 4-fache Länge, das Berechnen der längeren FFT und die anschließende Verwendung nur der unteren 1/4-Bins führen zu nahezu identischen Ergebnissen wie die fensterbasierte Sinc-Interpolation der FFT der ursprünglichen Länge.

Verwenden Sie einfach die ursprüngliche FFT-Länge und interpolieren Sie mit einem 3-Phasen-Sinc-Interpolationskern mit einer geeigneten Fensterbreite.


0

Das Auffüllen mit Nullen im Zeitbereich gibt Ihnen eine Lösung mit höherer Frequenz, aber keine neuen Informationen, sodass im Frequenzbereich im Wesentlichen interpoliert wird. Abhängig von der Art Ihrer Signale und der erforderlichen Genauigkeit können Sie möglicherweise die zusätzlichen Frequenzpunkte mit einer regulären FFT von N Punkten erhalten und eine geeignete Interpolation durchführen (linear, Spline, Chip, Sinc usw.).


Sei ein Polynom (möglicherweise mit komplexen Koeffizienten x i ) vom Grad N - 1 . Wir bewerten es an den N Punkten α n , 0 n N - 1, wobei α = exp ( - j 2 π / N ) ein N istx(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)N-te Einheitswurzel, um Zahlen X n = x ( α n ) zu erhalten . Dies sind Werte von x ( z ) an N gleichmäßig beabstandeten Punkten auf dem Einheitskreis. Was wir wirklich wollen, sind die Werte von x ( z ) bei β n , 0 n N - 1, wobei β = exp ( - j 2 π / 4 N ) , die sindNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N) Punkte imersten Quadrantendes Einheitskreises. Ich verstehe nicht, wie Linear-, Spline- usw. Interpolation funktionieren wird. Bitte erkläre. N
Dilip Sarwate

Entschuldigung, dieser vorletzte Satz in meinem vorherigen Kommentar hätte den vierten Quadranten des Einheitskreises sagen sollen . Da , wurde bereits jeder vierte Sollwert x ( β 4 k ) durch die FFT berechnet: x ( β 4 k ) = x ( α k ) . β4=αx(β4k)x(β4k)=x(αk)
Dilip Sarwate

Ich vermute, es wäre schwierig, eine anständige Interpolation schneller als mit der größeren FFT durchzuführen.
Mark Borgerding

Angenommen, Sie haben eine 128-Punkt-FFT und eine Abtastrate von 12800 Hz. Eine 128-Punkt-FFT gibt Werte bei 0 Hz, 100 Hz, 200 Hz, 300 Hz usw. an. Durch das Auffüllen mit Null wird die Frequenzauflösung auf 0 Hz, 25 Hz, 50 Hz, 100 Hz usw. erhöht. Dies kann als Interpolationsproblem angesehen werden. Aus mathematischer Sicht müssen Sie eine Interpolation der 128. Ordnung durchführen. Das ist die Mühe sicher nicht wert, aber je nach Anwendung und erforderlicher Präzision wäre eine Interpolation viel niedrigerer Ordnung gut genug
Hilmar,
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.