Dieses Wikibook gibt an, dass die Ausgabe von FFT
MATLABs den Wellenzahlen entspricht, die wie folgt bestellt sind:
In den Beispielcodes auf derselben Seite sind die Wellenzahlen jedoch als codiert
k = [0:n/2-1 0 -n/2+1:-1];
Dies ist das gleiche wie beim ersten Mal, jedoch wird die Wellenzahl (die "maximale Wellenzahl") durch . Es scheint seltsam, dass sie zweimal würden .0 0
Es scheint, dass die richtige Reihenfolge erforderlich ist, um Ableitungen über Fourier-Transformationen zu erhalten, wie im Wikibook beschrieben. Welche davon ist richtig und dokumentiert MATLAB dies irgendwo?
matlab
fourier-analysis
Zweifel
quelle
quelle
Antworten:
Ich möchte meinen Kommentar erweitern und das Beispiel, auf das Sie verweisen, auf eine Weise überarbeiten, die verständlicher sein sollte als das Original, und erklären, warum
fft
die Koeffizienten so zurückgegeben werden, wie sie es tun.Als Referenz lautet der fft-Teil des Beispiels:
Ich habe einen weiteren Codeabschnitt direkt darunter hinzugefügt:
und wickelte beide Codeteile in ein
tic; toc
für die richtige Zeit. In einem besser lesbaren Format verwendet die zweite Methode:Der erste Unterschied ist, dass das zweite Beispiel viel intuitiver ist
k
. Dies ist der Hauptvorteil des zweiten Beispiels, da k jetzt in der Form vorliegt, in der wir über sie nachdenken. In der zweiten und dritten Zeile musste ichfftshift
um den Anruf herum hinzufügenfft
, dann einen Anrufifftshift
direkt innerhalb des Anrufs anifft
. Diese zusätzlichen Funktionsaufrufe ordnen die Koeffizienten von dem, was der Computer benötigt, um mit ihnen zu arbeiten, zu der Art und Weise neu, wie Menschen normalerweise über sie denken.Das Problem mit dem zweiten Beispiel ist, dass dies zwar
k
für uns intuitiver ist, die internen Matrizen jedoch zum Lösen und Invertierenfft
in nicht so vorteilhaften Formen verbleiben. Entweder müssen wir die Reihenfolge mit Aufrufen auffftswitch
ändernifftswitch
oder es muss fest in diefft
Funktionen codiert werden . Dies ist weniger fehleranfällig für Benutzer (vorausgesetzt, sie sind mit der Funktionsweise von fft nicht vertraut, wie es viele Leute tun), aber Sie zahlen einen Preis in der Laufzeit.Wie ich bereits sagte, fügte ich zum Vergleich Timing-Aufrufe um die beiden Blöcke hinzu und lief für mehrere N. Die Timing-Ergebnisse waren:
Wie Sie sehen können, verlangsamt das Hin- und Herwechseln der Werte den Prozess erheblich, insbesondere bei niedrigem N (wo es 30x langsamer ist). Dies ist nur ein Beispiel, und Ihr Computer zeigt möglicherweise leicht unterschiedliche Trends, abhängig von der Speichergeschwindigkeit, den Prozessorkernen / -geschwindigkeiten usw., aber dies veranschaulicht den Punkt. Der Grund für
fft
die verwirrende Ausgabe liegt darin, dass Sie einen nicht trivialen Bruchteil Ihrer Rechenzeit sparen.quelle
Ihre Frage bezüglich des Ersatzes der Wellenzahl ist ziemlich schwierig. Im Allgemeinen soll eine solche Wellenzahlmodifikation nicht Flops retten, wie einige hier vorgeschlagen haben, sondern die analytischen Besonderheiten beispielsweise bestimmter Differentialoperatoren berücksichtigen. Ich bin sehr überrascht, dass ich in Trefethens Spektralmethoden keine verwandte Diskussion finden konnte. Um fortzufahren, gehe ich davon aus, dass Sie sich Sorgen über die FFT-basierte spektrale Differenzierung machen und Transformationen in einem Bereich mit gleichmäßiger Kardinalität durchführen.
Die Faustregel für ungerade Ableitungen lautet: Setzen
und für gerade Derivate zu setzen
Wenn Sie mit Polstern zu tun haben, ist die Behandlung der Nyquist-Frequenz ähnlich langwierig. Es gibt eine ausgezeichnete Zusammenfassung, die diese Themen hier beweist und kommentiert !
quelle
Eine kurze Erklärung und Demo des Aliasing finden Sie in meinem IPython-Notizbuch hier .
quelle
quelle