Quali dati devo usare per testare un'implementazione FFT e quale accuratezza dovrei aspettarmi?


14

Sono coinvolto nello sforzo di implementare un algoritmo FFT e sono curioso di sapere quale consiglio consigliato utilizzare i dati del test di input e perché! - e quale precisione aspettarsi.

Su input di test, ho trovato una piccola guida nei vecchi post di Usenet che posterò come risposta, ma sono solo i suggerimenti di una persona senza molta giustificazione: non ho trovato nulla che assomigli a una risposta solida.

In termini di accuratezza, Wikipedia afferma che l'errore dovrebbe essere O (e log N), ma qual è un'aspettativa ragionevole in termini assoluti?

Modifica per aggiungere: i test effettivi sono in una forma in cui ho archiviato matrici di dati di input e dati di output "di riferimento" pre-calcolati per confrontarli, quindi non ho necessariamente bisogno di qualcosa con una soluzione in formato chiuso.

Risposte:


12

Se si desidera verificare la correttezza di un algoritmo FFT , nel senso che esegue la funzione desiderata che ha le proprietà conosciute della trasformata discreta di Fourier , è possibile utilizzare l'approccio proposto in:

Ergün, Funda. (1995, giugno). Test delle funzioni lineari multivariate: superamento del collo di bottiglia del generatore. Nel Proc. Ventisettesimo Ann. ACM Symp. Teoria dell'informatica . (p. 407–416).

Il documento di cui sopra è indicato dai produttori di FFTW come il loro metodo di scelta per verificare che una particolare implementazione di FFT faccia quello che dovrebbe. La tecnica proposta distilla la funzione in tre componenti principali che vengono verificati con test separati:

  • Linearità: il DFT (insieme alle altre trasformazioni di suo cugino nella famiglia di Fourier) è un operatore lineare , quindi per tutti i valori di , deve essere la seguente equazione:un'1,un'2,X1[n],X2[n]

FFT(un'1X1[n]+un'2X2[n])=un'1FFT(X1[n])+un'2FFT(X2[n])
  • DFT dell'impulso dell'unità: un segnale nel dominio del tempo uguale alla funzione delta di Kronecker viene applicato all'ingresso dell'algoritmo FFT e l'uscita viene verificata rispetto al DFT noto della funzione dell'impulso dell'unità (si trasforma in un valore costante in tutte le uscite bidoni). Se l'algoritmo FFT fornisce un IFFT, può essere testato al contrario per mostrare che fornisce nuovamente la funzione di impulso dell'unità.

  • Time shift: due set di dati vengono applicati all'ingresso dell'algoritmo FFT; l'unica differenza tra i due nel dominio del tempo è uno spostamento temporale costante. In base alle proprietà note del DFT, ciò dovrebbe effettuare uno spostamento di fase lineare noto tra le rappresentazioni del dominio di frequenza dei due segnali, in cui la pendenza dello sfasamento è proporzionale allo spostamento del tempo.

Gli autori dell'articolo affermano che questi test sono sufficienti per convalidare la correttezza di un'implementazione FFT. Non ho usato questa tecnica in passato, ma sembra avere senso e mi fiderei degli autori di FFTW (che hanno prodotto un ottimo software libero) come autorità credibili su buoni approcci al problema della validazione.


Grazie! Gli autori hanno qualche suggerimento per i valori di a1, a2, x1 [n] e x2 [n] da utilizzare nel test di linearità (o affermano che questo in gran parte non ha importanza)? E, del resto, per i set di dati da utilizzare per il test del time shift?
Brooks Moses,

3
Avendo effettivamente letto il documento, posso rispondere alla mia domanda: gli autori non descrivono come si esegue il test di linearità, ma suppongo invece che sia stato fatto abbastanza per dimostrare che è vero per "la maggior parte degli input". Inoltre, questo documento sta descrivendo una prova della correttezza esatta assumendo l'aritmetica esatta; non sta descrivendo un mezzo per caratterizzare l'errore numerico in un programma approssimativo (come risulta necessariamente dall'uso dell'aritmetica a precisione finita).
Brooks Moses,

Vado avanti e lo segnerò come accettato, perché è sicuramente la risposta migliore finora - ma sono ancora molto interessato ad altre risposte che coprono quali set di dati di input di test usare (e perché), o dettagli sulla precisione prevista . Grazie!
Brooks Moses,

2
Ci sono davvero due componenti alla tua domanda sulla convalida di un algoritmo FFT: convalidare la sua correttezza e misurare la sua precisione numerica. La mia risposta riguardava solo la prima. È difficile fare dichiarazioni su quale precisione numerica aspettarsi, perché è intrinsecamente dipendente dall'implementazione. Il tipo di aritmetica (ad es. Fisso rispetto a virgola mobile), la struttura utilizzata per implementare l'algoritmo, la lunghezza FFT (ovvero il numero di stadi utilizzati per decomporre il problema), eventuali scorciatoie prese per migliorare la velocità di esecuzione, ecc. fattore e sono difficili da generalizzare.
Jason R,

Buon punto; Probabilmente avrei dovuto porre quelle come domande separate.
Brooks Moses,

5

Come menzionato nella domanda, ho trovato una serie di suggerimenti nei post archiviati comp.dsp Usenet ( http://www.dsprelated.com/showmessage/71595/1.php , post di "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, ....

Il thread suggerisce anche di fare due seni, uno con una grande ampiezza e uno con una piccola ampiezza.

Come ho detto nella domanda principale, non sono sicuro che si tratti di una serie di risposte particolarmente buone, o se è molto completa, ma sto mettendo qui in modo che le persone possano votare e commentare.


1
Cosa rivelerebbe "1. Inserire dati casuali"?
Dilip Sarwate,

1
@DilipSarwate: i test Fuzz possono essere utili per rivelare gli arresti anomali. E, a seconda del tipo di rumore in ingresso (ad esempio, rumore rosa o rumore bianco), potrebbe essere utile per verificare che la distribuzione complessiva di energia sia come previsto.
smokris,

2
@Dilip - Il mio "test del fumo" fft è ifft (fft (random_stuff)) ~ = random_stuff.
hotpaw2,

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

2
@Dilip: sono un ragazzo hardware. Volevo qualcosa che potesse attivare un'alta percentuale di tutti i bit in tutti i moltiplicatori e CSA.
hotpaw2,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.