Implementieren Sie die diskrete Fourier-Transformation (DFT) für eine Sequenz beliebiger Länge. Dies kann entweder als Funktion oder als Programm implementiert werden, und die Sequenz kann entweder als Argument oder unter Verwendung einer Standardeingabe angegeben werden.
Der Algorithmus berechnet ein Ergebnis basierend auf der Standard-DFT in Vorwärtsrichtung. Die Eingabesequenz hat Länge N
und besteht aus [x(0), x(1), ..., x(N-1)]
. Die Ausgabesequenz hat die gleiche Länge und besteht darin, [X(0), X(1), ..., X(N-1)]
wo jede X(k)
durch die folgende Beziehung definiert ist.
Regeln
- Dies ist Code-Golf, also gewinnt die kürzeste Lösung.
- Builtins, die die DFT in Vorwärts- oder Rückwärtsrichtung (auch als inverse Richtung bezeichnet) berechnen, sind nicht zulässig.
- Gleitkomma-Ungenauigkeiten werden nicht gegen Sie angerechnet.
Testfälle
DFT([1, 1, 1, 1]) = [4, 0, 0, 0]
DFT([1, 0, 2, 0, 3, 0, 4, 0]) = [10, -2+2j, -2, -2-2j, 10, -2+2j, -2, -2-2j]
DFT([1, 2, 3, 4, 5]) = [15, -2.5+3.44j, -2.5+0.81j, -2.5-0.81j, -2.5-3.44j]
DFT([5-3.28571j, -0.816474-0.837162j, 0.523306-0.303902j, 0.806172-3.69346j, -4.41953+2.59494j, -0.360252+2.59411j, 1.26678+2.93119j] = [2, -3j, 5, -7j, 11, -13j, 17]
Hilfe
Es gab zuvor eine Herausforderung , die DFT mithilfe eines FFT-Algorithmus für Sequenzen mit Längen gleich einer Potenz von 2 zu finden. Dort finden Sie möglicherweise einige Tricks, die Ihnen hier helfen könnten. Denken Sie daran, dass diese Herausforderung Sie nicht auf Komplexität beschränkt und dass Ihre Lösung auch für Sequenzen beliebiger Länge geeignet ist.
Python 3, 77 Bytes
Testen Sie es auf Ideone .
Der Code verwendet die entsprechende Formel
quelle
J,
30 bis20 Bytes3 Bytes dank @miles .
Verwendet die Tatsache, dass
e^ipi = -1
.Die Formel wird
X_k = sum(x_n / ((-1)^(2nk/N)))
.Verwendungszweck
wo
>>
ist STDIN und<<
ist STDOUT."Gleitkomma-Ungenauigkeiten werden nicht gegen Sie angerechnet."
quelle
MATL ,
2016 BytesDie Eingabe ist ein Spaltenvektor, dh Sie ersetzen Kommas durch Semikolons:
Dies verwendet die Formel in der Antwort von Leaky Nun , basierend auf den Tatsachen, dass exp ( iπ ) = −1 ist und dass die Potenzoperation von MATL mit einem nicht ganzzahligen Exponenten (wie in den meisten Programmiersprachen) das Hauptverzweigungsergebnis erzeugt .
Probieren Sie es online aus!
Aufgrund des seltsamen Abstands von Octave mit komplexen Zahlen sind der Real- und der Imaginärteil durch ein Leerzeichen getrennt, ebenso wie die verschiedenen Einträge des resultierenden Vektors. Wenn das zu hässlich aussieht, fügen Sie
!
am Ende ein ( 17 Byte ) hinzu, damit jeder Eintrag der Ausgabe in einer anderen Zeile steht.Erläuterung
quelle
Pyth, 30
Testsuite
Sehr naiver Ansatz, nur eine Umsetzung der Formel. Stößt auf verschiedene kleinere Gleitkommaprobleme mit Werten, die additiv umgekehrt werden sollten, um Werte zu erhalten, die leicht von Null abweichen.
Seltsamerweise
.j
scheint es ohne Argumente nicht zu funktionieren, aber ich bin mir nicht sicher, ob ich es richtig verwende.quelle
Pyth, 18 Bytes
Verwendet die Tatsache, dass
e^ipi = -1
.Die Formel wird
X_k = sum(x_n / ((-1)^(2nk/N)))
.Testsuite.
quelle
Julia, 45 Bytes
Probieren Sie es online aus!
Der Code verwendet die entsprechende Formel
quelle
Python 2, 78 Bytes
Das Polynom wird für jede Potenz
p
von ausgewertet1j**(4./len(l))
.Der Ausdruck
reduce(lambda a,b:a*p+b,l)
wertet das Polynom aus, das durchl
den Wertp
über die Horner-Methode gegeben ist:Außer, dass unsere Eingabeliste umgekehrt ist, mit einem konstanten Term am Ende. Wir könnten es umkehren, aber weil
p**len(l)==1
wir für Fourier-Koeffizienten einen Hack des Invertierensp
und Multiplizierens des gesamten Ergebnisses mit verwenden könnenp
.Einige Versuche gleicher Länge:
Als Funktion für 1 Byte mehr (79):
Ein Rekursionsversuch (80):
Iterativ simulieren
reduce
(80):quelle
C (gcc) ,
8678 BytesProbieren Sie es online aus!
Dies setzt voraus, dass der Ausgabevektor vor der Verwendung auf Null gesetzt wird.
quelle
Python 2, 89 Bytes
Verwendet die Tatsache, dass
e^ipi = -1
.Die Formel wird
X_k = sum(x_n / ((-1)^(2nk/N)))
.Ideone es!
quelle
Mathematica,
494847 BytesBasierend auf der Formel aus der @ Tennis- Lösung .
quelle
Axiom, 81 Bytes
mit der Formel jemand hier posten. Ergebnisse
quelle
Oktave ,
4339 BytesProbieren Sie es online aus!
Multipliziert den Eingabevektor mit der DFT-Matrix.
quelle