¿Qué datos debo usar para probar una implementación de FFT y qué precisión debo esperar?

14

Estoy involucrado en un esfuerzo por implementar un algoritmo FFT, y tengo curiosidad por saber cuál es el consejo recomendado para usar los datos de prueba de entrada, ¡y por qué! - y qué precisión esperar.

En las entradas de prueba, he encontrado una pequeña guía en las publicaciones antiguas de Usenet que publicaré como respuesta, pero son solo sugerencias de una persona sin mucha justificación: no he encontrado nada que parezca una respuesta sólida.

En cuanto a la precisión, Wikipedia dice que el error debería ser O (e log N), pero ¿qué es una expectativa razonable en términos absolutos?

Editar para agregar: Las pruebas reales están en una forma en la que he almacenado matrices de datos de entrada y datos de salida de "referencia" precalculados para comparar, por lo que no necesariamente necesito algo con una solución de forma cerrada.

Brooks Moses
fuente

Respuestas:

12

Si desea verificar la corrección de un algoritmo FFT , en el sentido de que realiza la función deseada que tiene las propiedades conocidas de la transformada discreta de Fourier , puede utilizar el enfoque propuesto en:

Ergün, Funda. (1995, junio). Prueba de funciones lineales multivariadas: Superar el cuello de botella del generador. En proc. Vigésimo Séptimo Ann. ACM Symp. Teoría de la computación . (pág. 407–416).

Los fabricantes de FFTW hacen referencia al documento anterior como su método de elección para verificar que una implementación particular de FFT hace lo que debería. La técnica propuesta destila la función en tres componentes principales que se verifican con pruebas separadas:

  • Linealidad: el DFT (junto con sus otras primas transformadas en la familia de Fourier) es un operador lineal , por lo que para todos los valores de , debe cumplir la siguiente ecuación:un1,un2,X1[norte],X2[norte]

FFT(un1X1[norte]+un2X2[norte])=un1FFT(X1[norte])+un2FFT(X2[norte])
  • DFT del impulso de la unidad: una señal de dominio de tiempo igual a la función delta de Kronecker se aplica a la entrada del algoritmo FFT y la salida se compara con el DFT conocido de la función de impulso de la unidad (se transforma en un valor constante en toda la salida contenedores). Si el algoritmo FFT proporciona un IFFT, se puede probar a la inversa para mostrar que produce la función de impulso de la unidad nuevamente.

  • Cambio de tiempo: se aplican dos conjuntos de datos a la entrada del algoritmo FFT; La única diferencia entre los dos en el dominio del tiempo es un cambio de tiempo constante. Basado en las propiedades conocidas de la DFT, esto debería efectuar un cambio de fase lineal conocido entre las representaciones del dominio de frecuencia de las dos señales, donde la pendiente del cambio de fase es proporcional al cambio de tiempo.

Los autores del artículo afirman que estas pruebas son suficientes para validar la exactitud de una implementación de FFT. No he usado esta técnica en el pasado, pero parece tener sentido, y confiaría en los autores de FFTW (que han producido una gran pieza de software libre) como autoridades creíbles en buenos enfoques para el problema de validación.

Jason R
fuente
¡Gracias! ¿Los autores tienen alguna sugerencia para los valores de a1, a2, x1 [n] y x2 [n] para usar en la prueba de linealidad (o afirman que esto en gran medida no importa)? Y, para el caso, ¿para los conjuntos de datos que se usarán para la prueba de cambio de tiempo?
Brooks Moses el
3
Después de leer el documento, puedo responder mi propia pregunta: los autores no describen cómo se realiza la prueba de linealidad, sino que suponen que se ha hecho lo suficiente para demostrar que es cierto para "la mayoría de las entradas". Además, este documento describe una prueba de exactitud exacta suponiendo una aritmética exacta; no está describiendo un medio para caracterizar el error numérico en un programa aproximado (como necesariamente resulta del uso de la aritmética de precisión finita).
Brooks Moses el
Continuaré y marcaré esto como aceptado, porque sin duda es la mejor respuesta hasta ahora, pero todavía estoy muy interesado en otras respuestas que cubran qué conjuntos de datos de entrada de prueba usar (y por qué), o detalles de la precisión esperada . ¡Gracias!
Brooks Moses
2
Realmente hay dos componentes para su pregunta sobre la validación de un algoritmo FFT: validar su corrección y medir su precisión numérica. Mi respuesta solo se dirigió a la primera. Es difícil hacer declaraciones sobre la precisión numérica que se espera, porque depende inherentemente de la implementación. El tipo de aritmética (por ejemplo, punto fijo versus punto flotante), la estructura utilizada para implementar el algoritmo, la longitud de FFT (es decir, el número de etapas utilizadas para descomponer el problema), cualquier atajo tomado para mejorar la velocidad de ejecución, etc. factor y son difíciles de generalizar.
Jason R
Buen punto; Probablemente debería haberlo hecho como preguntas separadas.
Brooks Moses el
5

Como se menciona en la pregunta, encontré un conjunto de sugerencias en las publicaciones archivadas de Usenet comp.dsp ( http://www.dsprelated.com/showmessage/71595/1.php , publicado por "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, ....

El hilo también sugiere hacer dos senos, uno con una gran amplitud y otro con una pequeña amplitud.

Como digo en la pregunta principal, no estoy seguro de si este es un conjunto de respuestas particularmente bueno, o si es muy completo, pero lo estoy poniendo aquí para que la gente pueda votar y comentarlo.

Brooks Moses
fuente
1
¿Qué revelaría "1. Datos aleatorios de entrada"?
Dilip Sarwate
1
@DilipSarwate: Fuzz-testing puede ser útil para revelar bloqueos. Y, dependiendo del tipo de entrada de ruido (por ejemplo, ruido rosa o ruido blanco), podría ser útil para verificar que la distribución de energía general sea la esperada.
smokris
2
@Dilip: mi "prueba de humo" de fft es ese ifft (fft (random_stuff)) ~ = random_stuff.
hotpaw2
norteCnorte(0 0,1)99%norte Cnorte(0 0,1) muestras aleatorias?
Dilip Sarwate
2
@Dilip: Soy un tipo de hardware. Quería algo que pudiera alternar un alto porcentaje de todos los bits en todos los multiplicadores y CSA.
hotpaw2