文档

浮点定点IIR滤波器的转换

这个例子展示了如何使用定点转换器应用转换的IIR滤波器定点实现浮点。二阶节(也称为双二次)结构工作使用定点算术时比结构实现直接传递函数。我们将表明,通向成功的“float-to-fixed”转换包含以下步骤:

  • 选择一个二阶部分(SOS)结构,即。,dsp.BiquadFilter

  • 为每个节点执行动态范围分析的过滤器,即。,use a Test Bench approach with Simulation Minimum and Simulation Maximum instrumentation

  • 比较替代双二次扩展和视图实现量化的影响因不同的选择,使用“fvtool”和dsp。软件进行分析和验证。

介绍

一个有效的方法来实现一个使用二阶IIR滤波器部分(SOS) Biquad滤波器结构。例如假设我们有一个需要删除一个干扰高频音调信号从一个系统。实现这一点的方法之一是使用一个低通滤波器的设计。

设计一个低通椭圆滤波器

使用一个最小订单低通椭圆直接形式我设计这个例子的目的。滤波器的设计规范有:

  • 通带频率边:0.4 *π

  • 阻带频率边:0.45 *π

  • 通带纹波:0.5 dB

  • 阻带衰减:80分贝

可视化累积滤波器响应的二阶部分使用可视化工具进行过滤。

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

获得滤波器系数(SOS、B)浮动和固定的比较

注意,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的语气;系统运行在300赫兹inp_len = 4000;%的数量输入样本(信号长度)inp_itf = 0.5。* sin((π*我们)。* (0:(inp_len-1)));%的语气影响范围= dsp.SpectrumAnalyzer (“SampleRate”,300,“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,“YLimits”25 [-85],“标题”,“浮点输入信号和滤波器输出信号”,“ChannelNames”,{“浮点输入”,滤波器输出的});rng (12345);%的种子rng可重复的结果biquadLPFiltFloat = dsp.BiquadFilter (“SOSMatrixSource”,输入端口的,“ScaleValuesInputPort”、假);k = 1:10 inp_sig =兰德(inp_len, 1) - 0.5;随机值百分比范围(-0.5,0.5)输入= inp_sig + inp_itf;%输入信号相结合,范围(-1.0,1.0)out_1 = biquadLPFiltFloat(输入、num穴);%过滤器范围([输入,out_1])%可视化输入和输出过滤结束

清晰的范围biquadLPFiltFloat;%清理

默认的定点操作

现在通过过滤器运行一些定点数据,使用对象默认设置。注意,默认定点行为会导致不正确的结果。

范围= dsp.SpectrumAnalyzer (“SampleRate”,300,“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,“YLimits”25 [-85],“标题”,“定点输入信号和滤波器输出信号”,“ChannelNames”,{“定点输入”,默认的(错误的)定点输出的});rng (12345);%的种子rng可重复的结果bqLPFiltFixpt = dsp.BiquadFilter (“SOSMatrixSource”,输入端口的,“ScaleValuesInputPort”、假);k = 1:10 inp_sig =兰德(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;%清理

浮点Biquad IIR滤波器函数转换为定点

而不是依赖对象默认定点设置,使用定点转换器转换为定点应用程序。这种方法能得到更多的可见性和控制个人定点类型过滤器内实现,并导致更多的正确的定点操作。

首先准备使用定点转换器应用程序,创建一个转换函数,设置所有过滤数据类型选择“自定义”:

类型myIIRLowpassBiquad;
函数输出= myIIRLowpassBiquad (inp, num窝)% myIIRNotchBiquad Biquad使用低通滤波器实现%的MATLAB定点转换器的应用例子。% 2016年版权MathWorks公司持久bqLPFilter;如果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试验台。m % 2016年版权MathWorks公司% %预先设计滤波器(系数存储在垫文件):% f =设计(fdesign.lowpass (Fp,置,美联社,Ast, 0.4, 0.45, 0.5, 80),…%’ellip’,‘FilterStructure’,‘df1sos’,‘SystemObject’,真正的);% sosMatrix = f.SOSMatrix;% sclValues = f.ScaleValues;% b = repmat (sclValues (1: (end-1)), 1, 3)。* sosMatrix (:, (1:3));% = sosMatrix (:, (6));% num = b”;%穴= ';% (myIIRLowpassBiquadDesign攒钱。席”、“b”、“”、“num”、“窝”); 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”。

  • 进入入口点函数的函数转换盒。

  • 通过进入试验台脚本定义输入名字。

  • 检查运行时生成的代码问题。

  • 模拟、收集和观察“Sim Min”和“Sim马克斯”值。

  • 如果需要做出调整,该类型字段。

  • 生成类型建议报告和转换为定点。

产生的定点MATLAB实现

生成的定点函数实现如下:

类型myIIRLowpassBiquad_fixpt;
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %由MATLAB 8.5和定点设计师5.0% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % # = myIIRLowpassBiquad_fixpt codegen函数输出(输入,num den) % myIIRNotchBiquad Biquad使用低通滤波器实现%的MATLAB定点转换器的应用例子。% 2016年版权MathWorks公司调频= fimath (‘RoundingMethod’,‘层’,‘OverflowAction’,‘包装’,……“ProductMode”、“FullPrecision’,‘MaxProductWordLength’, 128年……“SumMode”、“FullPrecision’,‘MaxSumWordLength’, 128);持久bqLPFilter;如果isempty (bqLPFilter) bqLPFilter = dsp。BiquadFilter (…“SOSMatrixSource”、“输入端口”,…“ScaleValuesInputPort”,假的,…“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

定点的自动化转换使用命令行API

或者定点转换可能会自动使用命令行API:

类型myIIRLowpassF2F_prj_script;
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % myIIRLowpassBiquad脚本生成的项目”。撮合下2014年- 10月16日。% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %创建配置对象的类“coder.FixPtConfig”。% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % cfg = coder.config (“fixpt”);cfg。TestBenchName = {sprintf (' S: 15 afeatureexamples \ \ \ \ \ \工作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.SpectrumAnalyzer (“SampleRate”,300,“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,“YLimits”25 [-85],“标题”,“定点输入信号和滤波器输出信号”,“ChannelNames”,{“定点输入”,“定点滤波器输出”});rng (12345);%的种子rng可重复的结果k = 1:10 inp_sig =兰德(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])%可视化结束

清晰的范围;%清理

浮点和定点输出之间的误差显示在接下来的情节。错误似乎相当高。这些输出值的差异的原因是由扩展的选择和排序的二阶部分。在下一节中,我们说明一种方法来减少这种错误的实现。

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

关闭(图);%清理

重新设计使用Infinity-Norm缩放椭圆滤波器

椭圆滤波器设计的特点是相对较好了在使用Linf二阶节比例(即。无穷范数)。使用这种方法通常会导致较小的量化误差。

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-norm滤波器系数浮动和固定的比较

注意,SOS滤波器系数的值导致几乎相同的滤波器响应(是否双或16位定点值)。

sosMtrLinf = biquad_Linf.SOSMatrix;sclValLinf = biquad_Linf.ScaleValues;fvt_comp_Linf = fvtool (sosMtrLinf fi (sosMtrLinf 1 16));传奇(fvt_comp_Linf“浮点(double) 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-Norm Biquad过滤器

后定点转换器后再次手术,如上所述,但使用Linf-norm比例滤波器系数值,运行新的定点转换函数和视图输入-输出结果。

范围= dsp.SpectrumAnalyzer (“SampleRate”,300,“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,“YLimits”25 [-85],“标题”,“定点输入信号和Linf-Norm滤波器输出信号”,“ChannelNames”,{“定点输入”,“定点Linf-Norm滤波器输出”});rng (12345);%的种子rng可重复的结果k = 1:10 inp_sig =兰德(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-norm SOS缩放

Infinity-norm SOS扩展通常产生较低的输出误差。

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

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

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

总结

我们列出了一个过程浮点IIR滤波器转换为定点实现。dsp。BiquadFilter对象的DSP系统工具箱™配备模拟最小和最大仪器功能,帮助定点自动转换器应用和内部过滤信号动态范围。此外,各种“fvtool”和dsp。软件分析工具提供给用户执行验证过程的每一步。

这个主题有帮助吗?