メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

浮動小数点と固定小数点の結果の差の可視化

R2026a

次の例では、生成された固定小数点コードと元の浮動小数点の MATLAB® コードの動作を比較するために、カスタムのプロット関数を使用するように関数 fiaccel を構成する方法を説明します。

既定では、LogIOForComparisonPlotting オプションを有効にすると、時系列ベースのプロット関数を使用して、浮動小数点と固定小数点の結果とそれらの差が示されます。しかし、固定小数点に変換するときに、適用分野に合った表示方法で数値の差を可視化することが望ましい場合があります。次の例では、固定小数点への変換プロセスの数値のテスト ステップで散布図が作成されるように、プロット関数をカスタマイズする方法を説明します。

関連ファイルのコピー

myFilter.m、myFilterTest.m、plotDiff.m、および filterData.mat の各ファイルをローカルの作業フォルダーにコピーします。

前提条件

この例を実行するには、次の製品をインストールしなければなりません。

例のファイルの検査

入力の読み込みや、入力値の設定、テストする関数の呼び出し、テスト結果の出力など、すべての前処理と後処理を実行するための独立したテスト スクリプトを作成することをお勧めします。

タイプ名前説明
関数のコードmyFilter.mエントリポイントの MATLAB 関数
テスト ファイルmyFilterTest.mmyFilter.m をテストする MATLAB スクリプト
プロット関数plotDiff.mカスタムのプロット関数
MAT ファイルfilterData.matフィルター処理するデータ
function [y, ho] = myFilter(in)

persistent b h;
if isempty(b)
  b = complex(zeros(1,16));
  h = complex(zeros(1,16));
  h(8) = 1;
end

b = [in, b(1:end-1)];
y = b*h.';

errf = 1-sqrt(real(y)*real(y) + imag(y)*imag(y));
update = 0.001*conj(b)*y*errf;

h = h + update;
h(8) = 1;
ho = h;

end
% load data
data = load('filterData.mat');
d = data.symbols;

for idx = 1:4000
    y = myFilter(d(idx));
end
% varInfo - structure with information about 
% the variable. It has the following fields
%            i) name
%            ii) functionName
% floatVals - cell array of logged original values 
% for the 'varInfo.name' variable
% fixedVals - cell array of logged values for 
% the 'varInfo.name' variable after Fixed-Point conversion.
function plotDiff(varInfo, floatVals, fixedVals)
    varName = varInfo.name;
    fcnName = varInfo.functionName;

    % escape the '_'s because plot titles treat these as subscripts
    escapedVarName = regexprep(varName,'_','\\_');
    escapedFcnName = regexprep(fcnName,'_','\\_');
    
    % flatten the values
    flatFloatVals = floatVals(1:end);
    flatFixedVals = fixedVals(1:end);

    % build Titles
    floatTitle = [escapedFcnName ' > ' 'float : ' escapedVarName];
    fixedTitle = [escapedFcnName ' > ' 'fixed : ' escapedVarName];
    
    data = load('filterData.mat');
    
    switch varName
        case 'y'
            x_vec = data.symbols;
            
            figure('Name','Comparison plot','NumberTitle','off');
            
            % plot floating point values
            y_vec = flatFloatVals;
            subplot(1, 2, 1);
            plotScatter(x_vec, y_vec, 100, floatTitle);
            
            % plot fixed point values
            y_vec = flatFixedVals;
            subplot(1, 2, 2);
            plotScatter(x_vec, y_vec, 100, fixedTitle);

        otherwise
            % Plot only output 'y' for this example, skip the rest
    end

end

function plotScatter(x_vec, y_vec, n, figTitle)
    % plot the last n samples
    x_plot = x_vec(end-n+1:end);
    y_plot = y_vec(end-n+1:end);
    
    hold on
    scatter(real(x_plot),imag(x_plot), 'bo');    

    hold on
    scatter(real(y_plot),imag(y_plot), 'rx');
    
    title(figTitle);
end

構成オブジェクトの設定

  1. coder.FixptConfig オブジェクトを作成します。

    fxptcfg = coder.config('fixpt');
  2. テスト ファイル名とカスタムのプロット関数名を指定します。ログの記録と数値テストを有効にします。

    fxptcfg.TestBenchName = 'myFilterTest';
    fxptcfg.PlotFunction = 'plotDiff';
    fxptcfg.TestNumerics = true; 
    fxptcfg.LogIOForComparisonPlotting = true;
    fxptcfg.DefaultWordLength = 16;
    

固定小数点への変換

浮動小数点の MATLAB 関数 myFilter を固定小数点の MATLAB コードに変換します。fiaccel コマンドの入力の型はテスト ファイルの型から推定されるので、指定する必要はありません。

fiaccel -args {complex(0, 0)} -float2fixed fxptcfg myFilter

既定の語長 16 を使用して固定小数点コードが生成されます。次に、関数 myFilterTest.m を実行して固定小数点バージョンの myFilter.m を呼び出すことにより、固定小数点のシミュレーションが実行されます。

比較プロット用の入力と出力を記録し、カスタムのプロット関数 plotDiff.m を使用するように指定したので、変換プロセスではこの関数を使用して比較プロットが生成されます。

プロットは、固定小数点の結果と浮動小数点の結果があまり一致していないことを示しています。

語長を 24 に増加してから、再び固定小数点に変換します。

fxptcfg.DefaultWordLength = 24;
fiaccel -args {complex(0, 0)} -float2fixed fxptcfg myFilter

語長を増加したことにより結果が改善されました。今回は、固定小数点の結果と浮動小数点の結果が一致しています。

参考

トピック