le graphique bleu est un graphique bruité du graphique original (rouge). Existe-t-il un moyen de rapprocher le tracé bleu du tracé rouge ?
Réponses
Trop de publicités?Définissons une fonction ondulée :
x = 0:.1:20;
y1 = 5*sin(x) + 2*x - x.^2 +.3*x.^3 - .2*(x-15).^4 - 10*x.^2.*cos(x./3+12).^3 + .5*(x-12).^4;
Et ajoutez beaucoup de bruit :
r = randi(1000,1,201) - 500;
y2 = y1+r;
Créez maintenant un filtre gaussien 1D, normalisez-le et convoluer avec notre fonction :
g = gausswin(20); % <-- this value determines the width of the smoothing window
g = g/sum(g);
y3 = conv(y2, g, 'same')
Voyons le résultat
figure;
hold on;
plot(y1, 'r', 'linewidth', 3);
plot(y2, 'b');
plot(y3, 'g', 'linewidth', 3);
En rouge, la fonction originale, en bleu la version bruitée, en vert la fonction lissée, "récupérée".
Une autre option consiste à utiliser "smooth". Je l'utilise volontiers car il s'agit d'un ligne unique fonction. En utilisant le code de la réponse précédente de @Junuxx :
x = 0:.1:20;
y1 = 5*sin(x) + 2*x - x.^2 +.3*x.^3 - .2*(x-15).^4 - 10*x.^2.*cos(x./3+12).^3 + .5*(x-12).^4;
r = randi(1000,1,201) - 500;
y2 = y1+r;
Appliquer ensuite en douceur :
ys = smooth(x,y2,0.25,'rloess');
plot(x,y2,x,ys)
Pour plus d'informations :
doc smooth
gausswin()
exige que le Boîte à outils pour le traitement du signal
smooth()
exige que le Boîte à outils pour l'ajustement des courbes
Si vous ne disposez pas de ces boîtes à outils, voici un moyen simple de les utiliser. smooth()
la mise en œuvre :
lisse.m :
function yy = smooth(y, span)
yy = y;
l = length(y);
for i = 1 : l
if i < span
d = i;
else
d = span;
end
w = d - 1;
p2 = floor(w / 2);
if i > (l - p2)
p2 = l - i;
end
p1 = w - p2;
yy(i) = sum(y(i - p1 : i + p2)) / d;
end
end
résultat pour y3 = smooth(y2, 15)
en utilisant le code @Junuxx :