Como calcular eficientemente apenas os baixos coeficientes de uma FFT com preenchimento zero

14

Eu tenho um algoritmo que zere uma sequência para 4N, faça uma FFT e use apenas a menor frequência N pontos fora do 4N gerado.

Parece muito trabalho desperdiçado, alguma idéia de como isso pode ser feito mais rapidamente?

Mark Borgerding
fonte
@Dilip. Vou usar as bibliotecas FFTW ou IMKL. Eu poderia, claro, usar a minha biblioteca kissfft, mas está começando em desvantagem velocidade vs os outros
Mark Borgerding
2
Excluí o comentário ao qual você respondeu, pois pretendia dizer dizimação com frequência, mas escrevi dizimação no tempo. Mas veja o diagrama da borboleta aqui. Se você escrever algum código para os dois primeiros estágios do -FFT para levar em conta o grande número de zeros e pular as multiplicações correspondentes, poderá chamar a sub-rotina da biblioteca FFT 4 vezes para N -FFTs nos quais os vetores de entrada está cheio". Obviamente, você precisa apenas de N / 4 das saídas de cada chamada de sub-rotina. 4N4NN/4
precisa saber é o seguinte

Respostas:

2

Se você tiver apenas alguns compartimentos, o seguinte poderá ser muito eficiente para você:
1. Simplesmente faça o DFT em cada frequência necessária.
2. Use o algoritmo Goertzel para cada frequência em questão.

Jacob
fonte
Mark disse que precisava de caixas de 4 N , então 1) parece não ser uma opção razoável. O algoritmo de Goertzel possui vantagens como computação on-line à medida que os dados são recebidos, armazenamento pequeno etc., mas precisa de 2 N + 4 multiplicações por compartimento, enquanto cada compartimento computado como uma avaliação polinomial via regra de Horner precisa apenas de N multiplicações. Assim, 2) também não parece ser uma opção particularmente razoável. N4N2N+4N
precisa
Você está certo, ao ler a pergunta, de alguma forma perdi os detalhes. Enquanto respondia, pensei: "Nossa, seria bom saber quantas caixas ele quer ..." Acho que devo reler a pergunta antes de responder.
Jacob
2

O preenchimento zero até o comprimento 4X, computando a FFT mais longa e, em seguida, usando apenas os compartimentos 1/4 inferiores produz resultados quase idênticos à interpolação Sinc com janela da FFT de comprimento original.

Portanto, basta usar o comprimento FFT original e interpolar usando um núcleo de interpolação Sinc trifásico com uma largura de janela adequada.

hotpaw2
fonte
0

O preenchimento zero no domínio do tempo fornece uma solução de frequência mais alta, mas nenhuma informação nova; portanto, fornece essencialmente interpolação no domínio da frequência. Dependendo da natureza dos seus sinais e da precisão necessária, você poderá obter os pontos de frequência adicionais com uma FFT regular de N pontos e fazer uma interpolação adequada (linear, spline, pchip, sinc etc.).

Hilmar
fonte
x(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)NNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N)N
β4=αx(β4k)x(β4k)=x(αk)
Suspeito que seria difícil fazer uma interpolação decente mais rápido do que fazer a FFT maior.
precisa
Digamos que você tenha uma taxa de amostragem de 128 pontos FFT e 12800Hz. Um FFT de 128 pontos fornece valores em 0Hz, 100Hz, 200Hz, 300Hz, etc. O que o preenchimento zero faz é aumentar a resolução da frequência para 0Hz, 25Hz, 50Hz, 100Hz etc. Isso pode ser visto como um problema de interpolação. Para mim, matematicamente preciso, você precisa fazer uma intperpolação sinc circular de 128ª ordem. Isso certamente não vale o incômodo, mas dependendo da aplicação e precisão necessária uma muito interpolação ordem inferior seria bom o suficiente
Hilmar