主要内容

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

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

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

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

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

はじめに

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

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

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

  • 通過帯域周波数エッジ: 0 4 π

  • 阻止帯域周波数エッジ: 0 45 π

  • 通過帯域リップル: 0 5 dB

  • 阻止帯域の減衰量: 80 dB

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

Biquad = design(fdesign.lowpass(“Fp,置,美联社,Ast”, 0.4, 0.45, 0.5, 80),...“ellip”FilterStructure =“df1sos”, SystemObject=true, UseLegacyBiquadFilter=true);fvt = fvtool(biquad, Legend=“上”);fvt.SosviewSettings.View =“累积”

{

浮動小数点と固定小数点の比較に用いるフィルタ,係数(sos, b, a)の取得

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

sosMatrix = biquadd . sosMatrix;sclValues = biquad.ScaleValues;fvt_comp = fvtool(sosMatrix,fi(sosMatrix,1,16));传奇(fvt_comp浮点(双)SOS“定点(16位)SOS”);

{

b = repmat (sclValues (1: (end-1)), 1, 3)。* sosMatrix (:, (1:3));a = sosMatrix(:,(5:6));Num = b';%矩阵的比例分子部分Den = a';%矩阵的分母部分
关闭(fvt);%清理关闭(fvt_comp);%清理

既定の浮動小数点演算

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

Wo = 75/(300/2);% 75 Hz音调;系统运行在300hzInp_len = 4000;%输入样本数(信号长度)inp_itf = 0.5。* sin((π*我们)。* (0:(inp_len-1)));%音干涉器scope =光谱分析仪(SampleRate=300,...PlotAsTwoSidedSpectrum = false,...ShowLegend=true, YLimits=[-85 25],...Title =浮点输入信号和滤波输出信号...ChannelNames = {“浮点输入”滤波器输出的});rng (12345);%种子的RNG可重复的结果biquadLPFiltFloat = dsp。BiquadFilter(SOSMatrixSource=输入端口的...ScaleValuesInputPort = false);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,den);%过滤器范围([输入,out_1])可视化输入和过滤输出结束

清晰的范围biquadLPFiltFloat%清理

既定の固定小数点演算

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

scope =光谱分析仪(SampleRate=300,...PlotAsTwoSidedSpectrum = false,...ShowLegend=true, YLimits=[-85 25],...Title =定点输入信号和滤波输出信号...ChannelNames = {“定点输入”'默认(不正确)定点输出'});rng (12345);%种子的RNG可重复的结果bqLPFiltFixpt = dsp。BiquadFilter(SOSMatrixSource=输入端口的...ScaleValuesInputPort = false);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(den,1,16));范围([inputFi out_2])%可视化结束

清晰的范围bqLPFiltFixpt%清理

浮動小数点双二次iirフィルタ,関数の固定小数点への変換

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

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

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

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

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

类型myIIRLowpassBiquad_tb.m
myIIRLowpassBiquad测试平台。The MathWorks, Inc. %%预先设计的滤波器(系数存储在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.ScaleValues;% 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 = 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つの方法があります。

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

屏幕截图2021年11月29日下午1点33分。png

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

屏幕截图2021年11月29日下午1点36分19分。png

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

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

屏幕截图2021年11月29日下午1.56.54。png

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

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

屏幕截图2021年11月29日下午2:2.14。png

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

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

类型myIIRLowpassBiquad_fixpt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % 由MATLAB 9.3和6.0定点设计师  % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %# codegen函数输出= myIIRLowpassBiquad_fixpt (inp, num窝)% myIIRNotchBiquad Biquad使用低通滤波器实现%的MATLAB定点转换器的应用例子。The MathWorks, Inc. fm = get_fimath();持久bqLPFilter;if isempty(bqLPFilter) bqLPFilter = dsp。BiquadFilter(…'SOSMatrixSource', '输入端口',…'ScaleValuesInputPort', false,…“SectionInputDataType”,“自定义”,…'SectionOutputDataType', '自定义',…'NumeratorProductDataType', 'Custom',…'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

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

別の方法として,コマンドラaaplン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。logioforcomparisonplots = 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固定小数点実装のテスト

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

scope =光谱分析仪(SampleRate=300,...PlotAsTwoSidedSpectrum = false,...ShowLegend=true, YLimits=[-85 25],...Title =定点输入信号和滤波输出信号...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(den,1,16));范围([inputFi out_3])%可视化结束

清晰的范围%清理

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

图;次要情节(1,1);情节(out_1);标题('浮点过滤器输出');次要情节(3、1、2);情节(out_3);标题('定点过滤器输出');次要情节(3,1,3);Plot (out_1 - double(out_3));轴([0 4000 -4e-2 7e-2]);标题(“错误”);

图中包含3个轴对象。带有标题的Axes对象1包含一个类型为line的对象。axis对象2带有标题的定点过滤器输出包含一个类型为line的对象。标题为Error的Axes对象3包含一个line类型的对象。

关闭(图);%清理

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

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

biquad_Linf = design(fdesign.lowpass(“Fp,置,美联社,Ast”, 0.4, 0.45, 0.5, 80),...“ellip”FilterStructure =“df1sos”...SOSScaleNorm =“Linf”, SystemObject=true, UseLegacyBiquadFilter=true);fvt_Linf = fvtool(biquad_Linf,Legend=“上”);fvt_Linf.SosviewSettings。视图=“累积”

{

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

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

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

sosMtrLinf = biquad_lin . sosmatrix;sclValLinf = biquad_lin . scalevalues;fvt_comp_Linf = fvtool(sosMtrLinf,fi(sosMtrLinf,1,16));传奇(fvt_comp_Linf浮点(双)SOS, Linf Scaling...“定点(16位)SOS, Linf缩放”);

{

bLinf = repmat (sclValLinf (1: (end-1)), 1, 3)。* sosMtrLinf (:, (1:3));aLinf = sosMtrLinf(:,(5:6));numLinf = bLinf';%矩阵的比例分子部分denLinf = aLinf';%矩阵的分母部分
关闭(fvt_Linf);%清理关闭(fvt_comp_Linf);%清理

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

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

scope =光谱分析仪(SampleRate=300,...PlotAsTwoSidedSpectrum = false, ShowLegend = true,...YLimits = 25 [-85],...Title =定点输入信号和linf范数滤波输出信号...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_4 = myIIRLinfBiquad_fixpt(...inputFi, fi (numLinf 1 16), fi (denLinf 1 16));范围([inputFi out_4])%可视化结束

清晰的范围%清理

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

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

Fig1 =图;次要情节(1,1);情节(out_1);标题('浮点过滤器输出');次要情节(3、1、2);情节(out_4);标题(定点(linf范数SOS)滤波器输出);次要情节(3,1,3);Plot (out_1 - double(out_4));轴([0 4000 0 1e-3]);标题(“错误”);

图中包含3个轴对象。带有标题的Axes对象1包含一个类型为line的对象。带有标题定点(Linf-norm SOS)过滤器输出的坐标轴对象2包含一个类型为line的对象。标题为Error的Axes对象3包含一个line类型的对象。

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

图中包含2个轴对象。axis对象1,标题为定点错误(默认SOS过滤器缩放),包含一个类型为line的对象。axis对象2带有标题Fixed-point error ('Linf' SOS filter scaling)包含一个类型为line的对象。

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

まとめ

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