Preciso de ajuda para entender a saída do cálculo DFT / FFT.
Sou um engenheiro de software experiente e preciso interpretar algumas leituras do acelerômetro de smartphones, como encontrar as frequências principais. Infelizmente, dormi durante a maior parte das minhas aulas de EE na faculdade há quinze anos, mas tenho lido sobre DFT e FFT nos últimos dias (sem sucesso, aparentemente).
Por favor, nenhuma resposta de "vá fazer uma aula de EE". Na verdade, estou planejando fazer isso se meu empregador me pagar. :)
Então aqui está meu problema:
Capturei um sinal em 32 Hz. Aqui está uma amostra de 1 segundo de 32 pontos, que tracei no Excel.
Então, obtive algum código FFT escrito em Java da Columbia University (depois de seguir as sugestões em um post sobre " FFT confiável e rápida em Java ").
A saída deste programa é a seguinte. Acredito que ele esteja executando um FFT local, portanto, ele reutiliza o mesmo buffer para entrada e saída.
Before:
Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ]
Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]
After:
Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ]
Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ]
Portanto, neste ponto, não posso fazer cara ou coroa com a saída. Eu entendo os conceitos DFT, como a parte real sendo as amplitudes das ondas cossenos componentes e a parte imaginária sendo as amplitudes das ondas senoidais componentes. Também posso acompanhar este diagrama do grande livro " O Guia do Cientista e do Engenheiro para Processamento de Sinal Digital ":
Então, minhas perguntas específicas são:
A partir da saída do FFT, como encontro as "frequências mais ocorrentes"? Isso faz parte da minha análise dos dados do meu acelerômetro. Devo ler as matrizes reais (cosseno) ou imaginárias (seno)?
Eu tenho uma entrada de 32 pontos no domínio do tempo. A saída do FFT não deveria ser uma matriz de 16 elementos para reais e uma matriz de 16 elementos para o imaginário? Por que o programa fornece saídas de array reais e imaginárias de tamanho 32?
Em relação à pergunta anterior, como analiso os índices nas matrizes de saída? Dada minha entrada de 32 amostras amostradas em 32 Hz, meu entendimento é que uma saída de matriz de 16 elementos deve ter seu índice uniformemente espalhado até 1/2 da taxa de amostragem (de 32 Hz), então estou correto em entender que cada elemento da matriz representa (32 Hz * 1/2) / 16 = 1 Hz?
Por que a saída FFT tem valores negativos? Achei que os valores representam as amplitudes de uma sinusóide. Por exemplo, a saída de Real [3] = -1,075 deve significar uma amplitude de -1,075 para uma onda cosseno de frequência 3. Está certo? Como pode uma amplitude ser negativa?
fonte
Respostas:
Você não deve procurar a parte real ou imaginativa de um número complexo (qual é o seu array real e imaginário). Em vez disso, você deseja procurar a magnitude da frequência que é definida como sqrt (real * real + imag * imag). Esse número sempre será positivo. Agora tudo o que você precisa pesquisar é o valor máximo (ignore a primeira entrada em sua matriz. Esse é o seu deslocamento DC e não contém informações dependentes de frequência).
Você obtém 32 saídas reais e 32 imaginárias porque está usando um FFT complexo a complexo. Lembre-se de que você converteu suas 32 amostras em 64 valores (ou 32 valores complexos) estendendo-as com zero partes imaginárias. Isso resulta em uma saída FFT simétrica em que o resultado da frequência ocorre duas vezes. Quando estiver pronto para usar nas saídas 0 a N / 2, e uma vez espelhado nas saídas N / 2 a N. No seu caso, é mais fácil simplesmente ignorar as saídas N / 2 a N. Você não precisa delas, elas são apenas um artefato sobre como você calcula sua FFT.
A frequência para a equação fft-bin é (bin_id * freq / 2) / (N / 2) onde freq é a sua frequência de amostra (também conhecida como 32 Hz e N é o tamanho do seu FFT). No seu caso, isso simplifica para 1 Hz por compartimento. Os bins N / 2 a N representam frequências negativas (conceito estranho, eu sei). Para o seu caso, eles não contêm nenhuma informação significativa porque são apenas um espelho das primeiras N / 2 frequências.
Suas partes reais e imaginárias de cada caixa formam um número complexo. Tudo bem se as partes reais e imaginárias forem negativas, enquanto a magnitude da frequência em si for positiva (veja minha resposta à pergunta 1). Eu sugiro que você leia sobre números complexos. Explicar como eles funcionam (e por que são úteis) excede o que é possível explicar em uma única questão de overflow de pilha.
Nota: Você também pode querer ler o que é autocorrelação e como ela é usada para encontrar a frequência fundamental de um sinal. Tenho a sensação de que é isso que você realmente deseja.
fonte
Você já tem algumas boas respostas, mas vou apenas acrescentar que você realmente precisa aplicar uma função de janela aos dados do domínio do tempo antes do FFT, caso contrário, você obterá artefatos desagradáveis em seu espectro, devido ao vazamento espectral .
fonte
1) Procure os índices no array real com os valores mais altos, além do primeiro (que é o componente DC). Você provavelmente precisará de uma taxa de amostragem consideravelmente maior do que 32 Hz e de um tamanho de janela maior para obter resultados significativos.
2) A segunda metade de ambas as matrizes é o espelho da primeira metade. Por exemplo, observe que o último elemento da matriz real (1.774) é igual ao segundo elemento (1.774) e o último elemento da matriz imaginária (1.474) é o negativo do segundo elemento.
3) A frequência máxima que você pode obter a uma taxa de amostragem de 32 Hz é 16 Hz ( limite de Nyquist ), então cada etapa é de 2 Hz. Conforme observado anteriormente, lembre-se de que o primeiro elemento é 0 Hz (ou seja, o deslocamento CC).
4) Claro, uma amplitude negativa faz todo o sentido. Significa apenas que o sinal está "invertido" - um FFT padrão é baseado em um cosseno, que normalmente tem valor = 1 em t = 0, então um sinal que tinha valor = -1 no tempo = 0 teria uma amplitude negativa .
fonte
Observe que a "frequência de maior ocorrência" pode ser espalhada em vários compartimentos FFT, mesmo com uma função de janela. Portanto, você pode ter que usar uma janela mais longa, várias janelas ou interpolação para estimar melhor a frequência de quaisquer picos espectrais.
fonte