Quais dados devo usar para testar uma implementação da FFT e qual precisão devo esperar?

14

Estou envolvido em um esforço para implementar um algoritmo FFT e estou curioso para saber qual é o conselho recomendado para os dados de teste de entrada - e por quê! - e que precisão esperar.

Nas entradas de teste, encontrei algumas orientações nas postagens antigas da Usenet que postarei como resposta, mas são apenas as sugestões de uma pessoa sem muita justificativa - não encontrei nada que pareça uma resposta sólida.

Quanto à precisão, a Wikipedia diz que o erro deve ser O (e log N), mas o que é uma expectativa razoável em termos absolutos?

Editar para adicionar: os testes reais estão em um formulário no qual armazenei matrizes de dados de entrada e dados de saída de "referência" pré-calculados para comparação, portanto, não preciso necessariamente de algo com uma solução de formulário fechado.

Brooks Moses
fonte

Respostas:

12

Se você deseja verificar a correção de um algoritmo FFT , no sentido de que ele executa a função desejada que possui as propriedades conhecidas da transformada de Fourier discreta , é possível usar a abordagem proposta em:

Ergün, Funda. (Junho de 1995). Testando funções lineares multivariadas: Superando o gargalo do gerador. Em Proc. Vigésima Sétima Ann. ACM Symp. Teoria da Computação . (p. 407-416).

O documento acima é mencionado pelos fabricantes de FFTW como método de escolha para verificar se uma determinada implementação de FFT faz o que deveria. A técnica proposta destila a função em três componentes principais que são verificados com testes separados:

  • Linearidade: O DFT (juntamente com as suas outras transformações primo na família de Fourier) é um operador linear , de modo que para todos os valores de , a seguinte equação deve conter:a1,a2,x1[n],x2[n]

FFT(a1x1[n]+a2x2[n])=a1FFT(x1[n])+a2FFT(x2[n])
  • DFT do impulso unitário: Um sinal no domínio do tempo igual à função delta Kronecker é aplicado à entrada do algoritmo FFT e a saída é comparada com o DFT conhecido da função de impulso unitário (ele se transforma em um valor constante em todas as saídas). caixas). Se o algoritmo FFT fornecer um IFFT, ele poderá ser testado ao contrário para mostrar que ele gera novamente a função de impulso unitário.

  • Time shift: dois conjuntos de dados são aplicados à entrada do algoritmo FFT; a única diferença entre os dois no domínio do tempo é uma mudança de tempo constante. Com base nas propriedades conhecidas da DFT, isso deve afetar uma mudança de fase linear conhecida entre as representações do domínio de frequência dos dois sinais, em que a inclinação da mudança de fase é proporcional à mudança de tempo.

Os autores do artigo afirmam que esses testes são suficientes para validar a correção de uma implementação da FFT. Eu não usei essa técnica no passado, mas parece fazer sentido, e confiaria nos autores da FFTW (que produziram um ótimo software livre) como autoridades credíveis em boas abordagens para o problema de validação.

Jason R
fonte
Obrigado! Os autores têm alguma sugestão para os valores de a1, a2, x1 [n] e x2 [n] para usar no teste de linearidade (ou eles afirmam que isso não importa muito)? E, nesse caso, para os conjuntos de dados a serem usados ​​no teste de mudança de horário?
Brooks Moses
3
Depois de ler o artigo, posso responder minha própria pergunta: Os autores não descrevem como se realiza o teste de linearidade, mas assumem que o fizeram o suficiente para provar que isso é verdade para "a maioria das entradas". Além disso, este artigo está descrevendo uma prova de exatidão exata, assumindo aritmética exata; não está descrevendo um meio para caracterizar o erro numérico em um programa aproximado (como necessariamente resulta do uso de aritmética de precisão finita).
Brooks Moses
Vou seguir em frente e marcar isso como aceito, porque é certamente a melhor resposta até agora - mas ainda estou muito interessado em outras respostas que abrangem quais conjuntos de dados de entrada de teste usar (e por que) ou detalhes da precisão esperada . Obrigado!
Brooks Moses
2
Na verdade, existem dois componentes para sua pergunta sobre a validação de um algoritmo FFT: validar sua correção e medir sua precisão numérica. Minha resposta abordou apenas a primeira. É difícil fazer declarações sobre qual precisão numérica esperar, porque é inerentemente dependente da implementação. O tipo de aritmética (por exemplo, ponto fixo versus ponto flutuante), a estrutura usada para implementar o algoritmo, o comprimento da FFT (ou seja, o número de estágios usados ​​para decompor o problema), todos os atalhos utilizados para melhorar a velocidade de execução etc. fator e são difíceis de generalizar.
Jason R
Bom ponto; Eu provavelmente deveria ter feito essas perguntas separadamente.
Brooks Moses
5

Como mencionado na pergunta, encontrei um conjunto de sugestões nas postagens arquivadas da Usenet comp.dsp ( http://www.dsprelated.com/showmessage/71595/1.php , postada 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, ....

A discussão também sugere fazer dois senos, um com uma grande amplitude e outro com uma pequena amplitude.

Como eu disse na pergunta principal, não tenho certeza se esse é um conjunto particularmente bom de respostas ou se é muito completo, mas estou colocando aqui para que as pessoas possam votar e comentar.

Brooks Moses
fonte
1
O que "1. Insira dados aleatórios" revelaria?
Dilip Sarwate
1
@DilipSarwate: o teste de fuzz pode ser útil para revelar falhas. E, dependendo do tipo de entrada de ruído (por exemplo, ruído rosa ou ruído branco), pode ser útil para verificar se a distribuição geral de energia é a esperada.
22411 smokris
2
@ Dilip - Meu fft "teste de fumaça" é esse ifft (fft (random_stuff)) ~ = random_stuff.
hotpaw2
NCN(0,1)99%N CN(0,1)
2
@Dilip: Eu sou um cara de hardware. Eu queria algo que alternasse uma alta porcentagem de todos os bits em todos os multiplicadores e CSAs.
hotpaw2