リダクションビヘイビア

リダクションビヘイビアには、以下のものがあります。

Accumulate_Rolling

移動するウィンドウのリダクションを算出します。

構文:

  • result = Accumulate_Rolling_<reduction function>(input, range)

引数:

  • T result:与えられた範囲に適用するリダクション関数
  • T input:リダクション対象のシグナル
  • double range:一連の範囲

注記:Tは、与えられたリダクション関数がサポートするすべてのタイプが使用できます。

Accumulate_Rolling(input, windowStart)

Accumulate_Rollingビヘイビアは、移動するウィンドウに対してリダクション関数を適用します。windowStartシグナルがウィンドウ(範囲を参照)を指定します。入力シグナルの該当範囲内のサンプルがリダクション関数によりリダクションされ、範囲の終点と同じタイムスタンプを持つ出力サンプルを生成します。

例:

  • 現在までの2秒間の移動平均:

    Accumulate_Rolling_Average(input, Master()-2)

  • 現在までの連続する10サンプル分の移動平均:

    Accumulate_Rolling_Average(input, State_Delay(Master(), 0, 10))

注記:

  • 移動平均ビヘイビアでは、ウィンドウ内のサンプル数に応じてメモリ使用量が増加します。windowStart = 0 とすることは可能ですが、新しいサンプルごとにメモリ使用量が増加するので、入力シグナルによっては非常に大量のメモリを使用することになってしまいます。
  • この機能を正しく動作させるには、範囲の開始時刻が常に厳密に単調増加する必要があります。

Window_Signal

与えられたサイズ("size")のウィンドウを算出します。

構文:

  • Window_Signal_<reduction function>(input, limit)

引数:

  • double result:与えられたサイズの入力の範囲
  • T input:ウィンドウのサイズを決定するためにリダクションされた入力シグナル
  • T limit:演算範囲の、要求されるサイズ("size")

注記:Tは、与えられたリダクション関数がサポートするすべてのタイプが使用できます。

Window_Signal(input, limit)

Window_Signalビヘイビアは、入力サンプルごとに、現在のサンプルで終わる範囲を算出します。範囲のサイズ(つまり開始点)は、範囲内の入力の値にリダクション関数を適用した結果が、指定された限界値 limit にほぼ等しくなるよう決定されます。つまり、リダクション結果が指定の限界値以上になる最小の間隔が求められます。

例として、この結果にAccumulate_Rollingを適用し、ウィンドウ内の実際の累積値を得ることができます。

result = Accumulate_Rolling_<function>(input, Window_Signal_<function>(input, limit))

結果は、限界値と同じ、またはそれより大きくなりますが、測定開始後、サンプル数がまだ不足している間はその限りではありません。

例:

  • CO2排気が常に80グラム以上含まれる移動ウィンドウの作成:

    movingWindow = Window_Signal_Integral(CO2, 80)

    この移動ウィンドウを使用して、CO2排気についてその他のシグナルが正規化されているかを評価することができます。

Accumulate_Prefix

与えられたシグナルについて、開始点から現在のサンプルまでのリダクションを算出します。

構文:

  • result = Accumulate_Prefix_<reduction_function>(input)

引数:

  • T result:開始点から現在のサンプルまでのシグナルのリダクション
  • T input:リダクション対象のシグナル

注記:Tは、与えられたリダクション関数がサポートするすべてのタイプが使用できます。

リダクションビヘイビア Accumulate_Prefix は、与えられたリダクション関数で入力サンプルを積算します。結果は、すべての中間結果を含むシグナルです(例: result[i] = reduce(signal[1], …, signal[i]))。

注記:result = Accumulate_Rolling(signal, -Infinity)となりますが、メモリ使用量は一定です。

Accumulate_Reset

与えられたシグナルについて、最後にリセットされた時から現在のサンプルまでのリダクションを算出します。

構文:

  • result = Accumulate_Reset_<reduction_function>(input, reset)

引数:

  • T result:前回のリセットからの、シグナルのリダクション
  • T input:リダクション対象のシグナル
  • bool reset:true にすると、リダクションが再開されます

注記:Tは、与えられたリダクション関数がサポートするすべてのタイプが使用できます。

リダクションビヘイビア Accumulate_Reset は、与えられたリダクション関数で入力サンプルを積算します。reset 入力を true にすると、リダクションが再開されます。結果は、すべての中間結果を含むシグナルです(例:result[i] = reduce(signal[k], …, signal[i]))。ここで k は、最後にリセットが true であった時のインデックスで、まだ1回も true になっていない場合は1になります。

例:Accumulate_Reset_Maximum

シグナル

リセット

結果

1

false

1

5

false

5

3

false

5

2

true

2

Accumulate_Samples

与えられた数のサンプルの移動リダクションを算出します。

構文:

  • result = Accumulate_Samples_<reduction_function>(input, count)

引数:

  • T result:直前の count 個のサンプルのリダクション

  • T input:リダクション対象のシグナル

  • const int count:リダクションするサンプルの数

注記:Tは、与えられたリダクション関数がサポートするすべてのタイプが使用できます。

関数Accumulate_Samplesは、現在のサンプルまでの count個のサンプルのリダクションを算出します。測定開始後、サンプル数がまだ count に達していない間は、そこまでの全サンプルがリダクションされます。

注記:Accumulate_RollingSample<R>(input, count) = Accumulate_Rolling<R>(input, State_Delay(Master(), -Infinity, count))