Como obter as frequências de cada valor em um FFT?

Tenho um resultado FFT. Estes são armazenados em duas matrizes double: uma matriz de partes reais e uma matriz de partes imaginária. Como determino as frequências que correspondem a cada elemento nestas matrizes?

Por outras palavras, gostaria de criar uma matriz que armazenasse as frequências para cada componente real e imaginário do meu FFT.

Author: Peter Mortensen, 2010-12-06

5 answers

O primeiro bin no FFT é DC (0 Hz), o segundo bin é Fs / N, em que Fs é a taxa da amostra e N é o tamanho do FFT. O próximo caixote é 2 * Fs / N. Para expressar isso em termos gerais, onth bin é n * Fs / N.

Então se a sua taxa de amostragem, {[2] } é de 44,1 kHz e o seu tamanho FFT, N é de 1024, então as latas de saída FFT são de:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

Note que para um sinal de entrada real (partes imaginárias todas nulas) a segunda metade do FFT (contentores de N / 2 + 1 a N - 1) não contém informações adicionais úteis (têm simetria conjugada complexa com as primeiras caixas N / 2 - 1). A última barra útil (para aplicações práticas) é a N / 2 - 1, que corresponde a 22006.9 Hz no exemplo acima. O bin em N / 2 representa a energia na frequência Nyquist, ou seja Fs / 2 (=22050 Hz neste exemplo), mas isto em geral não é de qualquer uso prático, uma vez que os filtros anti-aliasing tipicamente atenuam quaisquer sinais a Fs / 2.

 364
Author: Paul R, 2012-08-20 05:28:25
Olha para a minha resposta.

Resposta ao comentário:

O FFT calcula efectivamente a correlação cruzada do sinal de entrada com funções seno e cosseno (funções de base) numa gama de frequências igualmente espaçadas. Para uma dada saída de FFT, há uma frequência correspondente (F) dada pela resposta que eu postei. A parte real da amostra de saída é a correlação cruzada do sinal de entrada com cos(2*pi*F*t) e a parte imaginária é a correlação cruzada do sinal de entrada com sin(2*pi*F*t). A razão pela qual o sinal de entrada está correlacionado com as funções sin e cos é ter em conta as diferenças de fase entre o sinal de entrada e as funções de base.

Tomando a magnitude da saída de FFT complexa, obtém-se uma medida de como o sinal de entrada se correlaciona com os sinusóides num conjunto de frequências, independentemente da fase de sinal de entrada. Se você está apenas analisando o conteúdo de frequência de um sinal, você vai quase sempre tomar o magnitude ou magnitude ao quadrado da saída complexa do FFT.

 55
Author: Jason B, 2017-05-23 12:03:03

Usei o seguinte:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

As entradas são:

  • i: Bin to access
  • samples: taxa de Amostragem em Hertz (ou seja, 8000 Hz, 44100Hz, etc.)
  • nFFT: Tamanho do vector FFT
 18
Author: roberto, 2015-01-30 21:28:38

Os coeficientes de saída de FFT (para a entrada complexa de tamanho N) são de 0 a N - 1 agrupados como [baixa,média,HI,HI,média,baixa] frequência.

Eu consideraria que o elemento em k tem a mesma frequência que o elemento em N-k uma vez que para os dados reais, FFT[n-k] = conjugado complexo de FFT[k].

A ordem de digitalização de baixa a alta frequência é

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

Existem [n/2]+1 Grupos de frequência do índice i = 0 a [n / 2], cada um com as seguintes frequências:frequency = i * SamplingFrequency / N

Então a frequência no caixote do lixo FFT[k] é:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
 13
Author: robert.b, 2017-01-15 20:51:34

A frequência do resultado do FFT é 2*pi * K / N.

 6
Author: Neo, 2016-07-31 23:19:01