web-dev-qa-db-ja.com

MATLABで曲線を平滑化する方法は?

Gradient Image

青いプロットは、元のプロット(赤)のノイズの多いプロットです。青いプロットをほぼ赤いプロットに近づける方法はありますか?

9
crack_addict

波状関数を定義しましょう:

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;

次に、1Dガウスフィルターを作成し、正規化して convolve で関数を作成します。

g = gausswin(20); % <-- this value determines the width of the smoothing window
g = g/sum(g);
y3 = conv(y2, g, 'same')

結果を見てみましょう

figure;
hold on; 
plot(y1, 'r', 'linewidth', 3); 
plot(y2, 'b'); 
plot(y3, 'g', 'linewidth', 3);

元の関数は赤、ノイズの多いバージョンは青、平滑化された「復元された」関数は緑です。

line graph of smoothed function

14
Junuxx

別のオプションは「スムーズ」を使用することです。 単一行関数なので、私はそれを使用するのが好きです。 @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;

次にスムーズに適用します:

ys = smooth(x,y2,0.25,'rloess');
plot(x,y2,x,ys)

enter image description here

詳細:

doc smooth
11
bla

gausswin()にはSignal Processing Toolboxが必要です

smooth()にはCurve Fitting Toolboxが必要です

これらのツールボックスがない場合は、簡単なsmooth()実装を次に示します。

smooth.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
_

@ Junuxxコードを使用したy3 = smooth(y2, 15)の結果:

enter image description here

3
sergej

オプションを追加するだけです:

Matlabのプロンプトでcftoolを使用します。

enter image description here

2
0x90