主要内容

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

这个例子说明了如何使用定点转换器应用到IIR滤波器从浮点转换为定点实现。二阶部(也被称为双二次)结构使用定点算术比直接实现传递函数的结构时更好地工作。我们将证明,一个成功的“float到固定的”转换的最可靠途径包括以下步骤:

  • 选择一个二阶切片(SOS)结构,即dsp.BiquadFilter

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

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

介绍

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

设计一个低通椭圆滤波器

使用我为这个例子设计的最小阶低通椭圆直接形式。过滤器的设计规格如下:

  • 通频带频率边缘: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(双二阶,'传奇'“上”);fvt.SosviewSettings.View =“累积”;

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

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

sosMatrix = biquad.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));= sosMatrix (:, (6));num = b”;分子分段的比例矩阵穴= ';分母部分的%矩阵

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

默认的浮点操作

通过它流一些数据并查看其输入 - 输出响应验证过滤操作。第一次尝试过滤与干扰添加剂高频音调一个(浮点)的伪随机噪声信号(在300赫兹采样的),以查看是否音被除去。这也将在以后作为一个测试平台我们的参考信号。

我们= 75 / (300/2);% 75 Hz音;系统运行在300hzinp_len = 4000;%输入采样个数(信号长度)inp_itf = 0.5。* sin((π*我们)。* (0:(inp_len-1)));%的语气影响范围= dsp.SpectrumAnalyzer(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,...“ShowLegend”,真的,“YLimits”,[ -  85 25]...“标题”浮点输入信号和滤波输出信号...“ChannelNames”,{“浮点输入”滤波器输出的});RNG(12345);%为可重复的结果seed RNGbiquadLPFiltFloat = dsp。BiquadFilter (“SOSMatrixSource”输入端口的...“ScaleValuesInputPort”、假);K = 1:10 inp_sig =兰特(inp_len,1) -  0.5;%范围内的随机值(-0.5,0.5)Input = inp_sig + inp_itf;%组合输入信号,范围(-1.0,1.0)out_1 = biquadLPFiltFloat(输入、num穴);%过滤器范围([输入,out_1])%可视化输入和过滤输出结尾

清晰的范围biquadLPFiltFloat;%清理

默认的定点操作

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

范围= dsp.SpectrumAnalyzer(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,...“ShowLegend”,真的,“YLimits”,[ -  85 25]...“标题”“定点输入信号和滤波器输出信号”...“ChannelNames”...“定点输入”“默认(不正确)定点输出”});RNG(12345);%为可重复的结果seed RNGbqLPFiltFixpt = 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)输出2插孔= bqLPFiltFixpt(inputFi,科幻(NUM,1,16),科幻(DEN,1,16));范围([inputFi,输出2插孔])%可视化结尾

清晰的范围bqLPFiltFixpt;%清理

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

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

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

类型myIIRLowpassBiquad;
函数输出= myIIRLowpassBiquad(INP,NUM,书房)%myIIRNotchBiquad双二阶低通滤波器的实现%用作固定点转换器应用程序实例的MATLAB的一部分。%版权所有2016年MathWorks公司的持续bqLPFilter;如果的isEmpty(bqLPFilter)bqLPFilter = dsp.BiquadFilter(... 'SOSMatrixSource', '输入端口',...... 'ScaleValuesInputPort',假的,...... 'SectionInputDataType', '自定义',...... 'SectionOutputDataType','自定义',...... 'NumeratorProductDataType', '自定义',...... 'DenominatorProductDataType', '自定义',...... 'NumeratorAccumulatorDataType', '自定义',...... 'DenominatorAccumulatorDataType', '自定义',..'StateDataType', '自定义',...... 'OutputDataType', '定制');端输出= bqLPFilter(INP,NUM,书房);结尾

创建测试平台脚本

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

类型myIIRLowpassBiquad_tb.m;
%%试验台myIIRLowpassBiquad.m%版权所有2016 The MathWorks公司,设计预公司%%滤波器(存储在MAT文件系数):%F =设计(fdesign.lowpass( 'Fp的,的Fst,鸭,AST',0.4,0.45,0.5,80),...% '椭球', 'FilterStructure', 'df1sos', 'SYSTEMOBJECT',真);%sosMatrix = f.SOSMatrix;%sclValues = f.ScaleValues;%B = repmat(sclValues(1:(端-1)),1,3)* sosMatrix(:,(1:3));%A = sosMatrix(:,(5:6));%NUM = B';%DEN = A';%保存( 'myIIRLowpassBiquadDesign.mat', 'B', 'A', 'NUM', '巢穴');加载( 'myIIRLowpassBiquadDesign.mat');%%干扰信号,在使用范围内的值(-0.5,0.5)禾= 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'。

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

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

  • 点击“Analyze”通过模拟测试台来收集范围。

  • 观察收集的“Sim Min”、“Sim Max”和“建议类型”值。

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

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

结果定点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;如果的isEmpty(bqLPFilter)bqLPFilter = dsp.BiquadFilter(... 'SOSMatrixSource', '输入端口',...... 'ScaleValuesInputPort',假的,...... 'SectionInputDataType', '自定义',...... 'SectionOutputDataType','自定义',...... 'NumeratorProductDataType', '自定义',...... 'DenominatorProductDataType', '自定义',...... 'NumeratorAccumulatorDataType', '自定义',...... 'DenominatorAccumulatorDataType', '自定义',..。“StateDataType”,“自定义”,…“OutputDataType”、“定制”、“CustomSectionInputDataType’,numerictype(8)[], 16日,CustomSectionOutputDataType, numerictype(8)[], 16日,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:\\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.SpectrumAnalyzer(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,...“ShowLegend”,真的,“YLimits”,[ -  85 25]...“标题”“定点输入信号和滤波器输出信号”...“ChannelNames”,{“定点输入”“定点滤波器输出”});RNG(12345);%为可重复的结果seed RNGK = 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));轴([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.View =“累积”;

注意,没有累积内部频率响应,从输入到过滤器每部分的各种状态的测量,超过0 dB。因此,这样的设计是一个很好的候选人的定点实现。

获得浮点与固定比较的linf -范数滤波器系数

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

sosMtrLinf = biquad_Linf.SOSMatrix;sclValLinf = biquad_Linf.ScaleValues;fvt_comp_Linf = fvtool(sosMtrLinf,科幻(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-Norm双四滤波器的测试

再次执行定点转换器程序(如上所示),但使用linf范数缩放滤波系数值后,运行新的转换的定点函数并查看输入-输出结果。

范围= dsp.SpectrumAnalyzer(“SampleRate”, 300,...“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,...“YLimits”,[ -  85 25]“标题”...“定点输入信号和linf -范数滤波器输出信号”...“ChannelNames”...“定点输入”“定点linf -范数滤波器输出”});RNG(12345);%为可重复的结果seed RNGK = 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 -范数SOS标度减少定点实现误差

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

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

fig2 =图。副区(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.BiquadFilter对象的DSP系统工具箱™配备了模拟最小和最大的仪器功能,帮助定点转换器应用程序自动和动态地扩展内部滤波器信号。此外,各种“fvtool”和dsp.SpectrumAnalyzer分析向用户提供工具,以在该过程的每个步骤进行验证。