Die Fourier-Transformation begegnet einem oft in der Physik und der Mathematik, was bedeutet, dass sie auch viele alltägliche Anwendungen hat.
Kurz gesagt nimmt die Fourier-Transformation ein Eingangssignal, oft im Zeit- oder Ortsbereich, und wandelt es in den Frequenzbereich um. Konkret: Bei einem Eingangssignal, das aus einem Durcheinander (also einer Superposition) verschiedener Frequenzen besteht, trennt die Transformation die einzelnen Frequenzen heraus und zeigt ihre relativen Stärken.
Das macht die Transformation zu einem wichtigen Werkzeug in der Signalverarbeitung (z. B. Filterung, Kompression usw.) und in vielen Anwendungen der Datenwissenschaft. Deshalb wird sie vielleicht weiter verbreitet eingesetzt, als man zunächst denkt, was sie zugleich zu einem Paradebeispiel dafür macht, dass imaginäre Zahlen unverzichtbar sind, denn die Ausgabe der Fourier-Transformation ist im Allgemeinen eine komplexe Zahl.
Die Fourier-Transformation hat zwar eine Integralformulierung, aber wir arbeiten digital, also interessiert uns die diskrete Version. Die Herleitung der Transformation sprengt den Rahmen dieser Übung, doch die diskrete Transformation (in den Frequenzbereich) hat die folgende Form:
Xₖ = Σ xₙ * ℯ^(-2iπk * n/N)
Dabei läuft die Summe über n, und N ist die Anzahl der Abtastwerte, k ist die Frequenz, i die imaginäre Einheit und xₙ ein einzelner Abtastwert.
Die Fourier-Transformation ist zwar äußerst nützlich, aber naiv implementiert etwas langsam (O(n²)). Die schnelle Fourier-Transformation (FFT) ist ein Algorithmus, der das drastisch beschleunigt. Das geschieht üblicherweise mit einer Teile-und-herrsche-Strategie, die einige Symmetrien in der Formulierung ausnutzt und asymptotisch zu einer Komplexität von O(Nlog(N)) führt. Diese Beschleunigung verbessert die Praktikabilität und die Bandbreite der Anwendungen, für die sich die Transformation eignet, erheblich.
Dein Freund ist Toningenieur und hat dich gebeten, ihm zu helfen, eine Fourier-Transformation für eine proprietäre Software zu programmieren, die er gerade entwickelt. Weil du das richtig machen willst, implementierst du zuerst die Diskrete Fourier-Transformation (DFT) in ihrer ganzen naiven Pracht. Diese kann dann verwendet werden, um die Korrektheit deines endgültigen Ziels zu testen, der Schnellen Fourier-Transformation (FFT).
Implementiere die DFT.
Beachte, dass dies eine Komplexität von O(n²) hat, weil du für einen Durchlauf durch alle n ein k bekommst, und du möchtest einen Xₖ-Vektor, der die gleiche Länge wie der Signal-Xₙ-Vektor hat (für Invertierbarkeit), also ist n mal durch n Punkte O(n²).
Implementiere die FFT.
Es gibt viele Ressourcen, um mehr Details zu den Besonderheiten dieses Algorithmus zu finden, also recherchiere gerne.
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.