在MATLAB当中使用FDA Tool设计CIC滤波器时候可能遇到的问题
起因
今天一位同学向我询问CIC滤波器的使用,主要是使用FDA Tool进行滤波器设计时出现问题。由于一天都很忙的确没有时间,很抱歉。在晚上的时候抽空研究探讨一下。
FDA Tool使用
FDA Tool是MATLAB 常用的工具,其具体设计CIC滤波器的方法不进行赘述。导出方式分为两种,一种是Filter Design Function(with system objects). 另外一种是Data Filtering Function(with system objects)。其生成方式为点击FDA Tool 左上角"File–Generate MATLAB Code"进行选择。
这两种方式生成的函数是不同的。Filter Design Function是滤波器设计函数,实际上生成的是一个Ans类型的对象,该对象和结构体有点像.主要目的是可以引用一些Filter的结构参数。
那么Data Filtering Function则是实打实的进行滤波时候所使用的函数,输入是时间序列,输出是卷积后时间序列参数。
使用同一结构参数使用两种选项生成效果图如下:
Filter Design Function 选项:
function Hd = cic
%CIC Returns a multirate filter object.
% MATLAB Code
% Generated by MATLAB® 9.7 and DSP System Toolbox 9.9.
% Generated on: 16-Jun-2020 23:09:57
intf = 2; % Interpolation Factor
diffd = 1; % Differential Delay
numsecs = 2; % Number of Sections
Hd = dsp.CICInterpolator( …
‘InterpolationFactor’, intf, …
‘DifferentialDelay’, diffd, …
‘NumSections’, numsecs);
% [EOF]
该函数只要调用,就会返回当前滤波器设计的结构参数,而不是设计结果.
Data Filtering Function选项:
function y = cicfilter(x)
%CICFILTER Filters input x and returns output y.
% MATLAB Code
% Generated by MATLAB® 9.7 and DSP System Toolbox 9.9.
% Generated on: 16-Jun-2020 23:18:21
%#codegen
% To generate C/C++ code from this function use the codegen command.
% Type ‘help codegen’ for more information.
persistent Hd;
if isempty(Hd)
intf = 2; % Interpolation Factor
diffd = 1; % Differential Delay
numsecs = 2; % Number of Sections
Hd = dsp.CICInterpolator( …
‘InterpolationFactor’, intf, …
‘DifferentialDelay’, diffd, …
‘NumSections’, numsecs);
end
s = fi(x,1,16,15,‘RoundingMethod’,‘Round’,‘OverflowAction’,‘Saturate’);
y = step(Hd,s);
% [EOF]
总结二者区别
Data Filtering Function是可以直接使用的。
Filter Design Function实际上这个结构体返回的是滤波器设计相关参数,并非滤波器设计结果。
所以进行滤波的时候注意二者区别。
还有一个小细节,就是你生成.m文件的路径请存放在与当前函数相同路径。不然无法进行调用。程序进行运算时是被框定在路径内的。