Filtre Savitzky – Golay par rapport au filtre linéaire IIR ou FIR

11
  • Un filtre IIR / FIR traditionnel (passe-bas pour éliminer les oscillations hautes fréquences), par exemple moyenne mobile,

  • ou un filtre Savitzky-Golay

peuvent tous être utiles pour lisser un signal, tel qu'un signal d'enveloppe:

entrez la description de l'image ici

Pour quelle application un filtre Savitzky-Golay serait-il plus intéressant qu'un passe-bas classique?

Qu'est-ce qui le rend différent d'un filtre standard et qu'est-ce qu'il ajoute par rapport aux filtres standard?

S'adapte-t-il aux données d'entrée?

Est-ce mieux pour la conservation transitoire?


Avez-vous déjà été dans une situation d'ingénierie un jour quand vous avez décidé "Utilisons un filtre SG au lieu de déplacer la moyenne ou un autre passe-bas FIR! C'est mieux parce que ceci et ceci et cela ..." ? Alors cette question est pour toi!

g6kxjv1ozn
la source

Réponses:

4

Étant donné que la discussion dans les réponses et commentaires existants a principalement porté sur ce que sont réellement les filtres Savitzky-Golay (ce qui était très utile), je vais essayer d'ajouter aux réponses existantes en fournissant quelques informations sur la façon de choisir réellement un filtre de lissage, qui est, à ma connaissance, sur quoi porte réellement la question.

Tout d'abord, je voudrais répéter ce qui est devenu clair dans la discussion résultant des autres réponses: la catégorisation des filtres de lissage dans la question en filtres FIR / IIR linéaires et invariants dans le temps (LTI) d'une part, et D'autre part, les filtres Savitzky-Golay sont trompeurs. Un filtre Savitkzy-Golay n'est qu'un filtre FIR standard conçu selon un critère spécifique (approximation polynomiale locale). Tous les filtres mentionnés dans la question sont donc des filtres LTI.

La question restante est de savoir comment choisir un filtre de lissage. Si la complexité de calcul et / ou la mémoire sont un problème, les filtres IIR peuvent être préférables aux filtres FIR, car ils permettent généralement une suppression du bruit comparable (c'est-à-dire une atténuation de la bande d'arrêt) avec un ordre de filtrage beaucoup plus faible que les filtres FIR. Mais notez que si un traitement en temps réel est nécessaire, un inconvénient possible des filtres IIR est qu'ils ne peuvent pas avoir une réponse de phase exactement linéaire. Le signal souhaité subira donc des distorsions de phase. Pour le traitement hors ligne, les distorsions de phase peuvent être évitées, même avec des filtres IIR, en appliquant un filtrage de phase zéro .

En dehors des considérations discutées dans le paragraphe précédent, c'est principalement le critère de conception qui importe, pas tant si le filtre est FIR ou IIR, car tout filtre IIR (stable) peut être approximé avec une précision arbitraire par un filtre FIR, et tout Le filtre FIR peut être approximé par un filtre IIR, même si ce dernier peut être beaucoup plus difficile. Le critère de conception approprié dépend évidemment des propriétés des données et du bruit. En ce qui concerne le lissage, nous supposons généralement des données suffisamment suréchantillonnées (c'est-à-dire lissées). Si le bruit a principalement des composantes à haute fréquence, c'est-à-dire s'il y a peu de chevauchement spectral entre les données et le bruit, nous voulons maximiser l'atténuation de la bande d'arrêt, ou minimiser l'énergie de la bande d'arrêt, tout en préservant le signal souhaité aussi bien que possible. Dans ce cas, nous pourrions choisir un filtre FIR à phase linéaire conçu selon un critère minimax en utilisant l'algorithme de Parks-McClellan. Nous pourrions également minimiser l'énergie de la bande d'arrêt (c'est-à-dire minimiser la puissance du bruit dans la bande d'arrêt) en choisissant une méthode des moindres carrés. Un mélange entre les deux critères (minimax et moindres carrés) est possible en choisissant unconception des moindres carrés contraints , qui minimise l'énergie de la bande d'arrêt tout en limitant l'erreur d'approximation maximale dans la bande passante.

Si le spectre de bruit chevauche considérablement le spectre du signal, une approche plus prudente est requise et l'atténuation par force brute ne fonctionnera pas bien car soit vous laissez trop de bruit (en choisissant la fréquence de coupure trop élevée), soit vous déformez la valeur souhaitée. trop de signal. Dans ce cas, les filtres Savitzky-Golay (SG) peuvent être un bon choix. Le prix à payer est une atténuation médiocre de la bande d'arrêt, mais un avantage est que certaines propriétés du signal sont très bien préservées. Cela a à voir avec le fait que les filtres SG ont une réponse en bande passante plate, c'est-à-dire

(1)dkH(ejω)dωk|ω=0=0k=1,2,,r

où est l'ordre du polynôme approximatif et est la réponse en fréquence du filtre. La propriété garantit que les premiers moments du signal d'entrée sont préservés dans la sortie, ce qui signifie que la largeur et la hauteur des pics dans le signal souhaité sont bien préservées.rH(ejω)(1)r

Bien entendu, il existe également un compromis entre les deux types de filtres de lissage évoqués ci-dessus (forte atténuation de la bande d'arrêt et SG). Nous pourrions concevoir un filtre FIR avec un certain degré de planéité à et utiliser les degrés de liberté restants pour maximiser l'atténuation de la bande d'arrêt ou minimiser l'énergie de la bande d'arrêt. Dans le cas des filtres FIR, le problème de conception qui en résulte est suffisamment simple (et convexe), et des routines d'optimisation générales disponibles dans plusieurs logiciels peuvent être utilisées pour obtenir le filtre optimal pour l'application donnée.ω=0

Pour ceux qui s'intéressent à la théorie des filtres SG, les références les plus pertinentes que je peux recommander sont les suivantes:

Matt L.
la source
2

Comme pour tout, certains outils sont parfois meilleurs que d'autres.

Les filtres à moyenne mobile (MA) peuvent être utilisés pour lisser les données et sont FIR. Ils sont à peu près le filtre le plus simple que vous puissiez trouver, et ils fonctionnent bien pour de nombreuses tâches tant que vous n'essayez pas de modéliser des sauts soudains ou des tendances polynomiales. Gardez à l'esprit que ce ne sont essentiellement que des filtres passe-bas, ils fonctionnent donc mieux lorsque les données qui vous intéressent dans le signal sont à basse fréquence et à bande assez étroite.

Les filtres Savitzky-Golay (SG) sont un groupe spécial de filtres FIR qui adaptent essentiellement un polynôme à votre série temporelle lorsque la convolution glisse le long du signal. Les filtres SG sont utiles pour les signaux où les choses qui vous intéressent ne sont pas nécessairement des basses fréquences et une bande assez étroite.

Je pense que vous constaterez que si vous lisez la page Wikipédia que vous avez liée assez attentivement, cela explique la différence entre les filtres SG et MA de manière assez rigoureuse. Gardez à l'esprit cependant: au final, ce ne sont que des outils pour faire des choses similaires, c'est à vous de savoir quand utiliser le bon outil

MODIFIER :

Puisqu'il semble y avoir une certaine confusion que les filtres SG sont "adaptatifs" d'une manière ou d'une autre au niveau de base, j'ai inclus un simple exemple MATLAB. Comme Dan l'a souligné, ceux-ci peuvent être rendus adaptatifs, mais leur mise en œuvre de base ne l'est souvent pas. En inspectant le code, vous verrez qu'il s'agit simplement d'une recherche matricielle avec une manipulation spéciale. Rien dans ce filtre n'est "adaptatif" au sens traditionnel, vous choisissez simplement un ajustement polynomial et la longueur sur laquelle ce polynôme sera ajusté sur le signal via convolution; SG est FIR indispensable. Le script que j'ai ci-dessous produit cette intrigue: Comparaison du filtre SG avec MA

En regardant cette figure, vous pouvez voir que le MA et le SG accomplissent essentiellement la même chose, mais avec quelques distinctions importantes:

  1. Le MA fait un excellent travail de suppression du bruit, mais il fait un mauvais travail de capture des sauts transitoires dans le signal. Nous pouvons supprimer encore plus de bruit en augmentant la longueur du filtre, mais cela fonctionnera encore pire sur les transitoires; cet effet sera considéré comme un "maculage" près de tout transitoire, que vous devriez voir sur la figure ci-dessous.
  2. Le SG fait un excellent travail de capture des transitoires du signal, mais ne fait pas un excellent travail de suppression du bruit (au moins en comparaison avec un MA de la même taille). Nous pouvons améliorer la suppression du bruit près des non-transitoires en augmentant la longueur de la trame, mais cela introduira une sonnerie analogue au phénomène de Gibb près des transitoires.

Pour que vous puissiez mieux comprendre le fonctionnement de ces filtres, je vous encourage à prendre le code ici et à le manipuler, et à voir comment toutes les parties individuelles du filtre SG fonctionnent.

Code pour l'exemple MATLAB:

% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';

% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');

% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);

% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st   = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en   = B(sz -m+1 : sz, :) * sn(n - sz+1:n);

% combine our results
sn_sg  = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;

% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');

legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');
matthewjpollard
la source
1
Le point semble être (en voyant l'autre réponse) que le filtre SG est un "filtre non linéaire à variation temporelle entièrement dépendant des données dont les coefficients sont recalculés pour chaque segment court de son entrée".
g6kxjv1ozn
1
À ma connaissance, après l'avoir mis en œuvre plusieurs fois, le filtre SG n'est pas du tout un filtre adaptatif, en particulier par rapport à votre filtre adaptatif moyen comme un LMS ou un RLS. Je ne suis pas du tout d'accord avec l'affirmation selon laquelle les poids des filtres varient dans le temps. Les filtres SG sont essentiellement une recherche de table, vous filtrez avec les valeurs de la table pour calculer une réponse transitoire, puis vous revenez en arrière et gérez les cas de bord au début / fin du signal. Je vais modifier mon message avec un exemple MATLAB pour vous le montrer.
matthewjpollard
2
@matthewjpollard A noter, je n'ai pas personnellement d'expérience significative dans l'utilisation de ce filtre, mais pour moi le filtre SG comme le mieux implémenté semble être une implémentation de filtre adaptatif, avec des coefficients variant dans le temps. La façon dont vous avez appliqué le filtre dans votre code n'est pas (comme vous avez traité la séquence entière comme le "sous-ensemble" de données), mais la manière spécifiquement décrite sur Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80% 93Golay_filter et dans l'article lui-même de Savitzky et Golay sont en effet adaptatifs: pdfs.semanticscholar.org/4830/…
Dan Boschen
2
@matthewjpollard Dans vos systèmes en temps réel, vos données sont-elles toujours diffusées en continu, de sorte que vous recalculez les coefficients sur des intervalles plus courts ou travaillez-vous toujours dans de petits blocs de données?
Dan Boschen
2
Merci Matt. Donc, nous pourrions peut-être associer ce que vous faites comme adaptatif / variant dans le temps dans le sens où les coefficients sont calculés pour chaque collecte de données (les mêmes coefficients au sein d'une collecte de données mais avec un traitement approprié du début et de la fin mais variant d'une collecte à l'autre - si je comprendre correctement). Merci d'avoir partagé votre code et votre exemple d'application.
Dan Boschen
2

REMARQUE

ma réponse précédente (avant cette modification) dénotant le filtre Savitzky-Golay (SG) comme un filtre non linéaire dépendant des données d'entrée était erronée, en raison d'une mauvaise interprétation prématurée de la façon dont un filtre Savitzky-Golay (SG) calcule sa sortie selon le lien wiki fourni. Alors maintenant, je le corrige pour le bénéfice de ceux qui verraient également comment les filtres SG sont implémentables par le filtrage FIR-LTI. Merci à @MattL. pour sa correction, le grand lien qu'il a fourni et la patience qu'il a eu (que je n'aurais jamais pu montrer) lors de mon enquête sur la question. Bien que je préfère honnêtement une objection plus verbeuse qui n'est clairement pas nécessaire néanmoins. Veuillez également noter que la bonne réponse est l'autre, celle-ci est juste pour une clarification supplémentaire de la propriété LTI des filtres SG.

Maintenant, il n'est pas surprenant que lorsque quelqu'un (qui n'a jamais utilisé ces filtres auparavant) fait face à la définition du filtre SG comme un ajustement polynomial LSE d'ordre inférieur à des données données, il / elle saute immédiatement à la conclusion que ceux-ci sont dépendants des données, non linéaires et filtres adaptatifs variant dans le temps (décalage).

Pourtant, la procédure d'ajustement polynomial est intelligemment interprétée par SG eux-mêmes, de sorte qu'elle permet un filtrage linéaire complètement indépendant des données, invariable dans le temps, rendant ainsi SG un filtre LTI-FIR fixe.

Ce qui suit est un résumé le plus court du lien fourni par MattL. Pour tout détail qui semble manquer, veuillez consulter le document d'origine, ou demander à clarifier. Mais je ne voudrais pas reproduire tout le document ici.

2M+1x[M],x[M+1],...,x[0],x[1],...,x[M]n=0p[n]Nn=M,M+1,...,1,0,1,...M

p[n]=k=0Naknk=a0+a1n+a2n2+...+aNnN

akNthp[n]

E=MM(p[n]x[n])2

x=[x[M],x[M+1],...,x[0],x[1],...,x[M]]T

akE

(1)Eai=0   ,   for    i=0,1,..,N

Maintenant, pour ceux qui connaissent la procédure de polyfit LSE, je vais simplement écrire l'équation de matrice résultante (à partir du lien) qui définit l'ensemble de coefficients optimal:

(2)a=(ATA)1ATx=Hx
x(2M+1)×1H2M+1NAnAHA

A=[αn,i]=[(M)0(M)1...(M)N(M+1)0(M+1)1...(M+1)N...(0)0(0)1...(0)N...(M)0(M)1...(M)N]

Maintenant, penchons-nous un instant et discutons d'un point ici.

AHnakMNx[n]ak2nd

... Ceci (le polyfit LSE) peut être répété à chaque échantillon de l'entrée, produisant à chaque fois un nouveau polynôme et une nouvelle valeur de la séquence de sortie y [n] ...

Alors, comment surmonter cette surprenante surprise? En interprétant et en définissant la sortie du filtre SG comme suit:

Nnx[n]y[n]p[n]n=0

y[n]=y[0]=m=0Namnm=a0

2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]x[n]nx[n]h[n]. Mais alors, quels sont les coefficients de filtrage pour ce filtre SG? Voyons voir.

ak

a=Hx

[une0une1uneN]=[h(0,0)h(0,1)...h(0,2M)h(1,0)h(1,1)...h(1,2M)...h(N,0)h(0,1)...h(0,2M)][X[-M]X[-M+1]...X[M]]

une0HX

une0=H(0,n)X=H(0,k)X[k]=H(0,-n)X[n]

h[n]=H(0,-n)

N2M+1

y[n]2M+1X[n]LhN[n]

y[n]=X[n]hN[n]

COMMENTAIRE

unekh[n]y[n]Xune=HXunekp[n]unekh[n]

CODE MATLAB / OCTVE

h[n]h[n]

% Savitzky-Golay Filter
% 
clc; clear all; close all;

N = 3;                      % a0,a1,a2,a3 : 3rd order polynomial
M = 4;                      % x[-M],..x[M] . 2M + 1 data

A = zeros(2*M+1,N+1);
for n = -M:M
    A(n+M+1,:) = n.^[0:N];
end

H = (A'*A)^(-1)* A';        % LSE fit matrix

h = H(1,:);                 % S-G filter impulse response (nancausal symmetric FIR)

figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 =  ' , num2str(2*M+1)]);

subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');

La sortie est:

entrez la description de l'image ici

J'espère que cela clarifie le problème.

Fat32
la source
2
@ Fat32 Je pense que c'est parce que c'était une longue liste de commentaires, donc pour garder le tableau propre, ils le déplacent généralement "pour discuter". Tout est toujours là, juste sans encombrer la page principale. C'est pourquoi le système suggère de le déplacer pour discuter lorsque les allers-retours deviennent trop longs. Ne vous inquiétez pas, tout le monde vous aime toujours.
Dan Boschen
1
@ g6kxjv1ozn Je suis sur ce point ... veuillez patienter ...
Fat32
2
@ Fat32 Excellent travail! Je l'ai lu mais je vais devoir le lire et il est écrit très clairement, je n'aurai qu'à le suivre au crayon et au papier étape par étape pour le voir totalement comme vous le faites maintenant. Merci d'avoir mis tout cela ici.
Dan Boschen
4
1ω=0
2
unekh[n]