20

グラフにプロットされている9000ポイントがあります。

[フル解像度]

代替テキスト

実際、プロットは私が望んでいたほどスムーズではありません。グラフを必要な程度まで滑らかにする方法はありますか?

または、でこぼこの部分を選択的に滑らかにすることができるように、何らかの形式のしきい値処理を行いますか?

よくわかりませんが、高速フーリエ変換は役に立ちますか?

4

5 に答える 5

30

Curve Fitting Toolboxをお持ちの場合は、この機能を使用できますsmooth。デフォルトの方法は、サイズ5の移動平均です(方法は変更できます)。例:

% some noisy signal
Fs = 200; f = 5;
t = 0:1/Fs:1-1/Fs;
y = sin(2*pi*f*t) + 0.6*randn(size(t));
subplot(411)
plot(y), title('Noisy signal')

% smoothed signal
subplot(412)
plot( smooth(y, 5, 'moving') ), title('smooth')
ylim([-2 2])

filterそうでない場合は、コアMATLABの関数を使用して独自のウィンドウ関数を使用できます。

% equivalent to a moving average window
wndwSize = 5;
h = ones(1,wndwSize)/wndwSize;
subplot(413)
plot( filter(h, 1, y) ), title('filter + square window')

% Guassian
h = pdf('Normal',-floor(wndwSize/2):floor(wndwSize/2),0,1);
subplot(414)
plot( filter(h, 1, y) ), title('filter + Guassian window')

スクリーンショット

于 2009-10-04T11:11:44.083 に答える
17

単純な(アドホックな)方法はalpha、各ポイントで隣接するポイントの加重平均(によって調整可能)を取得することです。

data(2:n-1) = alpha*data(2:n-1) + (1-alpha)*0.5*(data(1:n-2)+data(3:n))

またはそのいくつかのバリエーション。はい、より洗練されたものにするために、最初にデータをフーリエ変換してから、高周波を遮断することができます。何かのようなもの:

f = fft(data)
f(n/2+1-20:n/2+20) = zeros(40,1)
smoothed = real(ifft(f))

これにより、最高20の周波数がカットされます。それらを対称的に切り取るように注意してください。そうしないと、逆変換は現実的ではなくなります。適切なレベルのスムージングのために、カットオフ周波数を慎重に選択する必要があります。これは非常に単純な種類のフィルタリング(周波数領域でのボックスフィルタリング)であるため、歪みが許容できない場合は、高次の周波数を穏やかに減衰させることができます。

于 2009-10-04T09:16:35.630 に答える
5

FFTは悪い考えではありませんが、ここではおそらくやり過ぎです。移動平均または移動平均は一般的に悪い結果をもたらすため、宿題の遅れ(およびホワイトノイズ)以外の場合は避ける必要があります。

Savitzky-Golayフィルタリングを使用します(Matlab sgolayfilt(...)で)。これにより、探しているものに最適な結果が得られます。曲線の形状を維持しながら、局所的なスムージングを行うことができます。

-ポール

于 2009-11-05T07:11:51.880 に答える
3

外れ値に対してロバストではないため、モバイル平均の使用を避ける必要がある場合があります。このような場合は、モバイルの中央値が適しています。

于 2011-07-14T14:36:37.507 に答える
1

最初に、5や10などのいくつかのポイントの移動平均を表示しようとします。このように、値の1つの不一致は、グラフにわずかな影響しか与えません。もちろん、グラフをどれだけ正確にする必要があるかによって異なります。

于 2009-10-04T09:12:27.760 に答える