2010-12-06 20 views
127

Tengo un resultado FFT. Estos se almacenan en dos matrices double: una matriz de piezas real y una matriz de piezas imaginarias. ¿Cómo determino las frecuencias que corresponden a cada elemento en estas matrices?¿Cómo obtengo las frecuencias de cada valor en una FFT?

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

+0

lo hago en C# .NET. ¿Me puedes ayudar? – Rango

+7

Si no comprende la relevancia de las partes real e imaginaria 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 bastante probable que, sea lo que sea que lo estés usando, estés deseando la magnitud de la FFT o la densidad espectral de potencia. –

+0

¡Gracias! Quiero obtener las frecuencias pico de cada fotograma (la longitud del fotograma depende de la Longitud de la ventana y la Longitud del desplazamiento) – Rango

Respuesta

4

Su k th La frecuencia del resultado FFT es 2 * pi * k/N.

+4

Supongo que será en radianes – Barnaby

49

Eche un vistazo a mi respuesta here.

respuesta a comentario:

La FFT realmente calcula el cross-correlation de la señal de entrada con funciones de seno y coseno (funciones de base) en un rango de frecuencias igualmente espaciadas. Para una salida de FFT dada, hay una frecuencia correspondiente (F) como viene 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). El motivo por el que la señal de entrada se correlaciona con las funciones sin y cos es para tener en cuenta las diferencias de fase entre la señal de entrada y las funciones de base.

Al tomar la magnitud de la salida FFT compleja, se obtiene una medida de qué tan bien la señal de entrada se correlaciona con 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 la magnitud al cuadrado de la salida compleja de la FFT.

+0

¿La parte real e imaginaria es el resultado de FFT que se utiliza? Por favor explique por mi Gracias – Rango

+0

ver mi respuesta actualizada. –

+0

Gracias por su explicación. – Rango

285

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

Así que si su frecuencia de muestreo, Fs es decir 44,1 kHz y el tamaño de la FFT, N es 1024, entonces las bandejas de salida FFT se encuentran 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 

en cuenta que para una señal de entrada real (partes imaginarias todo cero) la segunda mitad de la FFT (contenedores de N/2 + 1 a N - 1) no contiene información adicional útil (tienen simetría compleja conjugada con los primeros contenedores N/2 - 1). El último contenedor útil (para aplicaciones prácticas) está en N/2 - 1, que corresponde a 22006,9 Hz en el ejemplo anterior. El contenedor en N/2 representa energía en la frecuencia de Nyquist, es decir Fs/2 (= 22050 Hz en este ejemplo), pero esto no es en general práctico, ya que los filtros anti-aliasing típicamente atenuarán cualquier señal a Fs/2 y superior.

+0

Gracias por ayudarme. Si quiero obtener la frecuencia máxima en el resultado de la salida (de partes reales e imaginarias), obtendré la frecuencia en el índice N/2 - 1 del resultado de la matriz? Porque la frecuencia es máxima en este índice? Por favor, ayúdenme y muchas gracias. – Rango

+1

Ah, si obtengo sqrt (real * real + imaginario * imaginario) en cada uno de esos números complejos (partes real e imaginaria del resultado), ¿debería devolver la frecuencia (Hz)? – Rango

+0

@ user532017: no - 'sqrt (re * re + im * im)' será la ** magnitud ** de la señal en la ** frecuencia ** del ** bin ** dado. La ** frecuencia ** del contenedor está determinada por su índice según mi respuesta anterior. Si encuentra el contenedor con la ** magnitud ** más grande, entonces puede determinar la ** frecuencia ** de este pico del índice como se indicó anteriormente. –

8

Los coeficientes de salida FFT (para la entrada compleja de tamaño N) son de 0 a N - 1 agrupados como frecuencia [BAJA, MEDIA, HI, ALTA, MEDIA, BAJA].

Considero que el elemento en k tiene la misma frecuencia que el elemento en N-k ya que para datos reales, FFT [N-k] = complejo conjugado de FFT [k].

El orden de exploración de BAJO a ALTO 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 de índice i = 0 a [N/2], cada uno con la frequency = i * SamplingFrequency/N

Así la frecuencia a la bin FFT [k] es:

if k <= [N/2] then k * SamplingFrequency/N 
if k >= [N/2] then (N-k) * SamplingFrequency/N 
13

he utilizado el 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 a
  • samples: Frecuencia de muestreo en Hertz (es decir, 8000 Hz, 44100 Hz, etc.)
  • nFFT: Tamaño del vector FFT
+7

Las personas no pueden saber exactamente lo que representa con 'samples' o' nFFT'. Así que por favor hazlo más explicativo. – mostar

+10

La respuesta aceptada dice que esto debe ser 'i * samples/nFFT'. ¿Por qué está el '2 'extra allí? ¿Me estoy perdiendo de algo? –

Cuestiones relacionadas