8

-2020の範囲の整数を含むデータのベクトルがあります。

以下は、次の値のプロットです。

ここに画像の説明を入力してください

これは、ベクターデータからの96要素のサンプルです。上記のプロットからわかるように、要素の大部分は-2、2の間隔にあります。

データからノイズを除去したい。低振幅のピークを排除し、高振幅のピーク、つまりインデックス74のようなピークを維持したいと思います。

基本的には、高振幅のピークと低振幅のピークのコントラストを上げたいだけで、低振幅のピークをなくすことができればと思います。

これを行う方法を教えていただけますか?

関数を試しmapstdましたが、問題は、その高振幅ピークも正規化することです。

ウェーブレット変換ツールボックスの使用を考えていましたが、ウェーブレット分解係数からデータを再構築する方法が正確にわかりません。

これを行う方法を教えてもらえますか?

4

5 に答える 5

9

外れ値を検出する 1 つの方法は、3 つの標準偏差ルールを使用することです。例:

%# some random data resembling yours
x = randn(100,1);
x(75) = -14;
subplot(211), plot(x)

%# tone down the noisy points
mu = mean(x); sd = std(x); Z = 3;
idx = ( abs(x-mu) > Z*sd );         %# outliers
x(idx) = Z*sd .* sign(x(idx));      %# cap values at 3*STD(X)
subplot(212), plot(x)

ここに画像の説明を入力


編集:

ここでの目標を誤解していたようです。反対のことをしたい場合は、代わりに次のようにします。

%# some random data resembling yours
x = randn(100,1);
x(75) = -14; x(25) = 20;
subplot(211), plot(x)

%# zero out everything but the high peaks
mu = mean(x); sd = std(x); Z = 3;
x( abs(x-mu) < Z*sd ) = 0;
subplot(212), plot(x)

ここに画像の説明を入力

于 2011-07-29T13:58:00.703 に答える
7

これが説明のみを目的としていて、実際にこれらのスケーリングされた値を何かに使用する予定がない場合は、次の方法でコントラストを上げたいことがあります。

% your data is in variable 'a'
plot(a.*abs(a)/max(abs(a)))

編集:私たちは画像を投稿しているので、ここに私のものがあります(前/後): ここに画像の説明を入力してください

于 2011-07-29T13:27:25.023 に答える
6

分割ウィンドウ フィルターを試してみてください。x が現在のサンプルの場合、フィルターは次のようになります。

k = [L L L L L L 0 0 0 x 0 0 0 R R R R R R]

各サンプル x について、左側 (L) の周囲のサンプルのバンドと右側の周囲のサンプルのバンドを平均します。あなたのサンプルが陽性と陰性の場合 (あなたのもののように)、腹筋をとるべきです。価値を第一に。次に、サンプル x をこれらの周囲のサンプルの平均値で割ります。

y[n] = x[n] / mean(abs(x([L R])))

これを行うたびに、ピークが強調され、ノイズが平坦化されます。効果を高めるために複数のパスを実行できます。これらのバンドの幅の選択にはやや敏感ですが、機能します。例えば:

前

2 つのパス:

後

于 2011-07-29T14:46:49.603 に答える
3

実際に必要なのは、データをスケーリングするためのある種の圧縮です。つまり、-2 から 2 の間の値は特定の係数でスケーリングされ、それ以外はすべて別の係数でスケーリングされます。そのようなことを達成するための粗雑な方法は、すべての小さな値をゼロにすることです。つまり、

x = randn(1,100)/2; x(50) = 20; x(25) = -15; % just generating some data
threshold = 2;
smallValues = (abs(x) <= threshold);
y = x;
y(smallValues) = 0;
figure; 
plot(x,'DisplayName','x'); hold on; 
plot(y,'r','DisplayName','y'); 
legend show;

これは非常に非線形な操作であることに注意してください (たとえば、2.1 と 1.9 の値のピークが必要な場合、それらは非常に異なる動作を生成します: 一方が削除され、他方が保持されます)。したがって、表示する場合はこれで十分かもしれませんが、さらに処理する場合は、何をしようとしているかによって異なります。

ここに画像の説明を入力

于 2011-07-29T14:05:37.130 に答える
2

低振幅のピークを除去するには、すべての低振幅信号をノイズと同一視して無視します。

アプリオリな知識がある場合は、それを使用してください。

あなたの信号がaの場合、

a(abs(a)<X) = 0

ここで、X はノイズの最大予想サイズです。

これを「オンザフライ」で見つけたい場合は、kmeans of 3 を使用します。これは統計ツールボックスにあります。

http://www.mathworks.com/help/toolbox/stats/kmeans.html

または、データの絶対値に対して Otsu の方法を使用し、逆符号を使用することもできます。

このスレッドで私が見たこれらおよび他のすべての手法は、後処理を行っていることを前提としていることに注意してください。この処理をリアルタイムで行っている場合は、状況を変える必要があります。

于 2011-07-29T15:33:39.713 に答える