固定小数点演算での 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: 13a.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: Doubleb = fi(27, 'DataType', 'double')
b =
27
DataTypeMode: Doublea + b
ans =
30
DataTypeMode: Doublec = fi(12, 'DataType', 'single')
c =
12
DataTypeMode: Singlea + 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: 13b = 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: 12a + 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: truea = 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: trueb = 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: truea + 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: trueSumMode プロパティと ProductMode プロパティを SpecifyPrecision に設定する操作は相互排他的です。ただし、行列間で * 演算を実行する場合を除きます。この場合は、[傾きバイアス] 信号の SumMode プロパティと ProductMode プロパティの両方を SpecifyPrecision に設定しなければなりません。* 演算は合計と乗算の両方の演算を実行して結果を計算するため、そうする必要があります。