主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

IIRフィルターの浮動小数点から固定小数点への変換

この例では,固定小数点コンバーターアプリを使用してIIRフィルターを浮動小数点から固定小数点の実装に変換する方法を説明します。二次型(または“双二次”)の構造は,伝達関数を直接実装する構造よりも,固定小数点演算を使用する場合にうまく機能します。ここでは”浮動から固定“の変換を成功させるための最も確実な方法を説明します。この方法は,以下の手順で構成されています。

  • 2次セクション型(SOS)構造,つまりdsp。BiquadFilterを選択

  • フィルターの各ノードのダイナミックレンジ解析を実行。つまり,シミュレーションの最小値とシミュレーションの最大値の計測によるテストベンチアプローチを使用

  • 代替方法である双二次スケーリング実装と比較し,‘fvtoolおよびdsp。简介を使用して解析および検証して,異なる選択に起因する量子化の影響を表示

はじめに

IIRフィルターを効率的に実装する方法として,2次セクション型(SOS)双二次フィルター構造を使用する方法があります。たとえば,システムから高周波数のトーン信号である干渉源を除去する必要があると仮定します。これを実行する方法の1つは,ローパスフィルター設計を使用することです。

ローパス楕円フィルターの設計

この例では,最小次数のローパス楕円直接型我設計を使用します。フィルターの設計仕様は,以下のとおりです。

  • 通過帯域周波数エッジ:0.4 *π

  • 阻止帯域周波数エッジ:0.45 *π

  • 通過帯域リップル:0.5 dB

  • 阻止帯域の減衰量:80分贝

フィルターの可視化ツールを使用して,すべての2次セクション型の累積フィルター応答を可視化します。

biquad =设计(fdesign.lowpass (“Fp,置,美联社,Ast”, 0.4, 0.45, 0.5, 80),...“ellip”“FilterStructure”“df1sos”“SystemObject”,真正的);fvt = fvtool (biquad,“传奇”“上”);fvt.SosviewSettings.View =“累积”

浮動小数点と固定小数点の比較に用いるフィルター係数(SOS, B, A)の取得

SOSフィルター係数値は(双または16ビット固定小数点値のどちらの場合にも)ほぼ同じフィルター応答を導くことに注意してください。

sosMatrix = biquad.SOSMatrix;sclValues = biquad.ScaleValues;fvt_comp = fvtool (sosMatrix fi (sosMatrix 1 16));传奇(fvt_comp“浮点(double) SOS”“定点(16位)SOS”);b = repmat (sclValues (1: (end-1)), 1, 3)。* sosMatrix (:, (1:3));= sosMatrix (:, (6));num = b”;比例的分子部分的%矩阵穴= ';%矩阵的分母部分

关闭(fvt);%清理关闭(fvt_comp);%清理

既定の浮動小数点演算

フィルターを通して何らかのデータをストリーミングし,入出力応答を表示してフィルターの動作を検証します。まず,付加的な高周波数トーンの干渉源をともなう(浮動小数点の)疑似ランダムノイズ信号(300 Hzでサンプリングされた信号)のフィルター処理を試行し,トーンが除去されるかを確認します。これは後でテストベンチの基準信号として使用します。

我们= 75 / (300/2);% 75 Hz音调;系统运行在300hzinp_len = 4000;%输入采样数(信号长度)inp_itf = 0.5。* sin((π*我们)。* (0:(inp_len-1)));%的语气影响= dsp范围。简介(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,...“ShowLegend”,真的,“YLimits”25 [-85],...“标题”浮点输入信号和滤波器输出信号...“ChannelNames”, {“浮点输入”滤波器输出的});rng (12345);%种子RNG可重复的结果biquadLPFiltFloat = dsp。BiquadFilter (“SOSMatrixSource”输入端口的...“ScaleValuesInputPort”、假);K = 1:10 inp_sig = rand(inp_len,1) - 0.5;%随机值范围(-0.5,0.5)Input = inp_sig + inp_itf;%组合输入信号,范围(-1.0,1.0)out_1 = biquadLPFiltFloat(输入、num穴);%过滤器范围([输入,out_1])%可视化输入和过滤输出结束

清晰的范围biquadLPFiltFloat%清理

既定の固定小数点演算

今度はオブジェクトの既定の設定を使用して,フィルターに何らかの固定小数点データを通します。固定小数点の既定の動作は無効な結果の原因となることに注意してください。

= dsp范围。简介(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,...“ShowLegend”,真的,“YLimits”25 [-85],...“标题”定点输入信号和滤波器输出信号...“ChannelNames”...“定点输入”'默认(不正确的)定点输出'});rng (12345);%种子RNG可重复的结果bqLPFiltFixpt = dsp。BiquadFilter (“SOSMatrixSource”输入端口的...“ScaleValuesInputPort”、假);K = 1:10 inp_sig = rand(inp_len,1) - 0.5;%随机值范围(-0.5,0.5)inputFi = fi(inp_sig + inp_itf, 1,16,15);%信号范围(-1.0,1.0)out_2 = bqLPFiltFixpt (inputFi fi (num 1 16), fi(窝,1,16));范围([inputFi out_2])%可视化结束

清晰的范围bqLPFiltFixpt%清理

浮動小数点双二次检索フィルター関数の固定小数点への変換

オブジェクトの既定の固定小数点設定の代わりに,固定小数点コンバーターアプリを使用してオブジェクトを固定小数点に変換します。この方法によって,フィルターの実装内における個々の固定小数点型の可視性および制御性が向上し,固定小数点演算がより正確になります。

まず,固定小数点コンバーターアプリを使用する準備として,すべてのフィルターのデータ型の選択を“定制”に設定し,変換する関数を作成します。

类型myIIRLowpassBiquad
函数输出= myIIRLowpassBiquad(inp,num,den) %myIIRNotchBiquad Biquad低通滤波器实现%作为MATLAB定点转换器应用程序示例的一部分。% Copyright 2016 The MathWorks, Inc. persistent bqLPFilter;if isempty(bqLPFilter) bqLPFilter = dsp。BiquadFilter(…'SOSMatrixSource', '输入端口',…“ScaleValuesInputPort”,假的,…“SectionInputDataType”,“自定义”,…“SectionOutputDataType”,“自定义”,…“NumeratorProductDataType”,“自定义”,…“DenominatorProductDataType”,“自定义”,…“NumeratorAccumulatorDataType”,“自定义”,… 'DenominatorAccumulatorDataType', 'Custom', ... 'StateDataType', 'Custom', ... 'OutputDataType', 'Custom'); end output = bqLPFilter(inp, num, den); end

テストベンチスクリプトの作成

データ型で制御されるすべての信号パスについて,シミュレーションの最小値とシミュレーションの最大値をシミュレートし,計測したこれらの値を収集するテストベンチを作成します。これにより,その後ツールでオートスケールされた固定小数点設定を推奨できるようになります。上記のコードの一部をテストベンチスクリプトとして使用し,浮動小数点の入力から始めてテストベンチを検証した後,最小および最大データをシミュレートして収集します。その後,固定小数点コンバーターアプリを使用し,浮動小数関数の実装を固定小数点関数の実装に変換します。

类型myIIRLowpassBiquad_tb.m
%% myIIRLowpassBiquad测试台。预设计滤波器(系数存储在MAT文件):% f = design(fdesign.lowpass('Fp,Fst,Ap,Ast',0.4,0.45,0.5,80),…% 'ellip', 'FilterStructure', 'df1sos','SystemObject',true);% sosMatrix = f.SOSMatrix;% sclValues = f. scalvalues; / /% b = repmat (sclValues (1: (end-1)), 1, 3)。* sosMatrix (:, (1:3));% a = sosMatrix(:,(5:6));% num = b';% den = a';% (myIIRLowpassBiquadDesign攒钱。Mat ', 'b', 'a', 'num', 'den'); load('myIIRLowpassBiquadDesign.mat'); %% Interference signal, using values in range (-0.5, 0.5) Wo = 75/(300/2); % 75 Hz tone; system running at 300 Hz inp_len = 4000; sinTvec = (0:(inp_len-1))'; inp_itf = 0.5 .* sin((pi*Wo) .* sinTvec); %% Filtering and visualization % Filter an input signal, including an interference % tone, to see if the tone is successfully removed. rng(12345); % seed the rng for repeatable results scope = dsp.SpectrumAnalyzer('SampleRate',300,... 'PlotAsTwoSidedSpectrum',false,'ShowLegend',true,'YLimits',[-125 25],... 'Title','Input Signal and Filter Output Signal', ... 'ChannelNames', {'Input', 'Filter Output'}); for k = 1:10 inp_sig = rand(inp_len,1) - 0.5; % random values in range (-0.5, 0.5) inp = inp_sig + inp_itf; out_1 = myIIRLowpassBiquad(inp,num,den); % filter scope([inp,out_1]); % visualize end

固定小数点コンバーターアプリを使用した固定小数点への変換

  • 固定小数点コンバーターアプリを起動します。このツールを起動するには,MATLABの[アプリ]メニューと‘fixedPointConverterコマンドとの2つの方法があります。

  • 変換する関数を[エントリポイント関数]フィールドに入力します。

  • テストベンチのスクリプト名を入力して入力を定義します。

  • テストベンチをシミュレートして範囲を収集するには[解析]をクリックします。

  • 収集された[シミュレーションの最小値],[シミュレーションの最大値]および[推奨された型]の値を観察します。

  • 必要に応じて[推奨された型]フィールドを調整します。

  • [変換]をクリックして固定小数点コードを生成してレポートを表示します。

結果として得られる固定小数点のMATLAB実装

生成された固定小数点関数の実装は次のようになります。

类型myIIRLowpassBiquad_fixpt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % 由MATLAB 9.3和6.0定点设计师  % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %# codegen函数输出= myIIRLowpassBiquad_fixpt (inp, num窝)% myIIRNotchBiquad Biquad %作为低通滤波器实现MATLAB不动点转换器应用程序的一部分示例。% Copyright 2016 The MathWorks, Inc. fm = get_fimath();持久bqLPFilter;if isempty(bqLPFilter) bqLPFilter = dsp。BiquadFilter(…'SOSMatrixSource', '输入端口',…“ScaleValuesInputPort”,假的,…“SectionInputDataType”,“自定义”,…“SectionOutputDataType”,“自定义”,…“NumeratorProductDataType”,“自定义”,… 'DenominatorProductDataType', 'Custom', ... 'NumeratorAccumulatorDataType', 'Custom', ... 'DenominatorAccumulatorDataType', 'Custom', ... 'StateDataType', 'Custom', ... 'OutputDataType', 'Custom' , 'CustomSectionInputDataType', numerictype([], 16, 8), 'CustomSectionOutputDataType', numerictype([], 16, 8), 'CustomNumeratorProductDataType', numerictype([], 32, 26), 'CustomDenominatorProductDataType', numerictype([], 32, 23), 'CustomNumeratorAccumulatorDataType', numerictype([], 32, 24), 'CustomDenominatorAccumulatorDataType', numerictype([], 32, 23), 'CustomStateDataType', numerictype([], 16, 8), 'CustomOutputDataType', numerictype([], 16, 15)); end output = fi(bqLPFilter(inp, num, den), 1, 16, 15, fm); end function fm = get_fimath() fm = fimath('RoundingMethod', 'Floor',... 'OverflowAction', 'Wrap',... 'ProductMode','FullPrecision',... 'MaxProductWordLength', 128,... 'SumMode','FullPrecision',... 'MaxSumWordLength', 128); end

コマンドラインAPIを使用した固定小数点変換の自動化

別の方法として,コマンドラインAPIを使用して固定小数点変換を自動化することもできます。

类型myIIRLowpassF2F_prj_script
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 从项目”myIIRLowpassBiquad脚本生成。撮合下2014年- 10月16日。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 创建配置对象的类“coder.FixPtConfig”。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cfg = coder.config(“fixpt”);cfg。TestBenchName = {sprintf('S:\\Work\\15aFeatureExamples\\biquad_notch_f2f\\myIIRLowpassBiquad_tb.m')};cfg。DefaultWordLength = 16;cfg。LogIOForComparisonPlotting = true;cfg。TestNumerics = true; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Define argument types for entry-point 'myIIRLowpassBiquad'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ARGS = cell(1,1); ARGS{1} = cell(3,1); ARGS{1}{1} = coder.typeof(0,[4000 1]); ARGS{1}{2} = coder.typeof(0,[3 5]); ARGS{1}{3} = coder.typeof(0,[2 5]); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Invoke MATLAB Coder. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% codegen -float2fixed cfg myIIRLowpassBiquad -args ARGS{1}

変換済みMATLAB固定小数点実装のテスト

変換済みの固定小数点関数を実行し,入出力結果を表示します。

= dsp范围。简介(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,...“ShowLegend”,真的,“YLimits”25 [-85],...“标题”定点输入信号和滤波器输出信号...“ChannelNames”, {“定点输入”“定点滤波器输出”});rng (12345);%种子RNG可重复的结果K = 1:10 inp_sig = rand(inp_len,1) - 0.5;%随机值范围(-0.5,0.5)inputFi = fi(inp_sig + inp_itf, 1,16,15);%信号范围(-1.0,1.0)out_3 = myIIRLowpassBiquad_fixpt (inputFi fi (num 1 16), fi(窝,1,16));范围([inputFi out_3])%可视化结束

清晰的范围%清理

浮動小数点と固定小数点の出力間の誤差が次のプロットに表示されます。誤差がかなり大きいことがわかります。出力値のこのような差は,多くの場合,スケーリングの選択と2次セクション型の順序が原因となります。次の節で,実装の早い段階にこの誤差を減らす方法を説明します。

无花果=图;次要情节(1,1);情节(out_1);标题(“浮点滤波器输出”);次要情节(3、1、2);情节(out_3);标题(“定点滤波器输出”);次要情节(3,1,3);情节(out_1 -双(out_3));轴([0 4000 -4e-2 7e-2]);标题(“错误”);

关闭(图);%清理

無限大ノルムスケーリングを使用した楕円フィルターの再設計

楕円フィルター設計には,“Linf”2次セクション型スケーリング(無限大ノルム)が使用された場合,比較的良好なスケーリングが行われるという特長があります。この方法を使用すると,多くの場合,量子化誤差の低減につながります。

biquad_Linf =设计(fdesign.lowpass (“Fp,置,美联社,Ast”, 0.4, 0.45, 0.5, 80),...“ellip”“FilterStructure”“df1sos”...“SOSScaleNorm”“Linf”“SystemObject”,真正的);fvt_Linf = fvtool (biquad_Linf,“传奇”“上”);fvt_Linf.SosviewSettings。视图=“累积”

各セクションのフィルターへの入力からさまざまな状態までの間で測定された累積内部周波数応答で,0分贝を超えるものがないことに注意してください。したがって,この設計は,固定小数点実装のための適切な候補であることがわかります。

浮動小数点と固定小数点の比較に用いるLinfノルムフィルター係数の取得

SOSフィルター係数値は(双または16ビット固定小数点値のどちらの場合にも)ほぼ同じフィルター応答を導くことに注意してください。

sosMtrLinf = biquad_Linf.SOSMatrix;sclValLinf = biquad_Linf.ScaleValues;fvt_comp_Linf = fvtool (sosMtrLinf fi (sosMtrLinf 1 16));传奇(fvt_comp_Linf“浮点(双)SOS, Linf缩放”...“固定点(16位)SOS, Linf缩放”);bLinf = repmat (sclValLinf (1: (end-1)), 1, 3)。* sosMtrLinf (:, (1:3));aLinf = sosMtrLinf (:, (6));numLinf = bLinf ';比例的分子部分的%矩阵denLinf = aLinf ';%矩阵的分母部分

关闭(fvt_Linf);%清理关闭(fvt_comp_Linf);%清理

変換済みMATLAB固定小数点Linfノルム双二次フィルターのテスト

上記の固定小数点コンバーターの手順(ただし,Linfノルムスケーリングしたフィルター係数値を使用)に再度従った後,変換した新しい固定小数点関数を実行し,入出力結果を表示します。

= dsp范围。简介(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,...“YLimits”25 [-85],“标题”...定点输入信号和Linf-Norm滤波器输出信号...“ChannelNames”...“定点输入”“定点Linf-Norm滤波器输出”});rng (12345);%种子RNG可重复的结果K = 1:10 inp_sig = rand(inp_len,1) - 0.5;%随机值范围(-0.5,0.5)inputFi = fi(inp_sig + inp_itf, 1,16,15);%信号范围(-1.0,1.0)out_4 = myIIRLinfBiquad_fixpt (...inputFi, fi (numLinf 1 16), fi (denLinf 1 16));范围([inputFi out_4])%可视化结束

清晰的范围%清理

LinfノルムSOSスケーリングを使用した固定小数点実装誤差の低減

多くの場合,無限大ノルムSOSスケーリングで出力を生成することで誤差が少なくなります。

图一=图;次要情节(1,1);情节(out_1);标题(“浮点滤波器输出”);次要情节(3、1、2);情节(out_4);标题(“定点(Linf-norm SOS)滤波器输出”);次要情节(3,1,3);情节(out_1 -双(out_4));轴([0 4000 0 1e-3]);标题(“错误”);

图=图;次要情节(2,1,1);情节(out_1 -双(out_3));轴([0 4000 -4e-2 7e-2]);标题(“定点误差(默认SOS滤波器缩放)”);次要情节(2,1,2);情节(out_1 -双(out_4));轴([0 4000 0 1e-3]);标题(“定点误差(“Linf”SOS滤波器缩放)”);

关闭(图一);%清理关闭(图);%清理

まとめ

ここでは,浮動小数点IIRフィルターを固定小数点実装に変換する手順を説明しました。DSP系统工具箱™のDSP。BiquadFilterオブジェクトには,シミュレーションの最小値と最大値の計測機能が備えられており,固定小数点コンバーターアプリで自動的かつ動的に内部フィルター信号をスケーリングするのに役立ちます。また,fvtoolおよびdsp。简介は,さまざまな解析においてプロセスの各ステップで検証を行うためのツールとして使用できます。