¿Cómo obtengo las frecuencias de cada valor en una FFT?

148

Tengo un resultado FFT. Estos se almacenan en dos doublematrices: una matriz de parte real y una matriz de parte imaginaria. ¿Cómo determino las frecuencias que corresponden a cada elemento en estas matrices?

En otras palabras, me gustaría crear una matriz que almacene las frecuencias para cada componente real e imaginario de mi FFT.

Rango
fuente
Lo hago en C # .net. ¿Me puedes ayudar?
Rango
9
Si no comprende la relevancia de las partes reales e imaginarias de una FFT, entonces no obtendrá ningún resultado significativo, por lo que debe buscar algunos tutoriales de FFT y procesamiento de señales para comprender cómo interpretar los resultados. Creo que es muy probable que sea lo que sea para lo que lo esté utilizando, desee la magnitud de la FFT o la densidad espectral de potencia.
the_mandrill
¡Gracias! Quiero obtener las frecuencias máximas de cada fotograma (la longitud del fotograma depende de la longitud de la ventana y la longitud del cambio)
Rango

Respuestas:

350

El primer contenedor en el FFT es DC (0 Hz), el segundo contenedor es Fs / N, donde Fsestá la frecuencia de muestreo y Nes el tamaño del FFT. El siguiente contenedor es 2 * Fs / N. Para expresar esto en términos generales, el enésimo bin es n * Fs / N.

Entonces, si su frecuencia de muestreo, Fses decir 44.1 kHz y su tamaño FFT, Nes 1024, entonces los contenedores de salida FFT están en:

  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

Tenga en cuenta que para una señal de entrada real (partes imaginarias todas cero), la segunda mitad de la FFT (contenedores desde N / 2 + 1hasta N - 1) no contiene información adicional útil (tienen una simetría conjugada compleja con los primeros N / 2 - 1contenedores). El último bin útil (para aplicaciones prácticas) está en N / 2 - 1, que corresponde a 22006.9 Hz en el ejemplo anterior. El bin en N / 2representa la energía en la frecuencia de Nyquist, es decir Fs / 2(= 22050 Hz en este ejemplo), pero en general no tiene ningún uso práctico, ya que los filtros anti-aliasing normalmente atenuarán cualquier señal en y por encima Fs / 2.

Paul R
fuente
8
Nota: la respuesta es ligeramente incorrecta: el 512º depósito contiene el nivel para 22050, el límite de nyquist. Los contenedores 0 a N / 2 inclusive contienen valores útiles.
David Van Brink
44
Gracias por la edición y aclaración ... Supongo que aquí es donde revelo cierta falta de practicidad. Yo: Pero maestro, ¡el trabajo de FFT hasta el nyquist! Tú: Padawan, realmente deberías filtrar eso.
David Van Brink
55
Desearía poder destacar las respuestas. ¡Esta respuesta es incluso mejor que la pregunta original!
Skylion
14
@PaulR: quería agradecerle esta maravillosa respuesta que me ha servido a lo largo de los años. Visitaría esta respuesta antes de tener una cuenta de StackOverflow, y en realidad olvidé agradecerte una vez que me registré. Hace poco eché un vistazo a las cosas de FFT y recordé tu respuesta y la visité ahora. Una vez que llegué aquí, recordé agradecerte ... ¡así que gracias! Cada vez que tengo un debate con alguien sobre la interpretación de cada punto en el eje horizontal de la FFT, simplemente lo señalo a este enlace.
rayryeng
66
@rayryeng: muchas gracias. ¡Creo que es el mejor reconocimiento que he tenido en ~ 5 años respondiendo preguntas aquí en SO!
Paul R
55

Mira mi respuesta aquí .

Respuesta para comentar:

La FFT en realidad calcula la correlación cruzada de la señal de entrada con funciones seno y coseno (funciones básicas) en un rango de frecuencias igualmente espaciadas. Para una salida FFT dada, hay una frecuencia correspondiente (F) dada por la respuesta que publiqué. La parte real de la muestra de salida es la correlación cruzada de la señal de entrada con cos(2*pi*F*t)y la parte imaginaria es la correlación cruzada de la señal de entrada con sin(2*pi*F*t). La razón por la cual la señal de entrada está correlacionada siny cosfunciona es para tener en cuenta las diferencias de fase entre la señal de entrada y las funciones básicas.

Al tomar la magnitud de la salida FFT compleja, obtiene una medida de qué tan bien se correlaciona la señal de entrada con las sinusoides en un conjunto de frecuencias, independientemente de la fase de la señal de entrada. Si solo está analizando el contenido de frecuencia de una señal, casi siempre tomará la magnitud o magnitud al cuadrado de la salida compleja de la FFT.

Jason B
fuente
¿La parte real e imaginaria son los resultados de FFT que se usaron? Por favor explícame. Gracias
Rango
55
Esta respuesta merece más amor.
estrella brillante
1
¿Podría ser que la magnitud de las salidas complejas tenga que duplicarse cada una? (si restrinjo mi interpretación a la mitad inferior)
Wolf
18

He usado lo siguiente:

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));
}

Las entradas son:

  • i: Bin para acceder
  • samples: Frecuencia de muestreo en hercios (es decir, 8000 Hz, 44100 Hz, etc.)
  • nFFT: Tamaño del vector FFT
roberto
fuente
77
La gente no puede saber exactamente lo que usted representa con sampleso nFFT. Así que por favor hazlo más explicativo.
mostar
14
La respuesta aceptada dice que esto debería ser i * samples / nFFT. ¿Por qué está el extra 2allí? ¿Me estoy perdiendo de algo?
yati sagade
13

Los coeficientes de salida FFT (para entradas complejas de tamaño N) son de 0 a N - 1 agrupados como frecuencia [LOW, MID, HI, HI, MID, LOW].

Consideraría que el elemento en k tiene la misma frecuencia que el elemento en Nk ya que para datos reales, FFT [Nk] = conjugado complejo de FFT [k].

El orden de escaneo de BAJA a ALTA frecuencia es

0,

 1,
 N-1,

 2,
 N-2

 ...

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

 [N/2]

Hay [N / 2] +1 grupos de frecuencia desde el índice i = 0 a [N / 2], cada uno con el frequency = i * SamplingFrequency / N

Entonces la frecuencia en el bin FFT [k] es:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
robert.b
fuente
5

La frecuencia de su k ésimo resultado FFT es 2 * pi * k / N.

Neo
fuente
66
Supongo que esto será en radianes
Barnaby