9 votes

Comment faire un lissage de courbe dans matlab ?

Gradient Image

le graphique bleu est un graphique bruité du graphique original (rouge). Existe-t-il un moyen de rapprocher le tracé bleu du tracé rouge ?

14voto

Junuxx Points 7969

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".

line graph of smoothed function

11voto

natan Points 1

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)

enter image description here

Pour plus d'informations :

doc smooth

3voto

sergej Points 1749

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 :

enter image description here

2voto

0x90 Points 8193

Juste pour ajouter une option supplémentaire :

Utilice cftool dans l'invite de matlab :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X