transformada - suavizado de señales matlab
Determine la frecuencia de los datos de señal en MATLAB (2)
Creo que debería ser
(indexMax-1) * Fs / L
El primer elemento de abs (fft (x)) es la corriente continua (DC), o el sesgo, o la media de la señal, o X0. Contamos desde el segundo elemento (X1). Por favor, avíseme si me equivoco. Gracias.
clear all
clc
close all
Fs = 1;
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal
t = 0:Fs:T; % T seconds
L = length(t); % L is the length of sample sequence
bias = 4
signal = sin(t) + bias;
[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));
frequency_method1 = (indexMax-1) * Fs / (L-1);
frequency_method2 = (indexMax-1) * Fs / L;
number_of_cycles_method1 = frequency_method1*T
number_of_cycles_method2 = frequency_method2*T
subplot(2,1,1)
plot(t,signal,''-or'') ; grid on;
legend(''about 1.7 cycles of cosine signal'')
subplot(2,1,2)
plot(abs(fft(signal-mean(signal))),''-xb''); grid on
legend(''abs of fft'')
number_of_cycles_method1 =
2
number_of_cycles_method2 =
1.8333
Tengo datos de un sensor y necesito encontrar su frecuencia. Parece que fft()
parece ser el camino a seguir, pero los documentos de MATLAB solo muestran cómo obtener un gráfico de las frecuencias, no sé qué hacer a partir de ahí.
Así es como se ven mis datos:
Una forma de hacerlo es utilizar un fft. Dado que fft le da la representación de frecuencia de la señal, quiere buscar el máximo, y dado que fft es una señal compleja, primero querrá tomar el valor absoluto. El índice corresponderá a la frecuencia normalizada con la energía máxima. Por último, si su señal tiene un desplazamiento, como es el caso con el que muestra, quiere deshacerse de ese desplazamiento antes de tomar el fft para que no obtenga un máximo en el origen que representa el componente de CC.
Todo lo que describí en una línea sería:
[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));
donde indexMax es el índice donde se puede encontrar el valor máximo de fft.
Nota: para pasar de indexMax a la frecuencia real de interés, necesitará saber la longitud L de la fft (igual que la longitud de su señal) y la frecuencia de muestreo Fs. La frecuencia de la señal será entonces:
frequency = indexMax * Fs / L;
Alternativamente, más rápido y funcionando bastante bien también, dependiendo de la señal que tenga, tome la autocorrelación de su señal:
autocorrelation = xcorr(signal);
y encuentra el primer máximo que ocurre después del punto central de la autocorrelación. (La autocorrelación será simétrica con su máximo en el medio). Al encontrar ese máximo, encontrará el primer lugar donde la señal cambiada se parece más o menos a sí misma. Es decir, usted encuentra el período de su señal. Como la señal modificada por un múltiplo de su período siempre se verá como tal, debe asegurarse de que el máximo que encuentre corresponda efectivamente al período de la señal y no a uno de sus múltiplos.
Debido al ruido en su señal, el máximo absoluto podría ocurrir en un múltiplo de su período en lugar del período en sí. Entonces, para tener en cuenta ese ruido, tomaría el máximo absoluto de la autocorrelación (autocorrelación (longitud (autocorrelación) / 2 + 1), y luego descubriría dónde la autocorrelación es mayor que, digamos, el 95% de ese valor máximo para la primera tiempo en la segunda mitad de la señal. 95%, 99% o algún otro número dependerá de la cantidad de ruido que corrompa su señal.
ACTUALIZACIÓN: me doy cuenta de que asumí que quería decir con la "frecuencia" de su señal el tono o la base armónica o la frecuencia con más energía, como quiera que la mire. Si por frecuencia quisiste decir la representación de frecuencia de tu señal, entonces, en una primera aproximación, solo quieres representar los abs de la FFT para tener una idea de dónde está la energía:
plot(abs(fft));
Si quiere entender por qué hay un abs o qué información relevante está perdiendo al no representar la fase de fft, puede leer un poco más acerca de la transformación DFT para comprender exactamente lo que obtiene.