自从用了Matlab以后,很多事情都交给这款强大的软件进行处理,例如撰写M文件批量处理excel表格数据,数据计算(嗯,其实MathCAD也挺好用,不过更习惯在Matlab中计算)等。今天介绍最近用到的两个Matlab中的工具:FDAtool和s-function中的c builder。

在嵌入式产品中,免不了很多硬件信号的采样,尤其是电源类产品,有电压,电流等。虽然硬件线路上会有运放+RC电路进行滤波,但是如果器件参数未匹配好或者PCB走线不合理等,难免还是会有杂波涌入到MCU的采样端口,所以往往在软件端也需要对信号做一些滤波处理。以下以一阶Butterworth低通滤波器设计为例,讲一讲如何使用Matlab FDATool。

进入FDATool页面:直接在命令行窗口输入fdatool即可

界面很明晰,根据你想要的滤波器类型,填写相应的参数。下图为一阶Butterworth IIR滤波器的配置页面,假设采样频率为50kHz,截止频率为5kHz,制定一阶。参数确认好以后,点击Design Filter即可。

如果想要查看该滤波器的分析结果,可以选择Analysis菜单,下面可以查看各种分析结果,例如幅值响应,阶跃响应。

4. 如果想要得到设计出的IIR系数,可以选择Analysis下的Filter Coefficients,其中Numerator和Denominator即为滤波器的A,B参数,以下图为例可得:Y(n) =  0.52528X(n)+ 0.52528X(n-1)+0.5095254494944Y(n-1)

5. 得到滤波器参数以后即可按照IIR的公式通过软件实现。由于并非所有的芯片都支持浮点运算,那么可以进一步将浮点运算转为Q格式的整型运算,方法与前面几期内容类似,详细可以参看:

S-Function Builder

在Matlab/Simulink中虽然有很多模块供我们使用,但是还是有许多复杂的逻辑时序运算难以用现成的模块进行仿真模拟。

此外还有不少应用场景难以在实际硬件平台中模拟,尤其是一些极端条件的发生场景。所以要想验证这部分的代码功能就比较困难。

这个时候不妨尝试下使用Matlab的s-function模块来进行测试。s-function支持载入C语言代码,通常可以分为两种形式:

一种是按照s-function的规则,在其提供的初始化,输出,终止等函数接口中配置输入输出参数,时间参数,更新函数等,这个方法对于初学者来说,理解上有一定难度,因为其中涉及很多simulink中特定函数与参数。

另外一种为s-function builder,通过可视化界面配置参数,完成配置后只要在更新窗口中放入我们自己的功能函数即可,相对来说简单了很多。

以上面的例子为例,讲一讲如何通过s-function builder实现一阶IIR。

新建一个model,然后在simulink中找到s-function。另外如果有使用上的问题,也可以打开S-function Examples,里面有很多例子可以供参考。

2. 拖一个s-function builder到你的model中,打开:

由于我们有四个状态量:Xn, Xn-1, Yn, Yn-1, 因此discrete states设定为4,初始值都为0;采样模式设定为离散模式,时间为1/50000, 这个对应我们实际代码中IIR的运行频率对应的周期。

3. 加入我们的功能函数。在s-function builder中,用xD[n]表示对应的离散状态量,如下代码的注释。

/* xD[0]: x(n) * xD[1]: x(n-1) * xD[2]: y(n-1) * xD[3]: y(n)*/

所以滤波值为:xD[3] = 0.2452*xD[0] + 0.2452*xD[1]+0.94944*xD[2];

4. 将滤波值赋值给s-function输出

注意:要编译C代码,先要通mex设定,进行编译器关联。关联方法,请参考前面几期内容。

6. 为了验证代码是否ok,我们可以也加入step信号,看看响应是否跟FDAtool中的一样。

对比一下,可以认为是一致的。

7. 另外还可以注入高频杂波,看看滤波效果: