グラフにプロットされている9000ポイントがあります。
[フル解像度]
実際、プロットは私が望んでいたほどスムーズではありません。グラフを必要な程度まで滑らかにする方法はありますか?
または、でこぼこの部分を選択的に滑らかにすることができるように、何らかの形式のしきい値処理を行いますか?
よくわかりませんが、高速フーリエ変換は役に立ちますか?
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')
単純な(アドホックな)方法は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の周波数がカットされます。それらを対称的に切り取るように注意してください。そうしないと、逆変換は現実的ではなくなります。適切なレベルのスムージングのために、カットオフ周波数を慎重に選択する必要があります。これは非常に単純な種類のフィルタリング(周波数領域でのボックスフィルタリング)であるため、歪みが許容できない場合は、高次の周波数を穏やかに減衰させることができます。
FFTは悪い考えではありませんが、ここではおそらくやり過ぎです。移動平均または移動平均は一般的に悪い結果をもたらすため、宿題の遅れ(およびホワイトノイズ)以外の場合は避ける必要があります。
Savitzky-Golayフィルタリングを使用します(Matlab sgolayfilt(...)で)。これにより、探しているものに最適な結果が得られます。曲線の形状を維持しながら、局所的なスムージングを行うことができます。
-ポール
外れ値に対してロバストではないため、モバイル平均の使用を避ける必要がある場合があります。このような場合は、モバイルの中央値が適しています。
最初に、5や10などのいくつかのポイントの移動平均を表示しようとします。このように、値の1つの不一致は、グラフにわずかな影響しか与えません。もちろん、グラフをどれだけ正確にする必要があるかによって異なります。