Welche Daten sollte ich zum Testen einer FFT-Implementierung verwenden und mit welcher Genauigkeit sollte ich rechnen?


14

Ich bin bemüht, einen FFT-Algorithmus zu implementieren, und bin gespannt, welche Empfehlungen für die Verwendung der eingegebenen Testdaten empfohlen werden - und warum! - und welche Genauigkeit zu erwarten.

Bei den Testeingaben habe ich in alten Usenet-Posts eine kleine Anleitung gefunden, die ich als Antwort posten werde, aber es sind nur die Vorschläge einer Person ohne viel Rechtfertigung - ich habe nichts gefunden, was nach einer soliden Antwort aussieht.

Zur Genauigkeit sagt Wikipedia, dass der Fehler O (e log N) sein sollte, aber was ist eine vernünftige Erwartung in absoluten Zahlen?

Bearbeiten zum Hinzufügen: Die eigentlichen Tests befinden sich in einer Form, in der ich Arrays von Eingabedaten und vorberechnete "Referenz" -Ausgabedaten gespeichert habe, mit denen ich vergleichen kann, sodass ich mit einer geschlossenen Form nicht unbedingt etwas brauche.

Antworten:


12

Wenn Sie einen FFT-Algorithmus auf Richtigkeit überprüfen möchten , in dem Sinne, dass er die gewünschte Funktion mit den bekannten Eigenschaften der diskreten Fourier-Transformation ausführt , können Sie den in folgenden Abschnitten vorgeschlagenen Ansatz verwenden:

Ergün, Funda. (1995, Juni). Testen multivariater linearer Funktionen: Überwindung des Generatorengpasses. In Proc. 27. Ann. ACM Symp. Theorie des Rechnens . (S. 407–416).

Das obige Papier wird von den Herstellern von FFTW als die Methode ihrer Wahl angegeben, um zu überprüfen, ob eine bestimmte FFT-Implementierung das tut, was sie sollte. Die vorgeschlagene Technik unterteilt die Funktion in drei Hauptkomponenten, die mit separaten Tests überprüft werden:

  • Linearität: Die DFT (zusammen mit ihren anderen Cousin-Transformationen in der Fourier-Familie) ist ein linearer Operator . Daher muss für alle Werte von die folgende Gleichung gelten:ein1,ein2,x1[n],x2[n]

FFT(ein1x1[n]+ein2x2[n])=ein1FFT(x1[n])+ein2FFT(x2[n])
  • DFT des Einheitsimpulses: Ein Zeitbereichssignal, das der Kronecker-Delta-Funktion entspricht, wird an den Eingang des FFT-Algorithmus angelegt und der Ausgang wird mit der bekannten DFT der Einheitsimpulsfunktion verglichen (es wird in allen Ausgängen ein konstanter Wert umgewandelt) Behälter). Wenn der FFT-Algorithmus eine IFFT bereitstellt, kann er umgekehrt getestet werden, um zu zeigen, dass er wieder die Einheitsimpulsfunktion liefert.

  • Zeitverschiebung: Zwei Datensätze werden an die Eingabe des FFT-Algorithmus angelegt. Der einzige Unterschied zwischen den beiden im Zeitbereich ist eine konstante Zeitverschiebung. Basierend auf den bekannten Eigenschaften der DFT sollte dies eine bekannte lineare Phasenverschiebung zwischen den Frequenzdomänendarstellungen der beiden Signale bewirken, wobei die Steigung der Phasenverschiebung proportional zur Zeitverschiebung ist.

Die Autoren des Papers behaupten, dass diese Tests ausreichen, um die Richtigkeit einer FFT-Implementierung zu validieren. Ich habe diese Technik in der Vergangenheit nicht verwendet, aber sie scheint sinnvoll zu sein, und ich würde den Autoren von FFTW (die ein großartiges Stück freier Software erstellt haben) als glaubwürdige Autoritäten für gute Ansätze zur Lösung des Validierungsproblems vertrauen.


Vielen Dank! Haben die Autoren Vorschläge für Werte von a1, a2, x1 [n] und x2 [n], die im Linearitätstest verwendet werden sollen (oder behaupten sie, dass dies größtenteils keine Rolle spielt)? Und für die Datensätze, die für den Zeitverschiebungstest verwendet werden sollen?
Brooks Moses

3
Nachdem ich den Artikel tatsächlich gelesen habe, kann ich meine eigene Frage beantworten: Die Autoren beschreiben nicht, wie man den Linearitätstest durchführt, sondern gehen davon aus, dass man ihn ausreichend durchgeführt hat, um zu beweisen, dass er für "die meisten Eingaben" zutrifft. Außerdem beschreibt dieser Aufsatz einen Beweis der exakten Korrektheit unter der Annahme einer exakten Arithmetik. es beschreibt kein Mittel zur Charakterisierung des numerischen Fehlers in einem Näherungsprogramm (wie es sich notwendigerweise aus der Verwendung von Arithmetik mit endlicher Genauigkeit ergibt).
Brooks Moses

Ich werde fortfahren und dies als akzeptiert markieren, da es sicherlich die beste Antwort ist, aber ich bin immer noch sehr an anderen Antworten interessiert, die beschreiben, welche Test-Eingabedatensätze verwendet werden sollen (und warum) oder Details zur erwarteten Genauigkeit . Vielen Dank!
Brooks Moses

2
Ihre Frage zur Validierung eines FFT-Algorithmus besteht aus zwei Komponenten: der Validierung seiner Richtigkeit und der Messung seiner numerischen Genauigkeit. Meine Antwort richtete sich nur an die erste. Es ist schwierig, Aussagen über die zu erwartende numerische Genauigkeit zu treffen, da dies inhärent von der Implementierung abhängt. Die Art der Arithmetik (z. B. fester versus Gleitkommawert), die Struktur, die zur Implementierung des Algorithmus verwendet wird, die FFT-Länge (dh die Anzahl der zur Zerlegung des Problems verwendeten Stufen), Tastenkombinationen zur Verbesserung der Ausführungsgeschwindigkeit usw. spielen alle eine Rolle Faktor und sind schwer zu verallgemeinern.
Jason R

Guter Punkt; Ich hätte diese Fragen wahrscheinlich getrennt stellen sollen.
Brooks Moses

5

Wie in der Frage erwähnt, habe ich eine Reihe von Vorschlägen in archivierten comp.dsp-Usenet-Posts gefunden ( http://www.dsprelated.com/showmessage/71595/1.php , Post von "tdillon"):

A.Single FFT tests - N inputs and N outputs
 1.Input random data
 2.Inputs are all zeros
 3.Inputs are all ones (or some other nonzero value)
 4.Inputs alternate between +1 and -1.
 5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
 7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.

B.Multi FFT tests - run continuous sets of random data
 1.Data sets start at times 0, N, 2N, 3N, 4N, ....
 2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....

Der Thread schlägt außerdem vor, zwei Sinuslinien zu verwenden, eine mit großer und eine mit kleiner Amplitude.

Wie ich in der Hauptfrage sage, bin ich mir nicht sicher, ob dies eine besonders gute Reihe von Antworten ist oder ob es sehr vollständig ist, aber ich sage es hier, damit die Leute darüber abstimmen und Kommentare abgeben können.


1
Was würde "1. Zufallsdaten eingeben" ergeben?
Dilip Sarwate

1
@DilipSarwate: Fuzz-Tests können hilfreich sein, um Abstürze aufzudecken. Abhängig von der Art des eingegebenen Rauschens (z. B. rosa Rauschen oder weißes Rauschen) kann es hilfreich sein, zu überprüfen, ob die Gesamtenergieverteilung den Erwartungen entspricht.
Smokris

2
@ Dilip - Mein fft "Rauch Test" ist der ifft (fft (random_stuff)) ~ = random_stuff.
hotpaw2

NCN(0,1)99%N CN(0,1)

2
@ Dilip: Ich bin ein Hardware-Typ. Ich wollte etwas, das einen hohen Prozentsatz aller Bits in allen Multiplikatoren und CSAs umschalten könnte.
hotpaw2
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.