Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

フィルター アルゴリズムでの可変サイズ信号の使用

例について

この例では、可変サイズ ベクトルを使ってホワイト ノイズ信号の値を格納します。信号の値は関数によって次のように間引きされるので、ベクトルのサイズは実行時に変化する可能性があります。

  • 指定された許容誤差内で互いに等価と見なされる信号の値を除去する。

  • 信号の値を 2 つずつ平均して、その結果の平均値のみを出力する。

Simulink モデル

MATLAB® コマンド プロンプトで「emldemo_process_signal」と入力して、サンプル モデルを開きます。このモデルには次のブロックが含まれています。

Simulink® ブロック説明
Band-Limited White Noiseホワイト ノイズの信号源として、一連の正規分布の乱数値を生成します。
MATLAB Function uniquify互いの指定された許容誤差内と見なされない信号値を除去します。
MATLAB Function avg指定された数の一意信号値を平均した値を出力します。
Unique values関数 uniquify が出力する重複しない信号値を表示するスコープ。
平均値関数 avg が出力する平均信号値を表示するスコープ。

ソース信号

帯域幅を制限したホワイト ノイズには次のプロパティがあります。

ノイズ パワー値のサイズがその信号値を入れる配列のサイズを定義します。この配列は、double 値の 1 行 9 列のベクトルです。

MATLAB Function ブロック: uniquify

このブロックは、互いの値が許容誤差 0.2 以内にない信号値を除去します。コードは、次のとおりです。

function y = uniquify(u) %#codegen
y = emldemo_uniquetol(u,0.2);

関数 uniquify は外部 MATLAB 関数 emldemo_uniquetol を呼び出して、信号値をフィルター処理します。uniquify は 1 行 9 列のホワイト ノイズ信号値のベクトルを 1 番目の引数として、許容誤差を 2 番目の引数として渡します。emldemo_uniquetol のコードは、次のとおりです。

function B = emldemo_uniquetol(A,tol) %#codegen

A = sort(A);
coder.varsize('B',[1 100]);
B = A(1);
k = 1;
for i = 2:length(A)
    if abs(A(k) - A(i)) > tol
        B = [B A(i)];
        k = i;
    end
end

emldemo_uniquetolA をフィルター処理した値を出力ベクトル B に入れて戻します。すべての ij に対して abs(B(i) - B(j)) > tol になります。Simulink が Band-Limited White Noise ブロックをサンプリングするたびに、一連の乱数値が生成されて A に入ります。その結果、emldemo_uniquetol が生成する B の出力信号の数は、呼び出されるたびに異なる可能性があります。B の要素数を可変にするために、emldemo_uniquetol はそれを明示的な上限をもつ可変サイズのデータとして宣言します。

coder.varsize('B',[1 100]);

上の文では、coder.varsizeB をベクトルとして宣言し、1 番目の次元は 1 に固定され、2 番目の次元は最大サイズ 100 まで拡張できることを示しています。したがって、emldemo_uniquetol から返される値を Unique values スコープに渡すことができるように、uniquify ブロックの出力 y も可変サイズでなければなりません。y のプロパティは次のようになります。

可変サイズの出力には、ここで [1 9] と示しているように、明示的にサイズと上限を指定しなければなりません。

MATLAB Function ブロック: avg

このブロックは、uniquify ブロックによってフィルター処理された信号値を次のように平均化します。

信号値の数MATLAB Function ブロック
> 1 および 2 の倍数値の連続するペアをすべて平均化します。
> 1 および 2 の倍数でない数最初の (最小) 値を削除し、残りの連続するペアを平均化します。
= 1未変更値を返します。

avg 関数は、結果を Average values スコープに出力します。コードは、次のとおりです。

function y = avg(u) %#codegen

if numel(u) == 1
    y = u;
else
    k = numel(u)/2;
    if k ~= floor(k)
        u = u(2:numel(u));
    end
    y = emldemo_navg(u,2);
end

avg の入力 u と出力 y は両方とも可変サイズ ベクトルとして宣言されています。これは uniquify function ブロックが信号値をフィルター処理するので要素数が変化するからです。入力 u のサイズは uniquify の出力から継承されます。

関数 avg は外部 MATLAB 関数 emldemo_navg を呼び出して 2 つの連続する信号値すべての平均を計算します。emldemo_navg のコードは、次のとおりです。

function B = emldemo_navg(A,n) %#codegen

assert(n>=1 && n<=numel(A));

B = zeros(1,numel(A)/n);
k = 1;
for i = 1 : numel(A)/n
     B(i) = mean(A(k + (0:n-1)));
     k = k + n;
end

可変サイズの結果

モデルのシミュレーションを実行すると次のような結果が出力されます。

  • uniquify ブロックは実行されるたびに異なる数の信号値を出力します。

  • avg ブロックは実行されるごとに異なった数の信号値を出力します。一意値数のほぼ半数になります。

参考

関連するトピック