主要内容

浮点定点IIR滤波器的转换

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

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

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

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

介绍

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

设计一个低通椭圆滤波器

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

  • 通带频率边缘: 0 4 π

  • 阻带频率边缘: 0 45 π

  • 通带纹波: 0 5 dB

  • 阻带衰减: 80年 dB

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

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

{“字符串”:“图1图:级响应(dB)包含一个坐标轴对象。坐标轴对象与标题级响应(dB)包含5线类型的对象。这些对象代表过滤器# 1:节# 1,# 1:过滤部分# 1 - 2,过滤器# 1:部分# 1 - 3,过滤# 1:部分# 1 - 4,过滤器# 1:部分# 1 - 5。”、“特克斯”:“级响应(dB)”,“乳胶”:[]}

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

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

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

{“字符串”:“图2图:级响应(dB)包含一个坐标轴对象。坐标轴对象2级响应(dB)包含标题行类型的对象。这些对象表示浮点(双)SOS,定点SOS(16位)。”、“特克斯”:“级响应(dB)”,“乳胶”:[]}

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)));%的语气影响范围=简介(SampleRate = 300,PlotAsTwoSidedSpectrum = false,ShowLegend = true, YLimits = 25 [-85],Title =“浮点输入信号和滤波器输出信号”,ChannelNames = {“浮点输入”,滤波器输出的});rng (12345);%的种子rng可重复的结果biquadLPFiltFloat = dsp.BiquadFilter (SOSMatrixSource =输入端口的,ScaleValuesInputPort = false);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;%清理

默认的定点操作

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

范围=简介(SampleRate = 300,PlotAsTwoSidedSpectrum = false,ShowLegend = true, YLimits = 25 [-85],Title =“定点输入信号和滤波器输出信号”,ChannelNames = {“定点输入”,默认的(错误的)定点输出的});rng (12345);%的种子rng可重复的结果bqLPFiltFixpt = dsp.BiquadFilter (SOSMatrixSource =输入端口的,ScaleValuesInputPort = false);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 - 2021版权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试验台。2016 - 2021 m %版权MathWorks, Inc . % %预先设计滤波器(系数存储在垫文件):% f =设计(fdesign.lowpass (Fp,置,美联社,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));% = 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 = 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”。

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

2021-11-29在屏幕截图1.33.04 PM.png

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

2021-11-29在屏幕截图1.36.19 PM.png

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

  • 观察收集“Sim分钟”,“Sim马克斯”,并提议类型的值。

2021-11-29在屏幕截图1.56.54 PM.png

  • 做出调整,根据需要提出类型的字段。

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

2021-11-29在屏幕截图2.02.14 PM.png

产生的定点MATLAB实现

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

类型myIIRLowpassBiquad_fixpt;
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %由MATLAB 9.3和定点设计师6.0% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % # = myIIRLowpassBiquad_fixpt codegen函数输出(输入,num den) % myIIRNotchBiquad Biquad使用低通滤波器实现%的MATLAB定点转换器的应用例子。% 2016年版权MathWorks公司调频= get_fimath ();持久bqLPFilter;如果isempty (bqLPFilter) bqLPFilter = dsp。BiquadFilter (…“SOSMatrixSource”、“输入端口”,…“ScaleValuesInputPort”,假的,…“SectionInputDataType”,“自定义”,…“SectionOutputDataType”,“自定义”,…“NumeratorProductDataType”,“自定义”,…“DenominatorProductDataType”,“自定义”,… '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: 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定点实现

运行转换定点函数和视图输入-输出结果。

范围=简介(SampleRate = 300,PlotAsTwoSidedSpectrum = false,ShowLegend = true, YLimits = 25 [-85],Title =“定点输入信号和滤波器输出信号”,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]);标题(“错误”);

图包含3轴对象。坐标轴对象1标题浮点滤波器输出包含一个类型的对象。坐标轴对象2标题定点滤波器输出包含一个类型的对象。坐标轴对象3标题包含一个错误类型的对象。

关闭(图);%清理

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

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

biquad_Linf =设计(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传奇=“上”);fvt_Linf.SosviewSettings。视图=“累积”;

{“字符串”:“图1图:级响应(dB)包含一个坐标轴对象。坐标轴对象与标题级响应(dB)包含5线类型的对象。这些对象代表过滤器# 1:节# 1,# 1:过滤部分# 1 - 2,过滤器# 1:部分# 1 - 3,过滤# 1:部分# 1 - 4,过滤器# 1:部分# 1 - 5。”、“特克斯”:“级响应(dB)”,“乳胶”:[]}

注意到没有一个累积内部频率响应,测量从滤波器的输入到每个部分的各种状态,超过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缩放”);

{“字符串”:“图2图:级响应(dB)包含一个坐标轴对象。坐标轴对象2级响应(dB)包含标题行类型的对象。这些对象表示浮点(双)SOS Linf缩放、定点(16位)SOS Linf伸缩。”、“特克斯”:“级响应(dB)”,“乳胶”:[]}

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比例滤波器系数值,运行新的定点转换函数和视图输入-输出结果。

范围=简介(SampleRate = 300,PlotAsTwoSidedSpectrum = false, ShowLegend = true,YLimits = 25 [-85],Title =“定点输入信号和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]);标题(“错误”);

图包含3轴对象。坐标轴对象1标题浮点滤波器输出包含一个类型的对象。坐标轴对象2标题定点(Linf-norm SOS)滤波器输出包含一个类型的对象。坐标轴对象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过滤器扩展));

图包含2轴对象。坐标轴对象1标题定点误差(默认SOS过滤器扩展)包含一个类型的对象。坐标轴对象2标题定点误差(Linf的SOS过滤器扩展)包含一个类型的对象。

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

总结

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