オーバーフローの検出
この例では、MATLAB® Coder™ アプリを使用したオーバーフローの検出方法について説明します。変換プロセスの数値テストの段階では、スケーリングされた double を使用して固定小数点コードのシミュレーションを実行します。その後、固定小数点データ型をオーバーフローさせる値を生成する生成コード内の式が報告されます。
必要条件
この例には次の製品が必要です。
MATLAB
MATLAB Coder
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラ を参照してください。
mex -setup
を使用して既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
新規フォルダーの作成と関連ファイルのコピー
ローカルの書き込み可能なフォルダーに、関数
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
テスト ファイル
overflow_test.m
を作成してoverflow
アルゴリズムの演習を行います。このテスト ファイルを使用してb
、x
および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.m | MATLAB スクリプト。次をテストします。 overflow.m |
MATLAB Coder アプリを開く
この例のファイルを含む作業フォルダーに移動します。
MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、アプリ アイコンをクリックします。
ソース ファイルの選択
プロジェクトにエントリポイント関数 overflow
を追加するために、ファイル overflow.m
を探して [開く] をクリックします。既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの overflow.prj
というファイルに保存します。
固定小数点変換の有効化
[数値変換] を
[固定小数点に変換]
に設定します。[次へ] をクリックして [入力の型を定義] ステップに進みます。
overflow.m
のコード違反およびコード生成の準備状態の問題が検査されます。overflow.m
には問題は検出されません。
入力の型の定義
[入力の型を定義] ページで、
overflow_test
をテスト ファイルとして追加するためにoverflow_test.m
を選択して [開く] をクリックします。[入力の型の自動定義] をクリックします。
テスト ファイルが実行されます。アプリはテスト ファイルから、
b
の入力型をdouble(1x12)
、x
をdouble(256x1)
、reset
をlogical(1x1)
とすることを決定します。[次へ] をクリックして [実行時の問題の確認] ステップに進みます。
実行時の問題の確認
[実行時の問題の確認] ステップでインストルメント化された MEX 関数が生成されます。overflow
の呼び出しを生成された MEX 関数の呼び出しで置き換えたうえで、テスト ファイル overflow_test
が実行されます。アプリが問題を検出した場合には警告およびエラー メッセージが出力されます。メッセージをクリックするとペイン内の問題のあるコードが強調表示され、ここでコードを編集できます。
[実行時の問題の確認] ページでは、入力の型を定義するために使用したテスト ファイル
overflow_test
が、アプリによってテスト ファイルのフィールドに入力されます。[問題の確認] をクリックします。
アプリは問題を検出しません。
[次へ] をクリックして [固定小数点に変換] ステップに進みます。
固定小数点への変換
コードに含まれる変数についてコンパイルされた情報 (データ型、サイズ、実数/複素数) が表示されます。詳細は、変数情報の表示と変更を参照してください。
[関数の置き換え] タブに、固定小数点の変換に対応していない関数が表示されます。シミュレーションの実行を参照してください。
fimath 設定を表示するために、[設定] 矢印
をクリックします。fimath の [乗算モード] と [加算モード] を
[最下位ビットを保持]
に設定します。これらの設定は C 言語の整数演算の動作をモデル化します。[解析] をクリックします。
テスト ファイル
overflow_test
が実行されます。[変数] タブにシミュレーションの最小範囲と最大範囲が表示されます。ソフトウェアは、シミュレーション範囲のデータを使用し、既定の型推奨の設定に基づき固定小数点の型を変数ごとに推奨し、[推奨された型] 列に表示します。浮動小数点アルゴリズムを固定小数点に変換するには、[変換] をクリックします。
推奨された型がソフトウェアによって検証され、エントリポイント関数の固定小数点バージョンが生成されます。
検証中にエラーおよび警告が発生した場合は、それらが [出力] タブに表示されます。型の検証を参照してください。
数値のテストとオーバーフローの確認
[テスト] 矢印
をクリックします。テスト ファイルが
overflow_test.m
であることを確認します。[スケーリングされた double を使用してオーバーフローを検出] を選択し、[テスト] をクリックします。入力型を定義するために使用したテスト ファイルが実行され、固定小数点 MATLAB コードがテストされます。オーバーフローを検出するように選択したので、推奨された固定小数点型のスケーリングされた double のバージョンを使用してシミュレーションが実行されます。スケーリングされた double は、倍精度浮動小数点のデータを格納するため、演算を全範囲で実行します。固定小数点設定が維持されるため、計算が固定小数点型の範囲から外れた場合に報告できます。
シミュレーションが実行されます。アプリによってオーバーフローが検出されます。[オーバーフロー] タブにオーバーフローが報告されます。オーバーフローした式を強調表示するには、そのオーバーフローをクリックします。
オーバーフローしたのが加算か乗算かを判断します。
[fimath] の設定で、[乗算モード] を
[FullPrecision]
に設定し、変換を繰り返して固定小数点モードを再度テストします。オーバーフローが継続して発生し、式の加算でオーバーフローしていることが示されます。