MATLAB实现滤波器,滤波器类似:低通、高通、带通、带阻。
实现方式:(1)利用Matlab代码生成DLL供其他模块调用方法。
优点:实现速度快,可利用C直接调用matlab的DLL快速实现算法功能,无需用C考虑算法实现过程。
缺点:运行需要电脑上具备matlab运行环境MCR(或电脑上具有完整的matlab版本存在),且配置调试麻烦。
如翻译bpfilter滤波器,C调用matlabDLL
1:添加matlab 生成的.dll .h .lib到工程中。
2:添加相应头文件:
#pragma comment( lib, "libeng.lib" )
#pragma comment( lib, "libmx.lib" )
#pragma comment( lib, "libmat.lib" )
#pragma comment( lib, "mclmcrrt.lib" )
#include "bpfilter.h"
#pragma comment( lib, "bpfilter.lib" )
#include "mclcppclass.h"
3:利用特定函数实现数据操作,转入-调用DLL计算-转出。
参考http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/
方法二:直接用C语言逐条翻译matlab滤波器。
优点:C代码可脱离matlab环境独立运行
缺点:翻译matlab代码费时费力。
如:翻译低通滤波器主函数:y=lowp(x,f1,f3,rp,rs,Fs)
子函数1:[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);%wn就是0.1即是rp---通带衰减
子函数2:[bz1,az1]=cheby1(n,rp,wp/pi);
子函数3: y=filter(bz1,az1,x);%函数被封装隐藏,对序列x滤波后得到的序列y
子函数1:cheb1ord求阶数,已翻译。
子函数2:cheby1翻译。求滤波器结构分子分母
包含{cheb1ap,cheb1ap,lp2lp,bilinear
...等子函数
}
子函数3:filter实现输入信号与滤波器结构卷积运算,原理如下,源代码不可见
系统输入输出常系数差分方程:
,
x[k]:输入,y[k]:输出,已知差分方程N个初始状态y[k]和x[k],-N<=k<=-1;
迭代计算系统输出:
。b为分子系数矩阵,a为分母系数矩阵;
Filter(b,a,x)函数示例:来源网络。
MATLAB滤波器翻译成C语言关键,filter函数--built in function
搞了一直总算找到点有用的资料。
I have found a text described the Direct Form II Transposed used in the Matlab filter function and it works perfectly. See script below. Other implementations are also available but with error of around 1e-15, you'll see this by running the script yourself.
一种实现方式是根据差分方式的方式进行递归运算。
function y1=filter_test01 (bq,aq,x,ord)
详见:点击打开链接
另一种是Direct Form II Transposed
%Direct Form II Transposed
function y2=filter_test02 (bq,aq,u,ord)
详见:点击打开链接
三种运算速度及误差对比:
1:MATLAB filter函数
2:filter_test01
3:filter_test02
% Naive implementation实现方法运算速度
误差分析:4阶