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

fi オブジェクトの作成方法

fi コンストラクターのタイプ

Fixed-Point Designer™ ソフトウェアを使用して、以下のいずれかの方法で fi オブジェクトを作成できます。

  • コンストラクター関数 fi を使用して fi オブジェクトを作成します。

  • 新しい符号付き fi オブジェクトを作成するには、コンストラクター関数 sfi を使用します。

  • 新しい符号なし fi オブジェクトを作成するには、コンストラクター関数 ufi を使用します。

  • 既存の fi オブジェクトをコピーするには、コンストラクター関数 fi のいずれかを使用できます。

まず、既定のデータ型と値 0 をもつ fi オブジェクトを作成します。

a = fi(0)
a =
 
     0


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15

このコンストラクター構文によって、値が 0、語長が 16 ビット、小数部の長さが 15 ビットの符号付き fi オブジェクトが作成されます。fi コンストラクターで fimath オブジェクト プロパティを指定しなかったので、返される fi オブジェクト a にはローカル fimath がありません。

fisfi、および ufi コンストラクターのすべての構文を確認するには、それぞれのリファレンス ページを参照してください。

fi オブジェクトの表示形式の詳細は、固定小数点データの表示を参照してください。

fi オブジェクトの作成例

以下の例は、fi オブジェクトを作成するさまざまな方法を示しています。fi オブジェクトを作成するその他の基本的な例は、以下のコンストラクター関数のリファレンス ページで「例」の節を参照してください。

メモ

fi コンストラクターは NearestRoundingMethodSaturateOverflowAction を使用して fi オブジェクトを作成します。浮動小数点値から fi を作成する場合、RoundingMethod および OverflowAction プロパティの既定の設定は使用されません。

プロパティ名/プロパティ値のペアによる fi オブジェクトの作成

fi オブジェクトを作成するとき、プロパティ名/プロパティ値のペアを使用して、fi および fimath オブジェクト プロパティを設定できます。

a = fi(pi, 'RoundingMethod','Floor', 'OverflowAction','Wrap')
a = 

    3.1415

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

        RoundingMethod: Floor
        OverflowAction: Wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision

fimath オブジェクトのすべてのプロパティを fi コンストラクターで指定する必要はありません。fi オブジェクトは、未指定の fimath オブジェクト プロパティにはすべて既定値を使用します。

  • fi コンストラクターで fimath オブジェクト プロパティを少なくとも 1 つ指定した場合は、fi オブジェクトにローカルの fimath オブジェクトがあります。fi オブジェクトは、残りの未指定の fimath オブジェクト プロパティに既定値を使用します。

  • fi オブジェクト コンストラクターで fimath オブジェクト プロパティを指定しなかった場合、fi オブジェクトは既定の fimath 値を使用します。

numerictype オブジェクトを使用した fi オブジェクトの作成

numerictype オブジェクトを使用して、fi オブジェクトを次のように定義できます。

T = numerictype
T =
 

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15
a = fi(pi, T)
 a =
 
    1.0000


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15

また、fimath オブジェクトを numerictype オブジェクトと共に使用して、fi オブジェクトを定義できます。

F = fimath('RoundingMethod', 'Nearest',...
'OverflowAction', 'Saturate',...
'ProductMode','FullPrecision',...
'SumMode','FullPrecision') 
F =
 
        RoundingMethod: Nearest
        OverflowAction: Saturate
           ProductMode: FullPrecision
               SumMode: FullPrecision
a = fi(pi, T, F)
a =
 
    1.0000


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15

        RoundingMethod: Nearest
        OverflowAction: Saturate
           ProductMode: FullPrecision
               SumMode: FullPrecision

メモ:

構文 a = fi(pi,T,F)a = fi(pi,F,T) と等価です。両方のステートメントで fimath オブジェクトと numerictype オブジェクトを使用して fi オブジェクトを定義できます。

fimath オブジェクトを使用した fi オブジェクトの作成

特定の fimath オブジェクトを使用して fi オブジェクトを作成できます。そのとき、作成した fi オブジェクトにローカルの fimath オブジェクトが割り当てられます。numerictype オブジェクトのどのプロパティも指定しないと、fi オブジェクトの語長は既定の 16 ビットになります。小数部の長さは、次のように最大精度のスケーリングによって決まります。

F = fimath('RoundingMethod', 'Nearest',...
'OverflowAction', 'Saturate',...
'ProductMode','FullPrecision',...
'SumMode','FullPrecision') 
F =
 

             RoundingMethod: Nearest
          OverflowAction: Saturate
           ProductMode: FullPrecision
               SumMode: FullPrecision
F.OverflowAction = 'Wrap'
F =
 

             RoundingMethod: Nearest
          OverflowAction: Wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision
 a = fi(pi, F)
a =
 
    3.1416

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

        RoundingMethod: Nearest
        OverflowAction: Wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision

また、作成時にさまざまな numerictype プロパティを指定する一方で、fimath オブジェクトを使用して fi オブジェクトを作成することもできます。

b = fi(pi, 0, F)
b =
 
    3.1416

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 16
        FractionLength: 14

        RoundingMethod: Nearest
        OverflowAction: Wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision
c = fi(pi, 0, 8, F)
c =
 
    3.1406

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 8
        FractionLength: 6

        RoundingMethod: Nearest
        OverflowAction: Wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision
d = fi(pi, 0, 8, 6, F)
d =
 
    3.1406

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 8
        FractionLength: 6

        RoundingMethod: Nearest
        OverflowAction: wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision

GUI での fi オブジェクト コンストラクターの作成

MATLAB® でファイルを操作するとき、[fi コンストラクターの挿入] ダイアログ ボックスを使用して fi オブジェクト コンストラクターを作成できます。このダイアログ ボックスで fi オブジェクトの値とプロパティを指定した後、事前入力されている fi オブジェクト コンストラクターをファイルの特定の場所に挿入できます。

たとえば、値が pi、語長が 16 ビット、小数部の長さが 13 ビットの符号付き fi オブジェクトを作成するには、以下の手順を実行します。

  1. [ホーム] タブの [ファイル] セクションで、[新規作成][スクリプト] をクリックして MATLAB エディターを開きます。

  2. [エディター] タブの [編集] セクションで、[挿入] ボタン グループの をクリックします。[fi を挿入...] をクリックして [fi コンストラクターの挿入] ダイアログ ボックスを開きます。

  3. エディット ボックスとドロップダウン メニューを使用して、fi オブジェクトの以下のプロパティを指定します。

    • Value = pi

    • Data type mode = Fixed-point:binary point scaling

    • Signedness = Signed

    • Word length = 16

    • Fraction length = 13

  4. ファイルに fi オブジェクト コンストラクターを挿入するには、ファイルの目的の場所にカーソルを置いて、[fi コンストラクターの挿入] ダイアログ ボックスで [OK] をクリックします。[OK] をクリックすると、[fi コンストラクターの挿入] ダイアログ ボックスが閉じて、次のようにファイルに fi オブジェクト コンストラクターが自動的に入力されます。

プロパティの優先順位の決定

プロパティの値は、前回の設定から取得されます。たとえば、Signed プロパティの値が true、小数部の長さが 14numerictype オブジェクトを作成します。

T = numerictype('Signed', true, 'FractionLength', 14)
T =
 

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14        

ここで、次の fi オブジェクトを作成します。結果の fi オブジェクトが符号付きになるように、Signed プロパティの "後"numerictype プロパティを指定します。

a = fi(pi,'Signed',false,'numerictype',T)
a =
 
    1.9999

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14

このコード サンプルの fi オブジェクトを次のコード サンプルの fi オブジェクトと比較してください。次のコード サンプルでは、結果の fi オブジェクトが符号なしになるように、numerictype プロパティが Signed プロパティの "前" に指定されます。

b = fi(pi,'numerictype',T,'Signed',false)
b =
 
    3.1416

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 16
        FractionLength: 14

fi オブジェクトのコピー

fi オブジェクトをコピーするには、次のように代入を使用します。

a = fi(pi)
a =
 
    3.1416

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13
b = a
b =
 
    3.1416

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

型テーブルで使用する fi オブジェクトの作成

アルゴリズムの変数のデータ型を別の型テーブルに維持することで、再利用可能な MATLAB アルゴリズムを記述できます。以下に例を示します。

function T = mytypes(dt)
  switch dt
    case 'double'
      T.b = double([]);
      T.x = double([]);
      T.y = double([]);

     case 'fixed16'
      T.b = fi([],1,16,15);
      T.x = fi([],1,16,15);
      T.y = fi([],1,16,14);
  end
end

手動による固定小数点の変換のベスト プラクティスで説明されているように、アルゴリズム内の変数を型テーブル内のデータ型にキャストします。

function [y,z]=myfilter(b,x,z,T)
  y = zeros(size(x),'like',T.y);
  for n=1:length(x)
    z(:) = [x(n); z(1:end-1)];
    y(n) = b * z;
  end
end

別のテスト ファイル内で、アルゴリズムに供給する入力データを設定し、その入力のデータ型を指定します。

% Test inputs
b = fir1(11,0.25);
t = linspace(0,10*pi,256)';
x = sin((pi/16)*t.^2); 
% Linear chirp

% Cast inputs
T=mytypes('fixed16');
b=cast(b,'like',T.b);
x=cast(x,'like',T.x);
z=zeros(size(b'),'like',T.x);

% Run
[y,z] = myfilter(b,x,z,T);