Pergunta

Tentando entender uma rotina FFT (Fast Fourier Transform) Eu estou usando (roubar) (reciclagem)

de entrada é uma matriz de 512 pontos de dados que são uma forma de onda da amostra. Os dados de teste são gerados para esta matriz. fft transforma essa matriz em domínio de frequência. Tentando compreender relação entre freq, período, a taxa de amostragem e a posição na matriz de FFT. Vou ilustrar com exemplos:

========================================

Taxa de amostragem é de 1000 amostras / s. Gerar um conjunto de amostras a 10 Hz.

matriz de entrada tem valores de pico no arr (28), arr (128), arr (228) ... período = 100 pontos de amostragem

valor de pico na gama FFT está no índice 6 (excluindo um enorme valor em 0)

========================================

Taxa de amostragem é de 8000 amostras / s Gerar um conjunto de amostras a 440Hz

os valores de pico da matriz de entrada incluem arr (7), arr (25), arr (43), arr (61) ... período = 18 pontos de amostragem

valor de pico na gama FFT é no índice 29 (excluindo um enorme valor em 0)

========================================

Como faço para relacionar o índice do pico na matriz FFT para frequência?

Foi útil?

Solução

Se você ignorar a parte imaginária, a distribuição de frequência é linear em caixas:

Frequency @ i = (taxa de amostragem / 2) x (i / Nbins).

Assim, para o seu primeiro exemplo, assumming você tivesse 256 caixas, as maiores corresponde o bin para uma frequência de 1000/2 * 6/256 = 11,7 Hz. Desde sua entrada foi 10 Hz, eu acho que Bin 5 (9,7 Hz) também teve um grande componente. Para obter melhor precisão, você precisa tomar mais amostras, para obter caixas menores.

O segundo exemplo dá 8000/2 * 29/256 = 453Hz. Mais uma vez, perto, mas você precisa de mais bandejas. Sua resolução aqui é apenas 4000/256 = 15,6 Hz.

Outras dicas

Seria útil se você fosse para fornecer o conjunto de dados de amostra.

Meu palpite seria que você tem o que são chamados de artefatos de amostragem. O sinal forte em DC (frequência 0) sugere que este é o caso.

Você deve sempre garantir que o valor médio em seus dados de entrada é zero -. Encontrar a média e subtrai-lo a partir de cada ponto de amostra antes de invocar a FFT é uma boa prática

Na mesma linha, você tem que ser cuidadoso sobre o artefato janela de amostragem. É importante que o primeiro e último ponto de dados estão perto de zero, porque caso contrário o "passo" de fora para dentro da janela de amostragem tem o efeito de injetar um monte de energia em freqüências diferentes.

A linha inferior é que fazer uma análise FFT requer mais cuidado do que simplesmente a reciclagem de uma rotina fft encontrado em algum lugar.

Aqui estão os primeiros 100 pontos de amostragem de um sinal de 10 Hz, conforme descrito na pergunta, massageado para evitar amostragem artefatos

> sinx[1:100]
  [1]  0.000000e+00  6.279052e-02  1.253332e-01  1.873813e-01  2.486899e-01  3.090170e-01  3.681246e-01  4.257793e-01  4.817537e-01  5.358268e-01
 [11]  5.877853e-01  6.374240e-01  6.845471e-01  7.289686e-01  7.705132e-01  8.090170e-01  8.443279e-01  8.763067e-01  9.048271e-01  9.297765e-01
 [21]  9.510565e-01  9.685832e-01  9.822873e-01  9.921147e-01  9.980267e-01  1.000000e+00  9.980267e-01  9.921147e-01  9.822873e-01  9.685832e-01
 [31]  9.510565e-01  9.297765e-01  9.048271e-01  8.763067e-01  8.443279e-01  8.090170e-01  7.705132e-01  7.289686e-01  6.845471e-01  6.374240e-01
 [41]  5.877853e-01  5.358268e-01  4.817537e-01  4.257793e-01  3.681246e-01  3.090170e-01  2.486899e-01  1.873813e-01  1.253332e-01  6.279052e-02
 [51] -2.542075e-15 -6.279052e-02 -1.253332e-01 -1.873813e-01 -2.486899e-01 -3.090170e-01 -3.681246e-01 -4.257793e-01 -4.817537e-01 -5.358268e-01
 [61] -5.877853e-01 -6.374240e-01 -6.845471e-01 -7.289686e-01 -7.705132e-01 -8.090170e-01 -8.443279e-01 -8.763067e-01 -9.048271e-01 -9.297765e-01
 [71] -9.510565e-01 -9.685832e-01 -9.822873e-01 -9.921147e-01 -9.980267e-01 -1.000000e+00 -9.980267e-01 -9.921147e-01 -9.822873e-01 -9.685832e-01
 [81] -9.510565e-01 -9.297765e-01 -9.048271e-01 -8.763067e-01 -8.443279e-01 -8.090170e-01 -7.705132e-01 -7.289686e-01 -6.845471e-01 -6.374240e-01
 [91] -5.877853e-01 -5.358268e-01 -4.817537e-01 -4.257793e-01 -3.681246e-01 -3.090170e-01 -2.486899e-01 -1.873813e-01 -1.253332e-01 -6.279052e-02

E aqui está os valores absolutos resultantes do domínio da freqüência FFT

 [1] 7.160038e-13 1.008741e-01 2.080408e-01 3.291725e-01 4.753899e-01 6.653660e-01 9.352601e-01 1.368212e+00 2.211653e+00 4.691243e+00 5.001674e+02
[12] 5.293086e+00 2.742218e+00 1.891330e+00 1.462830e+00 1.203175e+00 1.028079e+00 9.014559e-01 8.052577e-01 7.294489e-01

Eu sou um pouco enferrujado demais sobre o processamento de matemática e sinal, mas com a informação adicional que pode dar-lhe um tiro.

Se você quer saber a energia do sinal por bin você precisa da magnitude da saída do complexo. Então, basta olhar para o produto real não é suficiente. Mesmo quando a entrada é apenas números reais. Para cada bin a magnitude da saída é sqrt (real ^ 2 + imag ^ 2), assim como Pitágoras: -)

escaninhos 0-449 são frequências positivas a partir de 0 Hz a 500 Hz. caixas de 500 a 1000 são frequências negativas e deve ser o mesmo que o positivo para um sinal real. Se você processar um buffer cada segundo freqüências e os índices de matriz alinhar bem. Assim, o pico no índice 6 corresponde com 6 Hz de modo que é um pouco estranho. Isso pode ser porque você está olhando apenas para os dados de saída real e os dados reais e imaginárias se combinam para dar um pico esperado no índice 10. As frequências deverão mapear linearmente para os caixotes do lixo.

Os picos a 0 indica um DC offset.

Tem sido algum tempo desde que eu fiz FFT de mas aqui é o que eu me lembro

FFT geralmente leva números complexos como entrada e saída. Então, eu realmente não estou certo de como a parte real e imaginária do mapa entrada e saída para as matrizes.

Eu realmente não entendo o que você está fazendo. No primeiro exemplo, você diz que processar buffers de amostra em 10 Hz para uma taxa de amostragem de 1000 Hz? Portanto, você deve ter 10 buffers por segundo com 100 amostras cada. Eu não entendo como sua matriz de entrada pode ser pelo menos 228 amostras por muito tempo.

Normalmente, a primeira metade do tampão de saída são bins de frequcia de 0 a frequência (= desvio de CC) para 1/2 de taxa de amostragem. ea 2ª metade são frequências negativas. se a sua entrada é apenas dados reais com 0 para o positivo sinal imaginário e frequências negativas são os mesmos. A relação de sinal real / imaginário sobre a saída contém informação de fase do seu sinal de entrada.

A frequência para bin i é i * (samplerate / n), onde n é o número de amostras na janela de entrada da FFT.

Se você está lidando com áudio, uma vez que a altura é proporcional ao log de frequência, a resolução passo das escaninhos aumenta à medida que a frequência faz - é difícil de resolver sinais de baixa frequência com precisão. Para fazer isso você precisa usar janelas FFT maiores, o que reduz o tempo de resolução. Há uma troca de frequência contra a resolução de tempo para uma determinada taxa de amostragem.

Você menciona um bin com um grande valor para 0 - este é o bin com frequência 0, ou seja, o componente DC. Se este for grande, então, presumivelmente, seus valores são geralmente positivas. Bin n / 2 (no seu caso 256) é a frequência de Nyquist, a metade da taxa de amostragem, que é a mais alta frequência que pode ser resolvido no sinal amostrado a este ritmo.

Se o sinal é verdadeira, então caixas de n / 2 + 1 a n-1 irá conter os conjugados de complexos de recipientes n / 2-1 para 1, respectivamente. O valor DC só aparece uma vez.

As amostras são, como já foi dito, espaçadas igualmente no domínio da frequência (não logarítmica).

Por exemplo 1, você deve obter isto:

alt texto http://home.comcast.net/~kootsoop/images /SINE1.jpg

Por outro exemplo, você deve obter

alt texto http://home.comcast.net/~kootsoop/images /SINE2.jpg

Então suas respostas tanto parecem estar corretas sobre a localização de pico.

O que eu não estou recebendo é o grande componente DC. Tem certeza de que você está gerando uma onda senoidal como a entrada? A entrada ir negativo? Para uma onda senoidal, o DC deve ser próximo de zero desde que você obter ciclos suficientes.

Outra via é a de criar uma algoritmo de Goertzel de cada freqüência central nota que você está procurando .

Depois de conseguir uma implementação do algoritmo funcionando, você pode fazê-lo de tal forma que é preciso parâmetros para definir a sua frequência central. Com isso você pode facilmente executar 88 deles ou o que nunca você precisa em uma coleção e varredura para o valor de pico.

O algoritmo Goertzel é basicamente um único FFT bin. Usando este método, você pode colocar suas caixas logarítmica como notas musicais vão naturalmente.

Alguns pseudo-código da Wikipedia:

s_prev = 0
s_prev2 = 0
coeff = 2*cos(2*PI*normalized_frequency);
for each sample, x[n],
  s = x[n] + coeff*s_prev - s_prev2;
  s_prev2 = s_prev;
  s_prev = s;
end
power = s_prev2*s_prev2 + s_prev*s_prev - coeff*s_prev2*s_prev;

As duas variáveis ??que representam as duas amostras anteriores são mantidas para a próxima iteração. Isso pode então ser usado em um aplicativo de streaming. I acha que talvez o cálculo de potência deve ser dentro do loop também. (No entanto, não é descrito como tal no artigo Wiki.)

No caso de detecção de tom haveria 88 coeficientes diferentes, 88 pares de amostras anteriores e resultaria em 88 amostras de saída de potência que indica o nível relativo em que bin frequência.

WaveyDavey diz que ele está capturando o som de um microfone, através do hardware de áudio do seu computador, mas não que os seus resultados são zero-centrada. Isso soa como um problema com o hardware. Ele deve ser zero-centrada.

Quando o quarto é calmo, o fluxo de valores provenientes do som API deve ser muito próximo a 0 amplitude, com ligeira + - variações para o ruído ambiente. Se um som vibratória está presente no ambiente (por exemplo, um piano, uma taça, uma voz) o fluxo de dados deve mostrar uma onda sinusoidal fundamentalmente baseada que vai tanto positiva e negativa, e as médias próximas de zero. Se este não for o caso, o sistema tem algum funk acontecendo!

-Rick

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top