Eu tenho um resultado FFT. Eles são armazenados em duas double
matrizes: uma matriz de peças real e uma matriz de peças imaginárias. Como determino as frequências que correspondem a cada elemento nessas matrizes?
Em outras palavras, eu gostaria de criar uma matriz que armazene as frequências para cada componente real e imaginário da minha FFT.
c#
signal-processing
fft
Rango
fonte
fonte
Respostas:
O primeiro compartimento na FFT é CC (0 Hz), o segundo compartimento é
Fs / N
, ondeFs
está a taxa de amostragem eN
o tamanho da FFT. O próximo compartimento é2 * Fs / N
. Para expressar isso em termos gerais, o enésimo bin én * Fs / N
.Portanto, se sua taxa de amostragem
Fs
é de 44,1 kHz e seu tamanho de FFTN
é 1024, os compartimentos de saída de FFT estão em:Observe que, para um sinal de entrada real (partes imaginárias são zero), a segunda metade da FFT (posições de
N / 2 + 1
aN - 1
) não contém informações adicionais úteis (elas possuem simetria conjugada complexa com as primeirasN / 2 - 1
posições). O último compartimento útil (para aplicações práticas) está emN / 2 - 1
, o que corresponde a 22006,9 Hz no exemplo acima. O compartimento atN / 2
representa energia na frequência Nyquist, ou sejaFs / 2
(= 22050 Hz neste exemplo), mas isso geralmente não é de uso prático, pois os filtros anti-aliasing normalmente atenuam quaisquer sinais acima e abaixoFs / 2
.fonte
Dê uma olhada na minha resposta aqui .
Resposta para comentar:
Na verdade, a FFT calcula a correlação cruzada do sinal de entrada com as funções seno e cosseno (funções básicas) em uma faixa de frequências igualmente espaçadas. Para uma determinada saída FFT, existe uma frequência correspondente (F), conforme a resposta que eu publiquei. A parte real da amostra de saída é a correlação cruzada do sinal de entrada
cos(2*pi*F*t)
e a parte imaginária é a correlação cruzada do sinal de entrada comsin(2*pi*F*t)
. A razão pela qual o sinal de entrada está correlacionadosin
ecos
funciona é considerar as diferenças de fase entre o sinal de entrada e as funções básicas.Tomando a magnitude da saída FFT complexa, você obtém uma medida de quão bem o sinal de entrada se correlaciona com os sinusóides em um conjunto de frequências, independentemente da fase do sinal de entrada. Se você está apenas analisando o conteúdo de frequência de um sinal, quase sempre terá a magnitude ou magnitude ao quadrado da saída complexa da FFT.
fonte
Eu usei o seguinte:
As entradas são:
i
: Bin para acessarsamples
: Taxa de amostragem em Hertz (ou seja, 8000 Hz, 44100Hz, etc.)nFFT
: Tamanho do vetor FFTfonte
samples
ounFFT
. Então, por favor, torne-o mais explicativo.i * samples / nFFT
. Por que o extra está2
aí? Estou esquecendo de algo?Os coeficientes de saída da FFT (para entrada complexa de tamanho N) são de 0 a N-1 agrupados como frequência [LOW, MID, HI, HI, MID, LOW].
Eu consideraria que o elemento em k tem a mesma frequência que o elemento em Nk, pois para dados reais, FFT [Nk] = conjugado complexo de FFT [k].
A ordem de varredura da frequência BAIXA para ALTA é
Existem [N / 2] +1 grupos de frequência do índice i = 0 a [N / 2], cada um com o
frequency = i * SamplingFrequency / N
Portanto, a frequência no compartimento FFT [k] é:
fonte
Seu k th frequência do resultado FFT é 2 * pi * k / N.
fonte