Contenu principal

sgolayfilt

Filtrage de Savitzky-Golay

Description

y = sgolayfilt(x,m,fl) applique un filtre de lissage à réponse impulsionnelle finie (FIR) de Savitzky-Golay d’ordre polynomial m et de longueur de trame fl aux données du vecteur x. Si x est une matrice, sgolayfilt opère sur chaque colonne.

exemple

y = sgolayfilt(x,m,fl,w) spécifie un vecteur de pondération à utiliser lors de la minimisation par moindres carrés.

exemple

y = sgolayfilt(x,m,fl,w,dim) spécifie la dimension le long de laquelle appliquer le filtre.

Exemples

réduire tout

Générez un signal aléatoire et lissez-le avec sgolayfilt. Spécifiez un ordre polynomial de 3 et une longueur de trame de 11. Tracez les signaux d’origine et lissé.

order = 3;
framelen = 11;

lx = 34;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

plot(x,':')
hold on
plot(sgf,'.-')
legend('signal','sgolay')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent signal, sgolay.

La fonction sgolayfilt effectue la plus grande partie du filtrage en convoluant le signal avec la ligne centrale de B, la sortie de sgolay. Le résultat est la partie en régime permanent du signal filtré. Générez et tracez cette partie.

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');

plot(steady)
legend('signal','sgolay','steady')

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent signal, sgolay, steady.

Les échantillons proches des fronts du signal ne peuvent pas être placés au centre d’une fenêtre symétrique et nécessitent un traitement différent.

Pour déterminer le transitoire de démarrage, effectuez une multiplication matricielle des (framelen-1)/2 premières lignes de B par les framelen premiers échantillons du signal.

ybeg = B(1:m,:)*x(1:framelen);

Pour déterminer le transitoire final, effectuez une multiplication matricielle des (framelen-1)/2 dernières lignes de B par les framelen derniers échantillons du signal.

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

Concaténez les transitoires et la partie en régime permanent pour générer le signal complet.

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

plot(cmplt)
legend('signal','sgolay','steady','complete')
hold off

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent signal, sgolay, steady, complete.

L’ajout de pondérations à la minimisation rompt la symétrie de B et nécessite des étapes supplémentaires pour une résolution correcte.

Chargez un signal de parole échantillonné à Fs=7418Hz. Le fichier contient l’enregistrement d’une voix féminine disant le mot « MATLAB® ».

load mtlb
t = (0:length(mtlb)-1)/Fs;

Lissez le signal en appliquant un filtre de Savitzky-Golay d’ordre polynomial 9 à des trames de données de longueur 21. Tracez les signaux d’origine et filtré. Zoomez sur un intervalle de 0,02 seconde.

rd = 9;
fl = 21;

smtlb = sgolayfilt(mtlb,rd,fl);

subplot(2,1,1)
plot(t,mtlb)
axis([0.2 0.22 -3 2])
title('Original')
grid

subplot(2,1,2)
plot(t,smtlb)
axis([0.2 0.22 -3 2])
title('Filtered')
grid

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains an object of type line.

Répétez le calcul, cette fois en utilisant une fenêtre de Kaiser comme vecteur de pondération. Spécifiez le facteur de forme β=38. Tracez le nouveau signal filtré.

kmtlb = sgolayfilt(mtlb,rd,fl,kaiser(fl,38));

subplot(2,1,2)
hold on
plot(t,kmtlb)
axis([0.2 0.22 -3 2])
hold off

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains 2 objects of type line.

Arguments d'entrée

réduire tout

Signal d’entrée, défini par un vecteur ou une matrice.

Types de données : single | double

Ordre polynomial, défini par un entier non négatif. m doit être inférieur à fl. Si m = fl – 1, le filtre n’effectue aucun lissage.

Types de données : single | double

Longueur de trame, définie par un entier impair positif.

Types de données : single | double

Tableau de pondération, défini par un vecteur positif réel de longueur fl.

Types de données : single | double

Dimension le long de laquelle appliquer le filtre, définie par un scalaire entier positif. Par défaut, sgolayfilt s’applique le long de la première dimension de x dont la taille est supérieure à 1.

Types de données : single | double

Arguments de sortie

réduire tout

Signal filtré, renvoyé sous la forme d’un vecteur ou d’une matrice.

Conseils

Les filtres de lissage de Savitzky-Golay sont généralement utilisés pour lisser un signal bruité dont l’étendue des fréquences (sans le bruit) est élevée. On les appelle également filtres polynomiaux de lissage numérique ou filtres de lissage par moindres carrés. Dans certaines applications, les filtres de Savitzky-Golay sont plus performants que les filtres FIR de moyennage standard, qui ont tendance à filtrer le contenu haute fréquence en même temps que le bruit. Les filtres de Savitzky-Golay sont plus efficaces pour préserver les composantes haute fréquence du signal, mais réussissent moins bien à rejeter le bruit.

Les filtres de Savitzky-Golay sont optimaux en ce sens qu’ils minimisent l’erreur des moindres carrés lors de l’ajustement d’un polynôme à des trames de données bruitées. Pour plus d’informations sur l’algorithme de Savitzky-Golay, veuillez consulter sgolay.

Références

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice Hall, 1996.

[2] Schafer, Ronald. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine 28, no. 4 (July 2011): 111–17. https://doi.org/10.1109/MSP.2011.941097.

Capacités étendues

développer tout

Génération de code C/C++
Générez du code C et C++ avec MATLAB® Coder™.

Génération de code GPU
Générez du code CUDA® pour les GPU NVIDIA® avec GPU Coder™.

Historique des versions

Introduit avant R2006a