メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

dsp.MedianFilter

R2026a

メディアン フィルター

説明

dsp.MedianFilter System object™ は、時間の経過に沿って入力信号の移動中央値を各チャネルで個別に計算します。このオブジェクトでは、スライディング ウィンドウ法を使用して移動中央値を計算します。この手法では、各チャネル上で指定の長さのウィンドウをサンプルごとに移動させ、ウィンドウ内のデータの中央値をオブジェクトで計算します。詳細については、アルゴリズムを参照してください。

dsp.MedianFilter オブジェクトと movmedian 関数はどちらも入力信号の移動中央値を計算します。ただ、オブジェクトは大量のリアルタイム データ ストリームを処理し、システム状態を自動的に処理することができます。関数は、すぐに利用可能かつシステム状態を処理できないデータに対して 1 回限りの計算を実行します。両者の比較については、System object と MATLAB 関数を参照してください。

入力の移動中央値を計算するには、次のようにします。

  1. dsp.MedianFilter オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

medFilt = dsp.MedianFilter は、既定のプロパティを使用して、メディアン フィルター オブジェクト medFilt を返します。

medFilt = dsp.MedianFilter(Len) は WindowLength プロパティを Len に設定します。

例

medFilt = dsp.MedianFilter(Name,Value) は Name,Value のペアを使用して WindowLength プロパティを指定します。

例:

movMin = dsp.MedianFilter('WindowLength',5);

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

サンプルのスライディング ウィンドウの長さ。正のスカラー整数として指定します。

使用法

説明

y = medFilt(x) は、スライディング ウィンドウ法を使用して、入力信号 x の移動中央値を計算します。

例

入力引数

すべて展開する

データ入力。ベクトルまたは行列として指定します。x が行列の場合、各列が個別のチャネルとして扱われます。移動中央値は各チャネルに沿って計算されます。オブジェクトはマルチチャネル入力、つまり m 行 n 列 (m ≥ 1、n > 1) のサイズの入力を受け入れます。ここで、m は各フレーム (またはチャネル) のサンプルの数で、n はチャネルの数です。

オブジェクトは可変サイズの入力も受け入れます。オブジェクトがロックされると、各入力チャネルのサイズは変更できますが、チャネルの数は変更できません。

データ型: single | double

出力引数

すべて展開する

フィルター処理された信号。ベクトルまたは行列として返されます。出力のサイズとデータ型は入力のサイズとデータ型と一致します。

データ型: single | double

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

例

すべて折りたたむ

メディアン フィルターを使用し、ノイズを含む正弦波信号から高周波数ノイズをフィルター処理します。メディアン フィルターのパフォーマンスを平均化フィルターと比較します。

初期化

dsp.MedianFilter オブジェクト medFilt と dsp.MovingAverage オブジェクト movavgWin を設定します。これらのオブジェクトはウィンドウの長さ 7 のスライディング ウィンドウを使用します。出力を表示するための時間スコープを作成します。

Fs = 1000;
medFilt = dsp.MedianFilter(7);
movavgWin = dsp.MovingAverage(7);
scope  = timescope('SampleRate',Fs,...
    'TimeSpanSource','Property',...
    'TimeSpanOverrunAction','Scroll',...
    'TimeSpan',1,'ShowGrid',true,...
    'YLimits',[-3 3],...
    'LayoutDimensions',[3 1],...
    'NumInputPorts',3);
scope.ActiveDisplay = 1;
scope.Title = 'Signal + Noise';
scope.ActiveDisplay = 2;
scope.Title = 'Moving Average Output (Window Length = 7)';
scope.ActiveDisplay = 3;
scope.Title = 'Median Filter Output (Window Length = 7)';

FrameLength = 256;
count = 1;
sine = dsp.SineWave('SampleRate',Fs,'Frequency',10,...
    'SamplesPerFrame',FrameLength);

ノイズを含む正弦波のフィルター処理

周波数が 10 Hz のノイズを含む正弦波信号を生成します。メディアン フィルターと移動平均オブジェクトを信号に適用します。時間スコープの出力を表示します。

for i = 1:500
    hfn = 3 * (rand(FrameLength,1) < 0.02);
    x = sine() + 1e-2 * randn(FrameLength,1) + hfn;
    y1 = movavgWin(x);
    y2 = medFilt(x);
    scope(x,y1,y2);
end

メディアン フィルターは、移動平均オブジェクトよりも効果的に高周波ノイズを除去します。

この例では、dsp.MedianFilter System object を使用して、ストリーミング信号から高周波数の外れ値を除去する方法を説明します。

dsp.MatFileReader System object を使用してジャイロスコープの MAT ファイルを読み取ります。ジャイロスコープの MAT ファイルには 3 列のデータが格納されています。各列には 7140 サンプルが含まれます。3 列はジャイロスコープのモーション センサーからの "X" 軸、"Y" 軸および "Z" 軸を表します。データの各列に含まれるフレーム数が 10 になるようにフレーム サイズ 714 サンプルを選択します。dsp.MedianFilter System object はウィンドウの長さ 10 を使用します。timescope オブジェクトを作成してフィルター処理された出力を表示します。

reader = dsp.MatFileReader('SamplesPerFrame',714,...
    'Filename','LSM9DS1gyroData73.mat',...
    'VariableName','data');
medFilt = dsp.MedianFilter(10);
scope = timescope('NumInputPorts',1,...
    'SampleRate',119,...
    'YLimits',[-300 300],...
    'ChannelNames',{'Input','Filtered Output'},...
    'TimeSpanSource','Property',...
    'TimeSpan',60,'ShowLegend',true);

dsp.MedianFilter System object を使用して、ジャイロスコープ データをフィルター処理します。フィルター処理された "Z" 軸データを時間スコープに表示します。

for i = 1:10
    gyroData = reader();
    filteredData = medFilt(gyroData);
    scope([gyroData(:,3),filteredData(:,3)]);
end

元のデータにはいくつかの外れ値が含まれています。データを拡大し、メディアン フィルターによってすべての外れ値が除去されることを確認します。

アルゴリズム

すべて展開する

参照

[1] Bodenham, Dean. “Adaptive Filtering and Change Detection for Streaming Data.” PH.D. Thesis. Imperial College, London, 2012.

拡張機能

すべて展開する

バージョン履歴

R2016b で導入