Wie viele Fourier-Größen muss ich berechnen, bevor eine FFT effizienter als eine DFT wird?

8

Ich muss nur eine kleine Anzahl niederfrequenter Fourier-Komponenten eines komplexen zweidimensionalen Arrays berechnen. Ich werde immer wieder dieselben Fourier-Komponenten berechnen, wenn sich das Eingabearray ändert. In der Grenze, in der ich nur eine Fourier-Komponente haben möchte, wäre es natürlich am schnellsten, eine DFT-Matrix zu erstellen, die die gewünschte Komponente angibt, und diese Matrix wiederholt zu multiplizieren.

In der anderen Grenze wäre es schneller, eine FFT zu verwenden, wenn ich alle Fourier-Komponenten haben wollte.

Ab wann wird es schneller, die FFT des Arrays zu berechnen und einfach die Komponenten herauszuziehen, nach denen ich suche?

Wenn es einen Unterschied macht, wird das Eingabearray in meiner speziellen Situation . Ich verwende MATLAB, was bedeutet, dass meine FFT mit FFTW durchgeführt wird und eine Matrixmultiplikation für eine Matrix-DFT über einen beliebigen Matrixmultiplikationsalgorithmus durchgeführt wird, den MATLAB unter der Haube verwendet.256×256

Colin K.
quelle
2
Zunächst nur eine Anmerkung: DFT ist die mathematische Transformation und FFT ist ein schneller Algorithmus für ihre Berechnung. Mit DFT scheint mir die direkte Implementierung des diskreten Fourier-Transformationsausdrucks gemeint zu sein. Zweitens: Sie brauchen das Gegenteil nicht? In diesem Fall können Sie die Transformation nur für die Elemente implementieren, die Sie benötigen.
fcruz
Ja, ich bin mir der Unterscheidung zwischen DFT und FFT bewusst. Vielleicht ist die Art und Weise, wie ich die Begriffe verwendet habe, für mich und meine Kollegen nicht üblich. Was Sie gesagt haben, ist im Wesentlichen richtig: Ich verwende den Begriff "DFT", um eine direkte Berechnung eines oder mehrerer Fourier-Koeffizienten zu bezeichnen. Die FFT ist zwar effizient, beschränkt sich jedoch auf die Berechnung von Frequenzen von DC bis zur doppelten Nyquist-Frequenz mit einem Abtastabstand von 1 / N, wobei N die Größe des Arrays ist. Eine DFT kann im Allgemeinen eine Teilmenge dieser oder sogar Zwischenfrequenzen berechnen (k / N für nicht ganzzahliges k), ist jedoch nicht so effizient.
Colin K
@fcruz: Außerdem geht es bei dieser Frage genau darum, "die Transformation nur für die Elemente zu implementieren, die ich benötige". Ich frage, wie viele Elemente ich mit einer DFT berechnen kann, bevor es einfach schneller wäre, die gesamte FFT durchzuführen und dann die Werte wegzuwerfen, die ich nicht benötige. Die Antwort, die Rcompton gegeben hat, scheint in diesem Punkt ziemlich richtig zu sein.
Colin K

Antworten:

9

17.

Viele, viele Arbeiten wurden in gute FFT-Implementierungen investiert, und es ist unwahrscheinlich, dass Sie eine gute FFT-Bibliothek zuverlässig übertreffen können. Zum Beispiel passt sich fftw "automatisch an Ihren Computer, Ihren Cache, die Größe Ihres Speichers, die Anzahl der Register und alle anderen Faktoren an, die es normalerweise unmöglich machen, ein Programm für mehr als einen Computer zu optimieren", siehe diese Seite .

Sie haben Recht, dass es Situationen gibt, in denen es schneller ist, nur ein paar Punktprodukte zu berechnen, aber es wird sehr systemabhängig sein.

Ein Experiment:

EDU>> n = 256^2;
EDU>> x = randn(n,1);
EDU>> d = randn(1,n); %really, you should take a row from the output of the dftmtx command. But dftmtx(n) won't fit on my laptop...
EDU>> tic;d*x;toc; %time to compute a single frequency from the dft matrix
Elapsed time is 0.000225 seconds.
EDU>> tic;fft(x);toc; %time to compute the entire fft
Elapsed time is 0.003909 seconds.

Wenn also 4096 Datenpunkte berechnet werden, dauert die gesamte FFT nur etwa 17-mal länger als die Berechnung eines einzelnen Punktprodukts.

dranxo
quelle
1
Was ist die anfängliche "17." in deinem Beitrag?
Shuhalo
2
Das ist die Antwort :) Ich habe einen Test auf meinem eigenen Computer durchgeführt und das Ergebnis stimmt mehr oder weniger damit überein, bis die Größe des Eingabearrays 64 oder weniger erreicht. Die Antwort als Ganzes ist jedoch nicht sehr klar, weshalb ich sie noch nicht akzeptiert habe (zum Beispiel sollte es wirklich nicht nötig sein, dftmtx (256 ^ 2) zu produzieren!), Aber ich werde es bald tun, wenn niemand anderes mischt sich ein.
Colin K
4

Alternativ können Sie den Goertzel-Algorithmus verwenden , um die Frequenzkomponenten, an denen Sie interessiert sind, direkt zu berechnen.

eglaser
quelle
+1. Auf jeden Fall ein guter Vorschlag. Zu meiner großen Überraschung ist der im Matlabs Signal Processing Toolkit enthaltene Goertzel-Algorithmus jedoch erbärmlich langsam. Es ist schlechter als die DFT und die FFT für jede Kombination aus Eingabearraygröße und Anzahl der Ausgabewerte, die ich testen kann.
Colin K
1
Ich vermute, dass der Algorithmus selbst zwar in einigen Fällen rechnerisch effizienter ist, die Matlab-Implementierung jedoch in reinem Matlab geschrieben ist, während die in der DFT verwendete FFT und die Matrix-Multiplikation beide in hochoptimiertem C geschrieben sind.
Colin K
Im Fall der Goertzel-Alg. Wurde in diesem Vorlesungsteil des diskreten Zeitsignalkurses am MIT eine Diskussion über ihre algorithmische Effizienz im Vergleich zur FFT behandelt .
fcruz
Die naive Implementierung des Goertzel-Algorithmus kann zu ungenauen Ergebnissen führen, daher ist einige Vorsicht geboten. Man könnte in Betracht ziehen, stattdessen die von Christian Reinsch vorgeschlagene Modifikation zu verwenden. Siehe zum Beispiel die Diskussion in Bulirsch / Stoer .
JM