SavitzkyGolayDerivative (FPScript)
Calcule la dérivée d'un ensemble de données avec un filtre lissant Savitzky-Golay (dérivée des moindres carrés). Méthode efficace pour déterminer la dérivée lissée d'un ensemble de données bruité.
Syntaxe
SavitzkyGolayDerivative(DataSet, SmoothingWidth, [ PolynomialOrder = 4 ], [ DerivativeOrder = 1 ] [ , Extrapolate = FALSE ])
La syntaxe de la fonction SavitzkyGolayDerivative se compose des éléments suivants :
Section |
Description |
---|---|
DataSet |
L'ensemble de données (bruité) dont la dérivée (lissée) doit être calculée. Toutes les structures de données sont autorisées, sauf Scalaire et Liste. Tous les types de données numériques sont autorisés. Si l'argument est une liste, alors la fonction est exécutée pour chaque élément de la liste et le résultat est également une liste. |
SmoothingWidth |
Spécifie combien de valeurs voisines, y compris le point de données respectif, doivent être incluses dans le calcul du filtre dérivé (lissé). La largeur de lissage doit être un nombre impair. Sinon, l'intervalle est asymétrique, et une valeur supplémentaire est incluse dans le calcul à droite du centre par opposition à la gauche. Les structures de données autorisées sont Scalaire. Tous les types de données entiers sont autorisés. La valeur doit être supérieure ou égale à 0. Si l'argument est une liste, alors son premier élément est pris. S'il s'agit à nouveau d'une liste, le processus est répété. |
PolynomialOrder |
Spécifie l'ordre du polynôme qui est ajusté localement à l'ensemble de données et donc utilisé pour déterminer les coefficients du filtre dérivé (lissé)... L'ordre polynomial choisi doit être inférieur à la largeur de lissage (de sorte qu'un nombre suffisant de points de données soit disponible pour l'ajustement du polynôme local). Sinon, l'ordre polynomial est réduit à SmoothingWidth - 1 pour le calcul. Les structures de données autorisées sont Scalaire. Tous les types de données entiers sont autorisés. La valeur doit être supérieure ou égale à 1 et inférieure ou égale à 15. Si l'argument est une liste, alors son premier élément est pris. S'il s'agit à nouveau d'une liste, le processus est répété. Si l'argument n'est pas spécifié, il est défini à la valeur par défaut 4 . |
DerivativeOrder |
Spécifie l'ordre de la dérivée souhaité. L'argument ne doit pas être supérieur à PolynomialOrder. Les structures de données autorisées sont Scalaire. Tous les types de données entiers sont autorisés. La valeur doit être supérieure ou égale à 1 et inférieure ou égale à 15. Si l'argument est une liste, alors son premier élément est pris. S'il s'agit à nouveau d'une liste, le processus est répété. Si l'argument n'est pas spécifié, il est défini à la valeur par défaut 1 . |
Extrapolate |
La valeur TRUE indique que les points limites doivent être étendus symétriquement pour le filtrage. Dans ce cas, les coefficients de filtrage ne doivent être calculés qu'une seule fois. Bien que l'extrapolation puisse conduire à un comportement irrégulier de la dérivée (lissée) aux frontières, l'algorithme reste rapide. Si FALSE est sélectionné, le même ordre polynomial est utilisé pour déterminer la dérivée (lissée) aux points limites. Aux points limites, la largeur de lissage et l'ordre du polynôme à ajuster restent alors les mêmes, tandis que le point médian du filtre est décalé vers les limites. Dans ce cas, les coefficients de filtrage doivent être calculés individuellement pour tous les points limites. Cela permet généralement d'obtenir une plus grande précision pour déterminer la dérivée (lissée) aux points limites, mais l'algorithme est considérablement plus lent. Les structures de données autorisées sont Scalaire. Les types de données pris en charge sont Valeur booléenne. Si l'argument est une liste, alors son premier élément est pris. S'il s'agit à nouveau d'une liste, le processus est répété. Si l'argument n'est pas spécifié, il est défini à la valeur par défaut FALSE . |
Remarques
Le résultat a la même structure et la même unité que l'argument DataSet.
Pour calculer la dérivée (lissée), chaque valeur dans DataSet est pondérée par (SmoothingWidth-1)/2 valeurs voisines de gauche et (SmoothingWidth-1)/2 valeurs voisines à droite (lorsque SmoothingWidth est inégale). La dérivée (lissée) correspond à la convolution du signal avec des coefficients de longueur de filtre SmoothingWidth. Pour cette procédure, les coefficients du filtre sont déterminés de telle sorte que la dérivée d'une régression polynomiale locale (c'est-à-dire l'ajustement de la courbe polynomiale locale) soit renvoyée comme résultat. Dans ce cas, les coefficients de filtrage ne dépendent pas des valeurs y. L'algorithme est décrit dans Algorithme de SavitzkyGolay.
Le filtrage n'est pas optimisé pour la suppression de fréquences plus élevées, mais plutôt pour la suppression de moments statistiques d'un ordre supérieur. Le filtre est donc particulièrement adapté pour déterminer la dérivée des signaux qui, sans bruit, auraient une gamme de hautes fréquences sans bruit. La méthode de lissage Savitzky-Golay est également connue sous les noms de "filtre polynomial de lissage numérique (DISPO)", "lissage des moindres carrés" et "différenciation des moindres carrés".
Avant le filtrage, les valeurs sont converties en valeurs réelles ou complexes à virgule flottante de 64 bits. Le type de données du résultat est toujours une valeur réelle ou complexe à virgule flottante de 64 bits.
L'image met en évidence la différence de la fonction Derivative puis lissée à l'aide de la fonction Smooth (moyenne glissante), et la fonction SavitzkyGolayDerivative (avec un ordre polynomial de 7). La même largeur de lissage est utilisée dans chaque cas. Le filtre dérivé de Savitzky-Golay permet de mieux approcher la courbe idéale que la moyenne glissante :
Disponible dans
FlexPro Basic, Professional, Developer Suite
Exemples
SavitzkyGolayDerivative(Signal, 11, 3)
Calcule la dérivée première lissée d'un signal bruité en utilisant le filtre Savitzky-Golay. La dérivée est calculée en déterminant la dérivée d'un polynôme du troisième degré, qui est ajusté localement à l'ensemble de données. Pour l'ajustement de courbe local, un total de 11, c'est-à-dire cinq valeurs voisines à gauche et à droite du point de données respectif, sont incluses dans le résultat.
SavitzkyGolayDerivative(Signal, 25, 6, 2)
Calcule la dérivée seconde lissée d'un signal bruité à l'aide du filtre Savitzky-Golay. La dérivée seconde est calculée en déterminant la dérivée d'un polynôme du sixième degré, qui est ajusté localement à travers 25 points de données.
SavitzkyGolayDerivative(DataSet, 5, 4)
Calcule la dérivée première en déterminant la dérivée d'un polynôme du quatrième degré, qui est ajusté localement par 5 points de données respectivement. Le polynôme du quatrième degré, ajusté à travers 5 points de données, est déterminé de manière unique et coïncide avec le polynôme d'interpolation de Lagrange. Le résultat du calcul est donc égal à Derivative(DataSet, DERIVATIVE_CENTRAL_5_POINTS).
Dim N = 6
Dim polyOrder = 6
Dim width = 2*N + 1
Dim dirac = (0 # width) : 1 : (0 # width)
Dim coeff = SavitzkyGolayDerivative(dirac, width, polyOrder, 1)[N+1, N+ width]
AmplitudeResponse(coeff)
Calcule la réponse en amplitude du filtre dérivé de Savitzky-Golay (pour un polynôme d'ordre 6 et une largeur de lissage de 13). Pour ce faire, la fonction SavitzkyGolayDerivative est appliquée à une impulsion de Dirac. Cela permet d'obtenir la fonction de transfert du système sous la forme de coefficients de filtrage. À l'aide de coefficients de filtrage, la fonction AmplitudeResponse peut être utilisée pour calculer la réponse d'amplitude du filtre.
Voir aussi
Analyse du signal - Objet d'analyse
Littérature
[1] Savitzky, A.; Golay, M.J.E.: Smoothing and Differentiation of Data by Simplified Least Squares Procedures. Dans: Analytical Chemistry, Vol. 36, No. 8, Pages 1627-39. http://pubs.acs.org/doi/abs/10.1021/ac60214a047,1964.
[2] A. Gorry: General least-squares smoothing and differentiation by the convolution (Savitzky–Golay) method. Dans: Analytical Chemistry, Vol. 62, No. 2, Pages 570-3. http://pubs.acs.org/doi/abs/10.1021/ac00205a007,1990.