Main Content

固定小数点演算での fimath プロパティの使用方法

固定小数点演算用の fimath のルール

fimath プロパティは、fi オブジェクトに算術演算を実行するためのルールを定義します。固定小数点算術演算を制御する fimath プロパティは、ローカル fimath オブジェクトまたは fimath 既定値から継承できます。

fi オブジェクトに fimath オブジェクトがあるかどうかを判断するには、関数 isfimathlocal を使用します。

以下の節では、ローカル fimath オブジェクトのある fi オブジェクトと、ローカル fimath をもたない fi オブジェクトとの相互作用について説明します。

二項演算

c = a + b のような二項固定小数点演算には、以下のルールが適用されます。

  • ab のどちらもローカル 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) のような構文を使用すると、abssqrt の演算は fimath オブジェクト F を使用して中間量を計算します。出力 fi オブジェクト b には常にローカル fimath がありません。

連結演算

c = [a b]c = [a;b]c = bitconcat(a,b) などの固定小数点連結演算には、以下のルールが適用されます。

  • 演算では、左端の fi オブジェクトの fimath プロパティによって出力の fi オブジェクト cfimath プロパティが決まります。

たとえば、演算 d = [a b c] の次のシナリオを考えてみます。

  • a がローカル fimath をもたない fi オブジェクトである場合、出力 fi オブジェクト d もローカル fimath をもちません。

  • a にローカル fimath オブジェクトがある場合は、出力の fi オブジェクト d にも同じローカル fimath オブジェクトがあります。

  • afi オブジェクトでない場合、出力の fi オブジェクト d は左から 2 番目の fi オブジェクトの fimath プロパティを継承します。たとえば、b がローカル fimath オブジェクトのある fi オブジェクトの場合、出力の fi オブジェクト d には入力の fi オブジェクト b と同じローカル fimath オブジェクトがあります。

fimath オブジェクトの演算: add、mpy、sub

fimath オブジェクトの演算 addmpy および 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 進小数点専用信号でサポートしています。ツールボックスは、以下の制限付きで [勾配 バイアス] 信号の演算もサポートしています。

  • [勾配 バイアス] 信号は実数でなければなりません。

  • 合計と乗算の演算では、それぞれ制御を行う fimathSumMode プロパティと ProductMode プロパティを 'SpecifyPrecision' に設定しなければなりません。

  • 制御を行う fimathCastBeforeSum プロパティを '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 に設定しなければなりません。* 演算は合計と乗算の両方の演算を実行して結果を計算するため、そうする必要があります。