transformada rapida graficas graficar frecuencia fourier espectro ejemplos discreta c# signal-processing fft

c# - rapida - ¿Cómo obtengo las frecuencias de cada valor en una FFT?



transformada rapida de fourier en matlab ejemplos (5)

Tengo un resultado FFT. Estos se almacenan en dos matrices double : 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.


El primer contenedor 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 n-ésimo cubo es n * Fs / N

Entonces, si su frecuencia de muestreo, Fs es, por ejemplo, 44.1 kHz y su tamaño de FFT, N es 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 (todas las partes imaginarias son cero) la segunda mitad de la FFT (bins de N / 2 + 1 a N - 1 ) no contiene información adicional útil (tienen simetría compleja conjugada con la primera N / 2 - 1 cubos). 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 de uso práctico, ya que los filtros anti-aliasing normalmente atenuarán cualquier señal a nivel superior Fs / 2 .


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 : tasa de muestreo en hercios (es decir, 8000 Hz, 44100 Hz, etc.)
  • nFFT : tamaño del vector FFT

La frecuencia de su k th FFT es de 2 * pi * k / N.


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 Nk ya que para datos reales, FFT [Nk] = complejo conjugado 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 del índice i = 0 a [N / 2], cada uno con la frequency = i * SamplingFrequency / N

Entonces la frecuencia en bin FFT [k] es:

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


Mire mi respuesta here .

Respuesta para comentar:

La FFT en realidad calcula la cross-correlation de la señal de entrada con las funciones 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) La razón por la cual 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.