Tengo una señal que se mide a 100Hz y necesito aplicar el filtro de suavizado Savitzky-Golay en esta señal. Sin embargo, en una inspección más cercana, mi señal no se mide a una velocidad perfectamente constante, el delta entre mediciones oscila entre 9.7 y 10.3 ms.
¿Hay alguna manera de usar el filtro Savitzky-Golay en datos no espaciados por igual? ¿Hay otros métodos que podría aplicar?
Respuestas:
Un método sería volver a muestrear sus datos para que estén igualmente espaciados, luego puede hacer el procesamiento que desee. El remuestreo ilimitado de banda usando filtrado lineal no será una buena opción ya que los datos no están espaciados uniformemente, por lo que podría usar algún tipo de interpolación polinómica local (por ejemplo, splines cúbicas) para estimar cuáles son los valores de la señal subyacente "exactos" Intervalos de 10 milisegundos.
fuente
Debido a la forma en que se deriva el filtro Savitzky-Golay (es decir, como ajustes polinomiales de mínimos cuadrados locales), existe una generalización natural al muestreo no uniforme: es mucho más costoso desde el punto de vista computacional.
Filtros Savitzky-Golay en general
Para el filtro estándar, la idea es ajustar un polinomio a un conjunto local de muestras [usando mínimos cuadrados], luego reemplazar la muestra central con el valor del polinomio en el índice central (es decir, en 0). Eso significa que los coeficientes de filtro SG estándar pueden generarse invirtiendo una matriz de Vandermonde de indicios de muestra. Por ejemplo, para generar un ajuste parabólico local en cinco muestras (con las indicaciones locales -2, -1,0,1,2), el sistema de ecuaciones de diseño A c = y sería el siguiente:y0…y4 Ac=y
En lo anterior, los son los coeficientes desconocidos del polinomio de mínimos cuadrados c 0 + c 1 x + c 2 x 2 . Dado que el valor del polinomio en x = 0 es solo c 0 , calcular el pseudoinverso de la matriz de diseño (es decir, c = ( A T A ) - 1 A T y ) arrojará los coeficientes del filtro SG en la fila superior. En este caso, seríanc0…c2 c0+c1x+c2x2 x=0 c0 c=(ATA)−1ATy
Muestreo no uniforme
entonces cada matriz de diseño tendrá la siguiente forma:
fuente
(derivación alguien?)
fuente
Descubrí que hay dos formas de usar el algoritmo savitzky-golay en Matlab. Una vez como filtro y otra como función de suavizado, pero básicamente deberían hacer lo mismo.
fuente
Si es de alguna ayuda, hice una implementación en C del método descrito por datageist. Uso gratuito bajo su propio riesgo.
fuente