Tengo una pregunta relacionada con el filtrado de paso bajo de la aceleración IMU y los datos del giro. Para elegir una frecuencia de corte razonable, pensé en hacer algunas observaciones en el espectro.
Ahora tengo algunos problemas de interpretación. En mis pensamientos originales, asumí que habría algunos picos importantes. P.ej. un pico donde se encuentra la frecuencia de un movimiento de rotación. No habría muchas frecuencias altas y podía ver claramente un lugar donde pudiera cortarlo.
Eso estuvo mal ... Ya que la FFT se tomó en una medición completa de unos 30 segundos, la trama no tuvo nada que ver con lo que tenía en mente.
¿Cómo debo interpretar la FFT en una medición completa? Ahora veo que no es como ver una música en vivo a través de un analizador de espectro.
¿Es incluso una buena solución tomar la FFT para elegir una frecuencia de corte? Si no, ¿cuáles son mejores formas de hacerlo?
Edición 1:
Después de algunas buenas entradas, agrego más información.
La idea era matar el ruido generado por la IMU. Dado que la IMU está montada en un vehículo o en partes móviles en el vehículo (por ejemplo, el volante), asumí que el movimiento razonable más rápido debería ser conocido.
La función de filtro utilizada fue esta:
function Hd = lp_equiripple2
%LP_EQUIRIPPLE2 Returns a discrete-time filter object.
% MATLAB Code
% Generated by MATLAB(R) 9.2 and the Signal Processing Toolbox 7.4.
% Generated on: 29-Mar-2018 11:37:08
% Equiripple Lowpass filter designed using the FIRPM function.
% All frequency values are in Hz.
Fs = 100; % Sampling Frequency
Fpass = 10; % Passband Frequency
Fstop = 20; % Stopband Frequency
Dpass = 0.0057563991496; % Passband Ripple
Dstop = 0.0001; % Stopband Attenuation
dens = 20; % Density Factor
% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);
% Calculate the coefficients using the FIRPM function.
b = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);
% [EOF]
La FFT se recibió y se mostró de esta manera:
plot( ( 0:length(acc) - 1) / length(acc) * 100, abs( fft( gyr(:,:) ) ) )
Lo que sé, es de hecho un poco de código de espagueti.
Como ejemplo adjuntaré esta imagen recibida por este gráfico. Azul rojo amarillo es igual a la rotación alrededor de los ejes x, y y z.
La imagen completa está ampliada ya que DC es aproximadamente 2.5e5
Edit2:
AcabodeverquenohayunDCenorme.Simeacerco,esunpicorealmenteenormea3Hz,loquetienemuchosentido.Eneldiagramadegiro,estafrecuenciaesclaramentevisible:
Elespectrogramatambiénfueunabuenavisualización.Aunque,todavíanopuedoverunbuenlugarparacortar.Noestoysegurodesiaúndebería...
Edición3:
Segúnlosolicitado,temostraréungráficodeespectrograma.Porahora,hedecididodejarlosdatossinfiltrar,yaquenoestácompletamenteclaroquéesrealmenteelruido.ElsesgodelosdatosdelaIMUes,porsupuesto,elproblemamuchomayor.
A la izquierda puede ver los datos del giro del eje y, mientras que en el lado derecho se muestra la rotación en el eje z.
Si alguien tiene una buena idea de filtrarlo, dímelo, lo intentaré :)
De lo contrario, diría que éste está cerrado.