J'ai un signal mesuré à 100 Hz et je dois appliquer le filtre de lissage Savitzky-Golay sur ce signal. Cependant, en y regardant de plus près, mon signal n'est pas mesuré à une vitesse parfaitement constante, le delta entre les mesures se situe entre 9,7 et 10,3 ms.
Existe-t-il un moyen d'utiliser le filtre Savitzky-Golay sur des données pas également espacées? Y a-t-il d'autres méthodes que je pourrais appliquer?
Réponses:
Une méthode consiste à rééchantillonner vos données de manière à ce qu'elles soient également espacées, puis vous pouvez effectuer le traitement que vous souhaitez. Le rééchantillonnage à bande limitée utilisant le filtrage linéaire ne sera pas une bonne option car les données ne sont pas uniformément espacées, vous pouvez donc utiliser une sorte d'interpolation polynomiale locale (par exemple des splines cubiques) pour estimer les valeurs du signal sous-jacent à "exactes" Intervalles de 10 millisecondes.
la source
En raison de la façon dont le filtre Savitzky-Golay est dérivé (c'est-à-dire sous forme d'ajustements polynomiaux des moindres carrés locaux), il y a une généralisation naturelle à l'échantillonnage non uniforme - c'est juste beaucoup plus cher en termes de calcul.
Filtres Savitzky-Golay en général
Pour le filtre standard, l'idée est d'adapter un polynôme à un ensemble local d'échantillons [en utilisant les moindres carrés], puis de remplacer l'échantillon central par la valeur du polynôme à l'indice central (c'est-à-dire à 0). Cela signifie que les coefficients de filtre SG standard peuvent être générés en inversant une matrice Vandermonde d'indices d'échantillon. Par exemple, pour générer un ajustement parabolique local sur cinq échantillons (avec les indices locaux -2, -1,0,1,2), le système d'équations de conception A c = y serait le suivant:y0… Y4 A c = y
Échantillonnage non uniforme
alors chaque matrice de conception aura la forme suivante:
la source
(dérivation quelqu'un?)
("Faire semblant d'être également espacés" signifie:± N/ 2 points autour de chacun t où vous voulez SavGol (t ),tje→ i . C'est peut-être évident, mais ça m'a pris un moment.)
prendre le
ne pas tout casser
la source
J'ai découvert qu'il y a deux façons d'utiliser l'algorithme savitzky-golay dans Matlab. Une fois comme filtre, et une fois comme fonction de lissage, mais fondamentalement, ils devraient faire de même.
la source
Si cela peut vous aider, j'ai fait une implémentation C de la méthode décrite par datageist. Libre d'utiliser à vos risques et périls.
la source