Main Content

派生範囲に基づくデータ型の推奨

この例では、固定小数点コンバーター アプリを使用して静的範囲に基づいて固定小数点データ型を推奨する方法を示します。派生範囲に基づいてデータ型を推奨すると、操作範囲全体でアルゴリズムを実行するテスト ファイルを用意する必要がなくなります。一般に、このようなテスト ファイルの実行には時間がかかります。代わりに範囲を派生させることで時間を節約できます。

メモ

派生範囲の解析は非スカラー変数ではサポートされていません。

必要条件

この例には次の製品が必要です。

新規フォルダーの作成と関連ファイルのコピー

  1. ローカルの書き込み可能なフォルダーに、関数 dti.m を作成します。

    関数 dti は MATLAB の Discrete Time Integrator を実装します。

    function [y, clip_status] = dti(u_in) %#codegen
    % Discrete Time Integrator in MATLAB
    %  
    % Forward Euler method, also known as Forward 
    % Rectangular, or left-hand approximation. 
    % The resulting expression for the output of 
    % the block at step 'n' is 
    % y(n) = y(n-1) + K * u(n-1)
    %
    
    init_val = 1;  
    gain_val = 1;
    limit_upper = 500;
    limit_lower = -500;
    
    % Variable to hold state between 
    % consecutive calls to this block
    persistent u_state;
    if isempty(u_state)
        u_state = init_val+1;
    end 
    
    % Compute Output
    if (u_state > limit_upper)
        y = limit_upper;
        clip_status = -2;
    elseif (u_state >= limit_upper)
        y = limit_upper;
        clip_status = -1;
    elseif (u_state < limit_lower)
    	y = limit_lower;
        clip_status = 2;
    elseif (u_state <= limit_lower)
    	y = limit_lower;
        clip_status = 1;   
    else        
        y = u_state;
        clip_status = 0;
    end
    
    % Update State
    tprod = gain_val * u_in;
    u_state = y + tprod;
    
  2. テスト ファイル dti_test.m を作成して dti アルゴリズムの演習を行います。

    このテスト スクリプトは正弦波入力を使用して関数 dti を実行します。その後、スクリプトは入力および出力信号をプロットします。

    % dti_test
    % cleanup
    clear dti
    
    % input signal
    x_in = sin(2.*pi.*(0:0.001:2)).';
    
    pause(10);
    
    len = length(x_in);
    y_out = zeros(1,len);
    is_clipped_out = zeros(1,len);
    
    for ii=1:len
        data = x_in(ii);
        % call to the dti function
        init_val = 0;
        gain_val = 1;
        upper_limit = 500;
        lower_limit = -500;
        
        % call to the design that does DTI
        [y_out(ii), is_clipped_out(ii)] = dti(data);
        
    end
    
    figure('Name', [mfilename, '_plot']);
    subplot(2,1,1)
    plot(1:len,x_in)
    xlabel('Time')
    ylabel('Amplitude')
    title('Input Signal (Sin)')
    
    subplot(2,1,2)
    plot(1:len,y_out)
    xlabel('Time')
    ylabel('Amplitude')
    title('Output Signal (DTI)')
    
    disp('Test complete.');

次のような事前処理と事後処理を行う別のテスト スクリプトを作成することをお勧めします。

  • 入力の読み込み

  • 入力値の設定

  • テスト結果の出力

タイプ名前説明
関数のコードdti.mエントリポイントの MATLAB 関数
テスト ファイルdti_test.mMATLAB スクリプト。次をテストします。 dti.m

固定小数点コンバーター アプリを開く

  1. この例で使用するファイルを含む作業フォルダーに移動します。

  2. MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、アプリ アイコンをクリックします。

ソース ファイルの選択

  1. プロジェクトにエントリポイント関数 dti を追加するために、ファイル dti.m を探して [開く] をクリックします。既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの dti.prj というファイルに保存します。

  2. [次へ] をクリックして [入力の型を定義] ステップに進みます。

    dti.m のコード違反および固定小数点変換の準備状態の問題が検査されます。dti.m には問題は検出されません。

入力の型の定義

  1. [入力の型を定義] ページで、dti_test をテスト ファイルとして追加するために dti_test.m を選択して [開く] をクリックします。

  2. [入力の型の自動定義] をクリックします。

    テスト ファイルが実行されます。アプリはテスト ファイルから、u_in の入力型を double(1x1) とすることを決定します。

  3. [次へ] をクリックして [固定小数点に変換] ステップに進みます。

固定小数点への変換

  1. エントリポイント MATLAB 関数用にインストルメント化された MEX 関数がアプリによって生成されます。コードに含まれる変数についてコンパイルされた情報 (データ型、サイズ、実数/複素数) が表示されます。詳細は、変数情報の表示と変更を参照してください。

    関数が固定小数点変換に対応していない場合、それらが [関数の置き換え] タブに表示されます。

  2. [解析] 矢印 をクリックします。

    1. [派生範囲の解析を使用した範囲の解析] を選択します。

    2. [シミュレーションを使用した範囲の解析] チェック ボックスをオフにします。

    派生範囲の解析を使用するには、設計範囲が必要です。

  3. [固定小数点に変換] ページの [変数] タブで、入力 u_in に対して [静的最小値] を選択して -1 に設定します。[静的最大値]1 に設定します。

    派生範囲情報を計算するには、すべての入力変数の静的最小値および最大値または推奨されたデータ型を少なくとも指定しなければなりません。

    メモ

    手動で静的範囲を入力する場合、これらの手動で入力した範囲はシミュレーション範囲よりも優先されます。アプリは、手動で入力した範囲を使用してデータ型を推奨します。推奨された型を変更およびロックすることもできます。

  4. [解析] をクリックします。

    範囲解析によって派生範囲が計算され、[変数] タブに表示されます。これらの派生範囲を使用して、既定の型推奨設定に基づく固定小数点型が変数ごとに推奨されます。推奨されるデータ型が [推奨された型] に表示されます。

    関数 dti で、出力 clip_status の最小値は -2、最大値は 2 です。

    % Compute Output
    if (u_state > limit_upper)
        y = limit_upper;
        clip_status = -2;
    elseif (u_state >= limit_upper)
        y = limit_upper;
        clip_status = -1;
    elseif (u_state < limit_lower)
    	y = limit_lower;
        clip_status = 2;
    elseif (u_state <= limit_lower)
    	y = limit_lower;
        clip_status = 1;   
    else        
        y = u_state;
        clip_status = 0;
    end
    

    範囲を派生させると、アプリによって関数が解析され、次のような clip_status の最小値と最大値が計算されます。

    このアプリでは、[派生範囲のクイック解析] オプションを選択できるほか、解析に長い時間がかかる場合にタイムアウトを指定するオプションもあります。派生範囲の計算を参照してください。

  5. 浮動小数点アルゴリズムを固定小数点に変換するには、[変換] をクリックします。

    固定小数点の変換プロセスでは、推奨された型がソフトウェアによって検証され、ローカル作業フォルダー内の codegen\dti\fixpt フォルダーに次のファイルが生成されます。

    • dti_fixpt.mdti.m の固定小数点バージョン。

    • dti_wrapper_fixpt.m — このファイルは、テスト ファイルにより入力された浮動小数点データ値を、変換時に入力用に指定された固定小数点型に変換します。これらの固定小数点の値は変換された固定小数点設計 dti_fixpt.m に入力されます。

    • dti_fixpt_report.html — このレポートは、生成された固定小数点コードと固定小数点のインストルメンテーションの結果を表示します。

    • dti_report.html — このレポートは、元のアルゴリズムと固定小数点のインストルメンテーションの結果を表示します。

    • dti_fixpt_args.mat — 入力引数用の構造体、出力引数用の構造体および固定小数点ファイルの名前を含む MAT ファイル。

    検証中にエラーまたは警告が発生した場合、それらは [出力] タブに表示されます。型の検証を参照してください。

  6. [出力ファイル] リストで、dti_fixpt.m を選択します。生成された固定小数点コードがアプリによって表示されます。

  7. シミュレーション データ インスペクターを使用して浮動小数点と固定小数点の結果をプロットします。

    1. [設定] 矢印 をクリックします。

    2. [プロットとレポート] 設定を展開して [シミュレーション データ インスペクターを用いてプロット][はい] に設定します。

    3. [テスト] 矢印 をクリックします。[比較プロット用の入力と出力を記録] を選択します。[テスト] をクリックします。

      入力型を定義するために使用したテスト ファイルが実行され、固定小数点 MATLAB コードがテストされます。オプションでテスト ファイルを追加し、数値のテスト用に 1 つを超えるテスト ファイルを実行することを選択できます。浮動小数点と固定小数点の両方のシミュレーションが実行され、出力変数 y の誤差が計算されます。比較プロット用の入力と出力の記録と、プロットにシミュレーション データ インスペクターを使用することを選択したため、シミュレーション データ インスペクターが開きます。

    4. シミュレーション データ インスペクターを使用して、浮動小数点と固定小数点の実行情報の表示や結果の比較を行うことができます。たとえば出力 y の浮動小数点の値と固定小数点の値を比較するには、[y] を選択します。[比較] をクリックします。[ベースライン] を元の実行に、[比較対象] をコンバーターの実行に設定します。[比較] をクリックします。

      シミュレーション データ インスペクターは、ベースラインの浮動小数点の実行と固定小数点の実行のプロットおよびそれらの差を表示します。

  8. [検証の出力] タブに、固定小数点レポートへのリンクが表示されます。

    レポートを開くために dti_fixpt_report.html リンクをクリックします。

  9. [次へ] をクリックして [ワークフローの完了] ページに進みます。

    [ワークフローの完了] ページでは、プロジェクトのサマリーと生成された出力ファイルへのリンクが表示されます。

固定小数点コードの統合

固定小数点バージョンのコードをシステムレベルのシミュレーションに統合するために、MEX 関数を生成して固定小数点アルゴリズムを高速化します。元の MATLAB アルゴリズムの代わりにこの MEX 関数を呼び出します。

  1. dti_fixpt.m をローカル作業フォルダーにコピーします。

  2. 入力引数の fimath プロパティを取得するには、dti_fixpt.m 内の関数 get_fimath を確認します。

    function fm = get_fimath()
    	fm = fimath('RoundingMethod','Floor',...
            'OverflowAction','Wrap', ...
            'ProductMode','FullPrecision', ...
            'MaxProductWordLength',128,...
            'SumMode','FullPrecision',...
            'MaxSumWordLength',128);
    end
    

  3. 入力 u_in の固定小数点データ型を取得するには、型推奨レポートを確認します。

  4. dti_fixpt.m の MEX 関数を生成します。

    fm = fimath('RoundingMethod','Floor',...
        'OverflowAction','Wrap',...
        'ProductMode','FullPrecision',...
        'MaxProductWordLength',128,...
        'SumMode','FullPrecision',...
        'MaxSumWordLength',128);
    fiaccel dti_fixpt -args {fi(0,1,16,14,fm)}

    fiaccel は現在のフォルダーに MEX 関数 dti_fixpt_mex を生成します。

  5. これで、元の MATLAB アルゴリズムの代わりにこの MEX 関数を呼び出すことができます。