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

固定小数点コンバーター アプリを使用した dsp.FIRFilter オブジェクトの固定小数点への変換

この例では、固定小数点コンバーター アプリを使用して、高周波数の正弦波信号をフィルター処理する dsp.FIRFilter System object™ を固定小数点に変換します。この例には、Fixed-Point Designer™ および DSP System Toolbox™ のライセンスが必要です。

DSP フィルター関数とテスト ベンチの作成

関数 myFIRFilterdsp.FIRFilter System object から作成します。

既定では、完全精度の固定小数点演算を使用するように System object を設定します。範囲データを収集し、固定小数点コンバーター アプリからデータ型の推奨を取得するには、‘Custom’ 設定を使用するように System object を設定します。

関数をローカルの書き込み可能なフォルダーに保存します。

function output = myFIRFilter(input, num)
    
    persistent lowpassFIR;
    if isempty(lowpassFIR)
        lowpassFIR  = dsp.FIRFilter('NumeratorSource', 'Input port', ...
            'FullPrecisionOverride', false, ...
            'ProductDataType', 'Full precision', ... % default
            'AccumulatorDataType', 'Custom', ...
            'CustomAccumulatorDataType', numerictype(1,16,4), ...
            'OutputDataType', 'Custom', ...
            'CustomOutputDataType', numerictype(1,8,2));
    end
    output = lowpassFIR(input, num);
    
end
フィルターに対してテスト ベンチmyFIRFilter_tb を作成します。テスト ベンチは、変換のための範囲情報を収集する信号を生成します。テスト ベンチを保存します。
% Test bench for myFIRFilter
% Remove high-frequency sinusoid using an FIR filter.

% Initialize
f1 = 1000;
f2 = 3000;
Fs = 8000;
Fcutoff = 2000;

% Generate input
SR = dsp.SineWave('Frequency',[f1,f2],'SampleRate',Fs,...
    'SamplesPerFrame',1024);

% Filter coefficients
num = fir1(130,Fcutoff/(Fs/2));

% Visualize input and output spectra
plot = dsp.SpectrumAnalyzer('SampleRate',Fs,'PlotAsTwoSidedSpectrum',...
    false,'ShowLegend',true,'YLimits',[-120 30],...
    'Title','Input Signal (Channel 1) Output Signal (Channel 2)');

% Stream
for k = 1:100
    input = sum(SR(),2); % Add the two sinusoids together
    filteredOutput = myFIRFilter(input, num); % Filter
    plot([input,filteredOutput]); % Visualize
end

固定小数点への関数の変換

  1. 固定小数点コンバーター アプリを開きます。

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

    • MATLAB コマンド プロンプト: 次のように入力します。

      fixedPointConverter

  2. プロジェクトにエントリポイント関数 myFIRFilter を追加するために、ファイル myFIRFilter.m を探して [開く] をクリックします。

    既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの myFirFilter.prj というファイルに保存します。

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

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

  4. [入力の型を定義] ページで、myFIRFilter_tb をテスト ファイルとして追加するために myFIRFilter_tb.m を参照し、[入力の型の自動定義] をクリックします。

    アプリはテスト ファイルから、input の型を double(1024 x 1) に、num の型を double(1 x 131) にすることを決定します。

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

  6. [固定小数点に変換] ページで [シミュレーション] をクリックして範囲情報を収集します。

    [変数] タブに、収集した範囲情報と型の推奨が表示されます。必要に応じてデータ型の推奨を手動で編集します。

    [変数] タブで、lowpassFIR.CustomProductDataType[推奨された型] フィールドは Full Precision です。固定小数点コンバーター アプリでは、'ProductDataType' 設定が 'Custom' に設定されないため、このフィールドのデータ型は推奨されませんでした。

  7. [変換] をクリックし、推奨されたデータ型を関数に適用します。

    固定小数点コンバーター アプリは推奨されたデータ型を適用し、固定小数点関数 myFIRFilter_fixpt を生成します。

    function output = myFIRFilter_fixpt(input, num)
        
        fm = get_fimath();
    
        persistent lowpassFIR;
        if isempty(lowpassFIR)
            lowpassFIR  = dsp.FIRFilter('NumeratorSource', 'Input port', ...
                'FullPrecisionOverride', false, ...
                'ProductDataType', 'Full precision', ... % default
                'AccumulatorDataType', 'Custom', ...
                'CustomAccumulatorDataType', numerictype(1, 16, 14), ...
                'OutputDataType', 'Custom', ...
                'CustomOutputDataType', numerictype(1, 8, 6));
        end
        output = fi(lowpassFIR(input, num), 1, 16, 14, fm);
        
    end
    
    
    function fm = get_fimath()
    	fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap',..
     'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode',..
     'FullPrecision', 'MaxSumWordLength', 128);
    end

関連するトピック