Como obter as frequências de cada valor em um FFT?
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.
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
.
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.
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
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
A frequência do resultado do FFT é 2*pi * K / N.