Estoy tratando de muestrear una onda sinusoidal y trazar sus componentes de frecuencia, pero tengo problemas para implementarla El resultado de tomar 65536 muestras de un ciclo de una onda sinusoidal con una amplitud máxima de 1 y una frecuencia de 100 se puede ver a continuación, donde el eje Y es la magnitud de la suma compleja de Fourier y el eje x es el número de muestra. .¿Cómo puedo ver qué frecuencia tiene la onda sinusoidal en este gráfico? Me gustaría tener un gráfico de frecuencia frente a magnitud y no de número de muestra frente a magnitud.
Esperaba un gran pico de amplitud 1 o 2 picos de amplitud 0.5 cada uno, pero parece que obtengo una gran amplitud, no sé qué podría estar haciendo mal.
Código de Matlab:
Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform);
Comentarios
- Las implementaciones de FFT a menudo tienen una ganancia proporcional a $ N $ o $ \ sqrt {N} $ en ellas. Su resultado no es ' t irrazonable.
- Dividir la magnitud por $ N $ da dos picos con magnitudes de alrededor de 0.425 cada uno (que aún es menor que el 0.5 esperado ) .¿Cómo cambio el eje x a la frecuencia del número de muestra?
Respuesta
Parece como si confundiera su frecuencia en Hertz con en radianes / seg, ya que tiene el factor de $ 2 \ pi $ en ambos períodos de muestreo dt y tu señal. Reescribí un poco de tu código para aclarar lo que creo que realmente quieres.
Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)")
Si tu frecuencia de muestreo es 65536 muestras / segundo , y desea, por ejemplo, un tono a 12 KHz, puede crearlo como se muestra. Así que aquí su período de muestra es 1/65536 segundos.
Su expectativa de obtener dos picos con una amplitud de 0.5 cada uno era correcto, solo que el tono generado no lo era.
En cuanto a escalar el eje x para que esté en Hertz, simplemente cree un vector con la misma cantidad de puntos que el resultado de FFT y con un incremento lineal de $ – fs / 2 $ a $ + fs / 2 $ . Tenga en cuenta también el cambio a fftshift que utilicé en la trama. Eso es porque la salida de la función FFT de Matlab va linealmente de 0 a fs. Me resulta más fácil visualizar tener DC centrado, pero de cualquier manera está bien. Sin el fftshift, el vector faxis pasaría de 0 a fs .
Respuesta
Algunas FFT requieren dividir por 1 / N para representar la magnitud «naturalmente» (que no conserva la energía ). Etiquetar el eje X requiere conocer la frecuencia de muestreo (Fs). Si se conoce, entonces f_x = bin_index * Fs / N, hasta N / 2, luego reflejado para frecuencias negativas. Si la frecuencia de un pico espectral (su onda sinusoidal de entrada) no es «t exactamente periódica en la longitud de FFT (p. de ciclos), entonces la magnitud del intervalo de resultados de FFT más cercano será menor y deberá interpolar entre intervalos para encontrar una estimación más cercana a la magnitud máxima (las interpolaciones parabólicas o del kernel Sinc en ventana son comunes).
Respuesta
Para agregar fórmulas som a la respuesta de hotpaw2:
Con la FFT calcula una representación de su señal como
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
donde $ f_k = \ frac {k} {N} f_s $ para $ k = 0,1, …, N / 2-1 $ y $ f_k = \ frac {kN} {N} f_s $ para $ k = N / 2, …, N-1 $, asumiendo $ N $ par.
Ahora la FFT requiere que las muestras se tomen con el paso de muestreo $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, y la FFT de la matriz de muestra $ (x_n) _n $ da la matriz de amplitud escalada $ (N \ hat x_k) _k $, ya que $ \ sum_ {k = 0} ^ {N-1} 1 = N $. El cambio de escala i s generalmente se dejan fuera de las implementaciones de FFT para que los maneje el usuario de la biblioteca de FFT.
Respuesta
FFT proporciona el método de calcular DFT esto ya lo sabe. ahora considere una señal x (n) y su DFT X (k). si su señal consta de N (65536 en su caso) muestras, entonces X (k) proporcionará valores a frecuencias discretas de 2*pi*k/N
. De hecho, el DFT X (k) anterior significa X(2*pi*k/N)
. Entonces, si encuentra X (1), significa que está encontrando el coeficiente DFT a una frecuencia discreta de 2 * pi * 1 / N y similar, X (2) significa coeficiente para 2 * pi * 2 / N y, por lo tanto, así sucesivamente. Cada coeficiente muestra la contribución de esa frecuencia en esa señal, si es grande, significa que la frecuencia constituye la mayor parte de la señal. por lo tanto, para trazar fft con respecto a la frecuencia, reemplace el eje de muestra con el eje de frecuencia que tiene puntos 2*pi*k/N
donde k = 0 a 65535.FT nunca proporciona ninguna información con respecto al tiempo. Solo proporciona información de frecuencia del señal.