Main Content

オーバーフローの検出

この例では、MATLAB® Coder™ アプリを使用したオーバーフローの検出方法について説明します。変換プロセスの数値テストの段階では、スケーリングされた double を使用して固定小数点コードのシミュレーションを実行します。その後、固定小数点データ型をオーバーフローさせる値を生成する生成コード内の式が報告されます。

必要条件

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

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

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

    function y = overflow(b,x,reset)
        if nargin<3, reset = true; end
        persistent z p
        if isempty(z) || reset
            p = 0;
            z = zeros(size(b));
        end
        [y,z,p] = fir_filter(b,x,z,p);
    end
    function [y,z,p] = fir_filter(b,x,z,p)
        y = zeros(size(x));
        nx = length(x);
        nb = length(b);
        for n = 1:nx
            p=p+1; if p>nb, p=1; end
            z(p) = x(n);        
            acc = 0;
            k = p;
            for j=1:nb
                acc = acc + b(j)*z(k);
                k=k-1; if k<1, k=nb; end
            end        
            y(n) = acc;
        end
    end
  2. テスト ファイル overflow_test.m を作成して overflow アルゴリズムの演習を行います。このテスト ファイルを使用して bx および reset の入力の型を定義し、後にアルゴリズムの固定小数点バージョンを確認します。

    function overflow_test
        % The filter coefficients were computed 
        % using the FIR1 function from
        % Signal Processing Toolbox.
        %   b = fir1(11,0.25);
        b = [-0.004465461051254
             -0.004324228005260
             +0.012676739550326
             +0.074351188907780
             +0.172173206073645
             +0.249588554524763
             +0.249588554524763
             +0.172173206073645
             +0.074351188907780
             +0.012676739550326
             -0.004324228005260
             -0.004465461051254]';
        
        % Input signal
        nx = 256;
        t = linspace(0,10*pi,nx)';
    
        % Impulse
        x_impulse = zeros(nx,1); x_impulse(1) = 1;
    
        % Max Gain
        % The maximum gain of a filter will occur when the 
        % inputs line up with the signs of the filter's 
        % impulse response.
        x_max_gain = sign(b)';
        x_max_gain = repmat(x_max_gain,ceil(nx/length(b)),1);
        x_max_gain = x_max_gain(1:nx);
    
        % Sums of sines
        f0=0.1; f1=2;
        x_sines = sin(2*pi*t*f0) + 0.1*sin(2*pi*t*f1);
    
        % Chirp
        f_chirp = 1/16;                  % Target frequency
        x_chirp = sin(pi*f_chirp*t.^2);  % Linear chirp
    
        x = [x_impulse,x_max_gain,x_sines,x_chirp];
        titles = {'Impulse','Max gain','Sum of sines','Chirp'};
        y = zeros(size(x));
    
        for i=1:size(x,2)
            reset = true;
            y(:,i) = overflow(b,x(:,i),reset);
        end
    
        test_plot(1,titles,t,x,y)
    
    end
    function test_plot(fig,titles,t,x,y1)
        figure(fig)
        clf
        sub_plot = 1;
        font_size = 10;
        for i=1:size(x,2)
            subplot(4,1,sub_plot)
            sub_plot = sub_plot+1;
            plot(t,x(:,i),'c',t,y1(:,i),'k')
            axis('tight')
            xlabel('t','FontSize',font_size);
            title(titles{i},'FontSize',font_size);
            ax = gca;
            ax.FontSize = 10;
        end
        figure(gcf)
    end
タイプ名前説明
関数のコードoverflow.mエントリポイントの MATLAB 関数
テスト ファイルoverflow_test.mMATLAB スクリプト。次をテストします。 overflow.m

MATLAB Coder アプリを開く

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

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

ソース ファイルの選択

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

固定小数点変換の有効化

  1. [数値変換][固定小数点に変換] に設定します。

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

    overflow.m のコード違反およびコード生成の準備状態の問題が検査されます。overflow.m には問題は検出されません。

入力の型の定義

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

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

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

  3. [次へ] をクリックして [実行時の問題の確認] ステップに進みます。

実行時の問題の確認

[実行時の問題の確認] ステップでインストルメント化された MEX 関数が生成されます。overflow の呼び出しを生成された MEX 関数の呼び出しで置き換えたうえで、テスト ファイル overflow_test が実行されます。アプリが問題を検出した場合には警告およびエラー メッセージが出力されます。メッセージをクリックするとペイン内の問題のあるコードが強調表示され、ここでコードを編集できます。

  1. [実行時の問題の確認] ページでは、入力の型を定義するために使用したテスト ファイル overflow_test が、アプリによってテスト ファイルのフィールドに入力されます。

  2. [問題の確認] をクリックします。

    アプリは問題を検出しません。

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

固定小数点への変換

  1. コードに含まれる変数についてコンパイルされた情報 (データ型、サイズ、実数/複素数) が表示されます。詳細は、変数情報の表示と変更を参照してください。

    [関数の置き換え] タブに、固定小数点の変換に対応していない関数が表示されます。シミュレーションの実行を参照してください。

  2. fimath 設定を表示するために、[設定] 矢印 をクリックします。fimath の [乗算モード][加算モード][最下位ビットを保持] に設定します。これらの設定は C 言語の整数演算の動作をモデル化します。

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

    テスト ファイル overflow_test が実行されます。[変数] タブにシミュレーションの最小範囲と最大範囲が表示されます。ソフトウェアは、シミュレーション範囲のデータを使用し、既定の型推奨の設定に基づき固定小数点の型を変数ごとに推奨し、[推奨された型] 列に表示します。

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

    推奨された型がソフトウェアによって検証され、エントリポイント関数の固定小数点バージョンが生成されます。

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

数値のテストとオーバーフローの確認

  1. [テスト] 矢印 をクリックします。テスト ファイルが overflow_test.m であることを確認します。[スケーリングされた double を使用してオーバーフローを検出] を選択し、[テスト] をクリックします。

    入力型を定義するために使用したテスト ファイルが実行され、固定小数点 MATLAB コードがテストされます。オーバーフローを検出するように選択したので、推奨された固定小数点型のスケーリングされた double のバージョンを使用してシミュレーションが実行されます。スケーリングされた double は、倍精度浮動小数点のデータを格納するため、演算を全範囲で実行します。固定小数点設定が維持されるため、計算が固定小数点型の範囲から外れた場合に報告できます。

    シミュレーションが実行されます。アプリによってオーバーフローが検出されます。[オーバーフロー] タブにオーバーフローが報告されます。オーバーフローした式を強調表示するには、そのオーバーフローをクリックします。

  2. オーバーフローしたのが加算か乗算かを判断します。

    [fimath] の設定で、[乗算モード][FullPrecision] に設定し、変換を繰り返して固定小数点モードを再度テストします。

    オーバーフローが継続して発生し、式の加算でオーバーフローしていることが示されます。