matlab中滤波器函数filter的c语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近使用matlab对传感器采集的数据进行低通滤波处理,选定的是切比雪夫I型滤波器,使用matlab自带的函数滤波正常,滤波程序如下:
1.%设计低通滤波器
2.wp=3*2/fs; %通带边界频率15Hz(归一化频率)
3.ws=15*2/fs; %阻带边界频率15Hz(归一化频率)
4.rp=1;rs=30;Nn=512; %通带波纹和阻带衰减,以及绘制频率特性的数据点数
5.[nn,wn]=cheb1ord(wp,ws,rp,rs); %求得数字滤波器的最小阶数和归一化截止频率
6.[b,a]=cheby1(nn,rp,wn); %按最小阶数、通带波纹和截止频率设计数字滤波器
7.
8.DACCx=filter(b,a,ACCx1);%对输入信号进行滤波
9.DACCy=filter(b,a,ACCy1);%对输入信号进行滤波
10.DACCz=filter(b,a,ACCz1);%对输入信号进行滤波
11.
12.DGROx=filter(b,a,GROx1);%对输入信号进行滤波
13.DGROy=filter(b,a,GROy1);%对输入信号进行滤波
复制代码
其中ACCx1、ACCy1、ACCz1、GROx1、GROy1是采集的传感器原始数据序列,这里就不再添加数据。计算出的滤波器参数如下:
恩,好的,等直接使用matlab生成C代码试一下,主要是我想先弄清楚filter的计算原理,之前的程序中有一点有问题,递推公式有个符号写错了,修改如下:
1.for i=4:len
2. y(i)=(b1*x(i)+b2*x(i-1)+b3*x(i-2)+b4*x(i-3)-a2*y(i-1)-a3*y(i-2)-a4*y
(i-3));
3.end
复制代码
但是因为是递推来计算差分方程,所以差分方程的前三个值的确定方法和递推方法不太一样,但是我不知道怎么确定y(t)的前三个值。所以直接抄用matlab的滤波函数计算出来的y(t)的前三个值带入,但是只有前几十个数据与matlab的filter函数计算相同,其他值计算的结果不一样,也不知道哪里有问题。请问filter函数计算差分方程的过程是怎么样的呢?
STM32支持浮点运算,具体效果怎么样,我想先写好C程序尝试一下看看。
这是个很好的问题,我也想知道这个前三个值是怎么计算来的,MATLAB仿真时到底是怎么算的?我以前做FIR滤波器,比如四阶的,是直接前面四个值不做处理呢,还是第一个值不做处理,后面看有几个输入信号点就用几个,直到满足五个点之后五个系数全用上?——在这个问题上确实纠结了很久,但没去研究,直接取前四个值不作处理。
你这个,也是一样了,要不试试前面有几个数据点就用几个系数试试?看看什么结果,讨论讨论?
我在网上看了一个帖子说是filter函数怎么计算的,第一个值的计算就是我程序中的过程,也就是如果为3阶,那么n=1的时候,x(n-1)、x(n-2)、x(n-3)、y(n-1)、y(n-2)、y(n-3)全都赋值为0,所以y(1)=b1*x(1),计算结果也与filter计算结果相同,但是y(2)、y(3)按照这个思路计算出来的结果不相同,所以没有搞明白怎么回事。
问题已解决,先将filter的计算过程说明一下,以三阶为例:
当n=1时,x(n-1)、x(n-2)、x(n-3)、y(n-1)、y(n-2)、y(n-3)全都赋值为0,所以y(1)=b1*x(1);当n=2时,x(n-2)、x(n-3)、y(n-2)、y(n-3)全都赋值为0,所以y(2)=b1*x(2)+b2*x(1)-a2*y(1); 当n=3时,x(n-3)、y(n-3)全都赋值为0,所以
y(3)=b1*x(3)+b2*x(2)+b3*x(1)-a2*y(2)-a3*y(1);
自此计算出y(1)、y(2)、y(3);
当n>=4时就可以采用递推运算
y(i)=b1*x(i)+b2*x(i-1)+b3*x(i-2)+b4*x(i-3)-a2*y(i-1)-a3*y(i-2)-a4*y(i-3);其中
i=n,n>=4;
但是需要注意的是,进行递推运算是如果a、b的系数误差太大会产生累积误差,所以系数尽量精确,采用滤波器计算时的参数,如下:
1.%使用差分方程进行低通滤波,观察效果
2.a(1)=1;a(2)=-2.969516349642659;a(3)=2.940162369075828;a(4)=-0.970632740
348324;
3.b(1)=0.165988560552055*10^(-5);b(2)=0.497965681656165*10^(-5);b(3)=0.49
7965681656165*10^(-5);b(4)=0.165988560552055*10^(-5);
复制代码
发现计算结果与使用filter函数计算结果完全相同。:lol