主要内容

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

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

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

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

  • 比较替代双二次缩放的实施方式和图量化效应由于使用“fvtool”和dsp.SpectrumAnalyzer用于分析和验证不同的选择。

介绍

实现IIR滤波器的一种有效方法是使用二阶分段(SOS)双四阶滤波器结构。例如,假设我们需要从系统中移除干扰高频音调信号。实现这一点的一种方法是使用低通滤波器设计。

设计一个低通椭圆滤波器

在本例中,使用最小阶低通椭圆直接I型设计。过滤器的设计规格如下:

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

  • 阻带频率边缘:0.45*pi

  • 通带纹波:0.5 dB

  • 阻带衰减:80 dB

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

双二阶=设计(fdesign.lowpass('Fp的,的Fst,鸭,AST',0.4,0.45,0.5,80),...“椭球”“过滤器结构”'df1sos'“系统对象”,真正的);fvt = fvtool (biquad,“传奇”“开”);fvt.SosviewSettings.View =“累积”

获得浮动与固定比较的过滤系数(SOS, B, A)

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

sosMatrix = biquad.SOSMatrix;sclValues = biquad.ScaleValues;fvt_comp = fvtool(sosMatrix,科幻(sosMatrix,1,16));传说(fvt_comp,“浮点(double) SOS”“定点(16位)SOS”)b=repmat(sclValues(1:end-1)),1,3.*sosMatrix(:,(1:3));a=sosMatrix(:,(5:6));num=b';%标度分子截面矩阵穴= ';分母部分的%基质

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

默认的浮点操作

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

Wo=75/(300/2);% 75 Hz音;系统运行在300hzinp_len=4000;%输入样本数(信号长度)inp_itf = 0.5。* sin((π*我们)。* (0:(inp_len-1)));%单音干扰= dsp范围。简介(“采样器”,300,...'PlotAsTwoSidedSpectrum',错误的,...“ShowLegend”,真的,“YLimits”25 [-85],...'标题'浮点输入信号和滤波输出信号...'ChannelNames'{“浮点输入”“过滤器输出”}); rng(12345);%为rng设定种子,以获得可重复的结果biquadLPFiltFloat = dsp.BiquadFilter(“SosMatrix源”“输入端口”...“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=双四边形滤波器浮点(输入,数值,数据);% 筛选范围([输入,OUT_1])%可视化输入和过滤输出结束

清除范围双四边形滤波器%清理

默认的定点操作

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

= dsp范围。简介(“采样器”,300,...'PlotAsTwoSidedSpectrum',错误的,...“ShowLegend”,真的,“YLimits”25 [-85],...'标题'“定点输入信号和滤波输出信号”...'ChannelNames'...{“定点输入”“默认(不正确)定点输出”}); rng(12345);%为rng设定种子,以获得可重复的结果bqLPFiltFixpt = dsp.BiquadFilter(“SosMatrix源”“输入端口”...“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])%想象结束

清除范围bqlpfiltexpt%清理

将浮点双二次IIR滤波器函数转换为定点

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

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

类型myIIRLowpassBiquad
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

创建测试平台脚本

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

类型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.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应用菜单或通过命令“fixedPointConverter”。

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

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

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

  • 观察收集的“Sim最小值”、“Sim最大值”和“建议类型”值。

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

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

导致定点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. if isempty(bqLPFilter)BiquadFilter(…'SOSMatrixSource', 'Input port',…“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.prj” %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%产生于16  -  10月2014%脚本。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建类的配置对象“coder.FixPtConfig”。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CFG = coder.config( 'fixpt');cfg.TestBenchName = {sprintf的( 'S:\\工作\\ 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',错误的,...“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])%想象结束

清除范围%清理

浮点和定点输出之间的误差显示在下一个图上。误差似乎相当大。输出值差异的原因主要是二阶部分的缩放和排序选择。在下一节中,我们将在实现的早期说明减少此误差的方法。

无花果=图;次要情节(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的,的Fst,鸭,AST',0.4,0.45,0.5,80),...“椭球”“过滤器结构”'df1sos'...“SOSScaleNorm”“Linf”“系统对象”,对);fvt_Linf=fvtool(双四次线,“传奇”“开”);fvt_Linf.SosviewSettings。视图=“累积”

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

获得浮点与固定比较的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范围。简介(“采样器”,300,...'PlotAsTwoSidedSpectrum',错误的,“ShowLegend”,真的,...“YLimits”25 [-85],'标题'...“定点输入信号和LINF范数滤波器的输出信号”...'ChannelNames'...{“定点输入”'定点Linf范数过滤器输出'}); 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=Myiirlinbiquad_fixpt(...inputFi,科幻(numLinf,1,16),科幻(denLinf,1,16));范围([inputFi,out_4])%想象结束

清除范围%清理

使用Linf范数SOS缩放减少定点实现错误

无穷范数SOS缩放通常产生误差较小的输出。

图一=图;次要情节(1,1);情节(out_1);标题(“浮点滤波器输出”);次要情节(3、1、2);情节(out_4);标题(“定点(林范数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 System Toolbox™的双四滤波器对象配备了仿真最小和最大仪器功能,帮助定点转换器应用程序自动和动态缩放内部滤波器信号。此外,各种'fvtool'和dsp。SpectrumAnalyzer分析为用户提供工具,以便在流程的每个步骤中执行验证。