固定小数点演算での fimath プロパティの使用方法
固定小数点演算用の fimath のルール
fimath
プロパティは、fi
オブジェクトに算術演算を実行するためのルールを定義します。固定小数点算術演算を制御する fimath
プロパティは、ローカル fimath
オブジェクトまたは fimath
既定値から継承できます。
fi
オブジェクトに fimath
オブジェクトがあるかどうかを判断するには、関数 isfimathlocal
を使用します。
以下の節では、ローカル fimath
オブジェクトのある fi
オブジェクトと、ローカル fimath をもたない fi
オブジェクトとの相互作用について説明します。
二項演算
c = a + b
のような二項固定小数点演算には、以下のルールが適用されます。
a
とb
のどちらもローカル fimath をもたない場合、既定の fimath 値を使用して固定小数点演算が実行されます。出力fi
オブジェクトc
にはローカル fimath がありません。a
またはb
のどちらかにローカルfimath
オブジェクトがある場合は、そのfimath
オブジェクトを使用して固定小数点演算が実行されます。出力のfi
オブジェクトc
には、入力と同じローカルfimath
オブジェクトがあります。
単項演算
b = abs(a)
のような単項固定小数点演算には、以下のルールが適用されます。
a
がローカル fimath をもたない場合、既定の fimath 値を使用して固定小数点演算が実行されます。出力fi
オブジェクトb
はローカル fimath をもちません。a
にローカルfimath
オブジェクトがある場合は、そのfimath
オブジェクトを使用して固定小数点演算が実行されます。出力のfi
オブジェクトb
には、入力のa
と同じローカルfimath
オブジェクトがあります。
単項固定小数点演算の関数呼び出しで fimath
オブジェクトを指定した場合は、指定した fimath
オブジェクトを使用して固定小数点演算が実行されます。たとえば、b = abs(a,F)
や b = sqrt(a,F)
のような構文を使用すると、abs
と sqrt
の演算は fimath
オブジェクト F
を使用して中間量を計算します。出力 fi
オブジェクト b
には常にローカル fimath がありません。
連結演算
c = [a b]
、c = [a;b]
、c = bitconcat(a,b)
などの固定小数点連結演算には、以下のルールが適用されます。
演算では、左端の
fi
オブジェクトのfimath
プロパティによって出力のfi
オブジェクトc
のfimath
プロパティが決まります。
たとえば、演算 d = [a b c]
の次のシナリオを考えてみます。
a
がローカル fimath をもたないfi
オブジェクトである場合、出力fi
オブジェクトd
もローカル fimath をもちません。a
にローカルfimath
オブジェクトがある場合は、出力のfi
オブジェクトd
にも同じローカルfimath
オブジェクトがあります。a
がfi
オブジェクトでない場合、出力のfi
オブジェクトd
は左から 2 番目のfi
オブジェクトのfimath
プロパティを継承します。たとえば、b
がローカルfimath
オブジェクトのあるfi
オブジェクトの場合、出力のfi
オブジェクトd
には入力のfi
オブジェクトb
と同じローカルfimath
オブジェクトがあります。
fimath オブジェクトの演算: add、mpy、sub
fimath
オブジェクトの演算 add
、mpy
および sub
の出力は、常にローカル fimath をもちません。演算では、関数呼び出しで指定した fimath
オブジェクトが使用されますが、出力の fi
オブジェクトにはローカル fimath
オブジェクトがありません。
MATLAB Function ブロックの演算
MATLAB Function ブロックで実行される固定小数点演算は、MATLAB® で実行される固定小数点演算と同じ規則を使用します。
fi
オブジェクトとして扱う MATLAB Function ブロックへのすべての入力信号は、[MATLAB Function ブロックの fimath] パラメーターに指定する値に関連付けられます。このパラメーターを [MATLAB と同じ]
に設定すると、fi
オブジェクトはローカル fimath をもちません。[MATLAB Function ブロックの fimath] パラメーターを [それ以外を指定]
に設定すると、MATLAB Function ブロックのすべての fi
オブジェクトに独自の fimath
プロパティ セットを定義できます。固定小数点の入力信号のみを fi
オブジェクトとして扱うか、固定小数点と整数の両方の入力信号を fi
オブジェクトとして扱うかを選択できます。MATLAB Function ブロック内での fimath オブジェクトの使用を参照してください。
2 進小数点演算
fimath
オブジェクトは Fixed-Point Designer™ ソフトウェアの演算プロパティをカプセル化します。
fi
コンストラクターで fimath
プロパティを明示的に指定した場合にのみ、fi
オブジェクトにローカル fimath
オブジェクトがあります。sfi
または ufi
コンストラクターを使用する場合や、fi
コンストラクターで fimath
プロパティを指定しない場合は、返される fi
オブジェクトにローカル fimath が存在しないため、既定の fimath 値を使用します。
a = fi(pi)
a = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
a.fimath isfimathlocal(a)
ans = RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision ans = logical 0
+
、-
、.*
、または *
を使用して、ローカル fimath
オブジェクトがある 2 つの fi
オペランドで演算を実行するには、ローカル fimath
オブジェクトが同一でなければなりません。fi
オペランドのいずれかがローカル fimath
をもたない場合、これら 2 つのオペランドの fimath
プロパティを同一にする必要はありません。詳細は、固定小数点演算用の fimath のルールを参照してください。
a = fi(pi); b = fi(8); isequal(a.fimath, b.fimath)
ans = logical 1
a + b
ans = 11.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 19 FractionLength: 13
+
、-
、.*
、または *
を使用して演算を実行するには、2 つの fi
オペランドのデータ型も同じでなければなりません。たとえば、データ型が double
の 2 つの fi
オブジェクトを加算できますが、データ型が double
のオブジェクトとデータ型が single
のオブジェクトは加算できません。
a = fi(3, 'DataType', 'double')
a = 3 DataTypeMode: Double
b = fi(27, 'DataType', 'double')
b = 27 DataTypeMode: Double
a + b
ans = 30 DataTypeMode: Double
c = fi(12, 'DataType', 'single')
c = 12 DataTypeMode: Single
a + c
Error using + (line 24) Math operations are not allowed on fi objects with different data types.
固定小数点 fi
オブジェクトのオペランドは同じスケーリングでなくてもかまいません。固定小数点データ型の fi
オブジェクトとスケーリングされた double データ型の fi
オブジェクトでは二項演算を実行できます。この意味で、スケーリングされた double データ型は固定小数点データ型の役割を果たします。
a = fi(pi)
a = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
b = fi(magic(2), ... 'DataTypeMode', 'Scaled double: binary point scaling')
b = 1 3 4 2 DataTypeMode: Scaled double: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 12
a + b
ans = 4.1416 6.1416 7.1416 5.1416 DataTypeMode: Scaled double: binary point scaling Signedness: Signed WordLength: 18 FractionLength: 13
スケーリングが double、single、または 2 進小数点専用の fi
オブジェクトを使用して除算を実行するには、関数 divide
を使用します。
[勾配 バイアス] 演算
Fixed-Point Designer ソフトウェアは、ローカル fimath
オブジェクトまたは既定の fimath を使用した固定小数点演算をすべての 2 進小数点専用信号でサポートしています。ツールボックスは、以下の制限付きで [勾配 バイアス] 信号の演算もサポートしています。
[勾配 バイアス] 信号は実数でなければなりません。
合計と乗算の演算では、それぞれ制御を行う
fimath
のSumMode
プロパティとProductMode
プロパティを'SpecifyPrecision'
に設定しなければなりません。制御を行う
fimath
のCastBeforeSum
プロパティを'true'
に設定しなければなりません。Fixed-Point Designer は [勾配 バイアス] 信号の関数
divide
をサポートしていません。
f = fimath('SumMode', 'SpecifyPrecision', ... 'SumFractionLength', 16)
f = RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: SpecifyPrecision SumWordLength: 32 SumFractionLength: 16 CastBeforeSum: true
a = fi(pi, 'fimath', f)
a = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: SpecifyPrecision SumWordLength: 32 SumFractionLength: 16 CastBeforeSum: true
b = fi(22, true, 16, 2^-8, 3, 'fimath', f)
b = 22 DataTypeMode: Fixed-point: slope and bias scaling Signedness: Signed WordLength: 16 Slope: 0.00390625 Bias: 3 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: SpecifyPrecision SumWordLength: 32 SumFractionLength: 16 CastBeforeSum: true
a + b
ans = 25.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 32 FractionLength: 16 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: SpecifyPrecision SumWordLength: 32 SumFractionLength: 16 CastBeforeSum: true
SumMode
プロパティと ProductMode
プロパティを SpecifyPrecision
に設定する操作は相互排他的です。ただし、行列間で *
演算を実行する場合を除きます。この場合は、[勾配 バイアス] 信号の SumMode
プロパティと ProductMode
プロパティの両方を SpecifyPrecision
に設定しなければなりません。*
演算は合計と乗算の両方の演算を実行して結果を計算するため、そうする必要があります。