主要内容

IIR滤波器的浮点到定点转换

这个示例展示了如何使用定点转换器应用程序将IIR过滤器从浮点转换为定点实现。二阶分段(也称为双二次)结构在使用定点算法时比直接实现传递函数的结构工作得更好。我们将展示成功实现“浮动到固定”转换的最可靠路径包括以下步骤:

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

  • 对过滤器的每个节点执行动态范围分析,即使用模拟最小值和模拟最大值仪器的测试台方法

  • 使用fvtool和dsp比较不同的双二次缩放实现和视图量化效果。用于分析和验证的光谱分析仪。

介绍

实现IIR过滤器的有效方法使用了二阶部分(SOS)各种滤波器结构。例如,我们需要从系统中删除干扰的高频音信号。实现这一目标的一种方法是使用低通滤波器设计。

设计一个低通椭圆滤波器

使用最小顺序低通椭圆直接形式I设计,以实现此示例的目的。过滤器的设计规格是:

  • 通频带频率边缘:0.4*pi

  • 阻带频率边缘:0.45*pi

  • 通带纹波:0.5 dB

  • 阻带衰减:80 dB

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

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:(结束-1)),1,3)。* sosmatrix(:,(1:3));a = sosmatrix(:,(5:6));num = b';缩放分电器部分的%矩阵den=a';分母部分的%矩阵

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

默认浮点操作

通过流式传输一些数据并查看其输入-输出响应来验证过滤器操作。首先尝试用干扰加性高频音调过滤(浮点)伪随机噪声信号(采样频率为300hz),看看音调是否被去除。这也将在以后作为我们测试台的参考信号。

WO = 75 /(300/2);%75 Hz音调;系统以300 Hz的频率运行inp_len = 4000;%输入样本数(信号长度)inp_-itf=0.5.*sin((π*Wo)。*(0:(inp_-len-1));%的语气影响= dsp范围。简介('采样率', 300,......“PlotAsTwoSidedSpectrum”假的,......'陈旧',真的,“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)输入=inp_sig+inp_itf;组合输入信号,范围(-1.0,1.0)OUT_1 = BIQUADLPFILTFLOAT(输入,NUM,DEN);%过滤器范围([输入,out_1])%可视化输入和过滤输出结束

清晰的范围biquadlpfiltfloat.%清理

默认定点操作

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

= dsp范围。简介('采样率', 300,......“PlotAsTwoSidedSpectrum”假的,......'陈旧',真的,“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.%清理

将浮点等级IIR过滤器函数转换为固定点

使用固定点转换器应用程序将对象转换为固定点,而不是依赖依赖默认的固定点设置。这种方法会产生更多的可视性和控制滤波器实现中的各个固定点类型,并导致更正确的定点操作。

要首先准备使用定点转换器应用程序,请创建一个要转换的函数,将所有筛选器数据类型选项设置为“自定义”:

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

创建测试台脚本

创建测试台以模拟和收集仪器模拟最小值和模拟最大值的所有数据类型控制信号路径。这将允许该工具稍后提出自动播放的定点设置。使用上面的代码部分作为测试台脚本,从浮点输入开始,并在模拟和收集最小数据之前验证测试台。之后,使用定点转换器应用程序将浮点函数实现转换为固定点功能实现。

类型myiirwpassbiquad_tb.m.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.s 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 = 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 APPS菜单或通过命令'fixedPointConverter'。

  • 在入口点函数字段中输入要转换的函数。

  • 通过输入测试台脚本名称来定义输入。

  • 通过模拟测试台,单击“分析”以收集范围。

  • 观察收集的'SIM min','sim max'和'提出的类型'值。

  • 根据需要调整“建议类型”字段。

  • 单击“转换”以生成固定点代码并查看报告。

结果定点MATLAB实现

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

类型myIIRLowpassBiquad_fixpt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%由MATLAB 9.3和定点设计器6.0%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%codegen函数输出=myIIRLowpassBiquad fixpt(inp,num,den)%myIIRNotchBiquad低通滤波器实现%用作MATLAB定点转换器应用程序示例的一部分。%版权所有2016 The MathWorks,Inc.fm=get_fimath();持久性bqLPFilter;如果isempty(bqLPFilter)bqLPFilter=dsp.BiquadFilter(…'SOSMatrixSource','Input port','ScaleValuesInputPort',false,…'SectionInputDataType','Custom','SectionOutputDataType','Custom','NumeratorProductDataType','Custom','DenominorProductDataType','Custom','NumeratorAccumeratorDataType','Custom','DenominorAccumeratorDataType','Custom StateDataType','“,”自定义“,…”OutputDataType“,”自定义“,”CustomSectionInputDataType“,”numerictype([],16,8)、”CustomSectionOutputDataType“,”numerictype([],16,8)、”CustomNumeratorProductDataType“,”numerictype([],32,26)、”CustomDenominatorProductDataType“,”numerictype([],32,23)、”CustomNumeratorAccumeratorDataType([],32,24),'CustomDenominorAccumulatorDataType',numerictype([],32,23),'CustomStateDataType',numerictype([],16,8),'CustomOutputDataType',numerictype([],16,15));end output=fi(bqLPFilter(inp,num,den),1,16,15,fm);end函数fm=get_fimath()fm=fimath(“RoundingMethod”、“Floor”、“OverflowAction”、“Wrap”、“ProductMode”、“FullPrecision”、“MaxProductWordLength”、“128”、“SumMode”、“FullPrecision”、“MaxSumWordLength”、“128”);结束

使用命令行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范围。简介('采样率', 300,......“PlotAsTwoSidedSpectrum”假的,......'陈旧',真的,“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(输入fi,fi(num,1,16),fi(den,1,16));作用域([inputFi,out_3])%可视化结束

清晰的范围%清理

浮点和定点输出之间的误差显示在下一个绘图上。错误似乎相当高。这些输出值差异的原因是通过选择二阶部分的缩放和排序来主导。在下一节中,我们说明了在实现中更早降低此错误的方法。

图=图;子批次(3,1,1);绘图(out_1);头衔(“浮点过滤器输出”); 子批次(3,1,2);绘图(out_3);头衔(“定点过滤器输出”);次要情节(3,1,3);情节(out_1 -双(out_3));轴([0 4000 -4e-2 7e-2]);标题(“错误”);

关闭(图);%清理

利用无限范数尺度重新设计椭圆滤波器

椭圆滤波器设计在使用“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。视图=“累积的”

注意,从滤波器的输入到每个部分的不同状态的累积内部频率响应都不超过0db。因此,这个设计是一个很好的定点实现候选。

获取Float与固定比较的LINF-NOR滤波器系数

请注意,SOS滤波器系数值会导致几乎相同的滤波器响应(无论是双精度还是16位定点值)。

sosmtrinf = biquad_linf.sosmatrix;sclvallinf = biquad_linf.scalevalues;fvt_comp_linf = fvtool(sosmtrinf,fi(sosmtrinf,1,16));传奇(fvt_comp_linf,'浮点(双)SOS,LINF缩放'......'定点(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-Norm双四滤波器的测试

再次执行定点转换器程序(如上所述),但使用Linf norm scaled filter系数值后,运行新转换的定点函数并查看输入输出结果。

= dsp范围。简介('采样率', 300,......“PlotAsTwoSidedSpectrum”假的,'陈旧',真的,......“YLimits”25 [-85],“标题”......“定点输入信号和linf -范数滤波器输出信号”......“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-NORM SOS缩放减少了定点实现错误

无限常态SOS缩放通常会产生较低误差的输出。

图1=图形;子地块(3,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过滤器缩放)');

关闭(图1);%清理关闭(图2);%清理

总结

我们概述了一个将浮点IIR过滤器转换为定点实现的过程。dsp。DSP System Toolbox™的双四滤波器对象配备了仿真最小和最大仪器功能,帮助定点转换器应用程序自动和动态缩放内部滤波器信号。此外,各种'fvtool'和dsp。SpectrumAnalyzer分析为用户提供工具,以便在流程的每个步骤中执行验证。