matlab中滤波器函数filter的C语言实现
来源:互联网 发布:开淘宝店客服怎么设置 编辑:程序博客网 时间:2024/04/29 13:25
使用matlab对传感器采集的数据进行低通滤波处理,选定的是切比雪夫I型滤波器,使用matlab自带的函数滤波正常,滤波程序如下:
%设计低通滤波器
wp=3*2/fs; %通带边界频率15Hz(归一化频率)
ws=15*2/fs; %阻带边界频率15Hz(归一化频率)
rp=1;rs=30;Nn=512; %通带波纹和阻带衰减,以及绘制频率特性的数据点数
[nn,wn]=cheb1ord(wp,ws,rp,rs); %求得数字滤波器的最小阶数和归一化截止频率
[b,a]=cheby1(nn,rp,wn); %按最小阶数、通带波纹和截止频率设计数字滤波器
DACCx=filter(b,a,ACCx1);%对输入信号进行滤波
DACCy=filter(b,a,ACCy1);%对输入信号进行滤波
DACCz=filter(b,a,ACCz1);%对输入信号进行滤波
DGROx=filter(b,a,GROx1);%对输入信号进行滤波
DGROy=filter(b,a,GROy1);%对输入信号进行滤波
其中ACCx1、ACCy1、ACCz1、GROx1、GROy1是采集的传感器原始数据序列,这里就不再添加数据。计算出的滤波器参数如下:
a(1)=1;a(2)=-2.969516349642659;a(3)=2.940162369075828;a(4)=-0.970632740348324;
b(1)=0.165988560552055*10^(-5);b(2)=0.497965681656165*10^(-5);b(3)=0.497965681656165*10^(-5);b(4)=0.165988560552055*10^(-5);
在STM32中进行相同的低通滤波操作,所以需要使用C语言实现filter函数,根据自己的理解编写的filter程序如下:
%使用差分方程进行低通滤波,观察效果
a1=1;a2=-2.9695;a3=2.9402;a4=-0.9706;
b1=0.1660*10^(-5);b2=0.4980*10^(-5);b3=0.4980*10^(-5);b4=0.1660*10^(-5);
x=ACCx1;
y(1)=b1*x(1);
y(2)=b1*x(2)+b2*x(1)-a2*y(1);
y(3)=b1*x(3)+b2*x(2)+b3*x(1)-a2*y(2)-a3*y(1);
for i=4:len
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));
end
先将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的系数误差太大会产生累积误差,所以系数尽量精确。
- matlab中滤波器函数filter的C语言实现
- matlab 与C语言关于filter函数的实现
- c语言实现matlab上的filter函数
- matlab中filter和filtfilt函数的C语言
- MATLAB中filter函数的C代码实现
- matlab filter与filtfilt函数实现,C语言实现
- C语言实现Matlab自带的滤波filter()函数
- C语言实现Matlab中findpeaks函数
- 单片机中(C语言)IIR滤波器的实现
- 单片机中(C语言)IIR滤波器的实现
- C语言实现matlab的butter函数
- 用Matlab及C语言实现低通滤波器的设计
- 标准Gabor滤波器的C语言实现
- C语言使用matlab生成的滤波器头文件
- matlab中实现Gabor滤波器
- matlab中实现Gabor滤波器
- matlab中实现Gabor滤波器
- 【转】Matlab里filter的c实现
- android中判断网络连接是否可用 2g、3g、wifi
- 告别码农,成为真正的程序员
- Numpy 和 Matplotlib 基础
- env: ruby_executable_hooks: No such file or directory解决方法
- 接收中文参数乱码解决方法
- matlab中滤波器函数filter的C语言实现
- 什么是shell以及如何编写最简单的shell
- 1 Tesseract-ocr 系列 : Ubuntu16.04安装tesseract-ocr 3.04.02
- 在ubuntu上搭建ftp服务器及使用
- 设计模式——策略模式
- HDU 6040 Hints of sd0061
- DL4J解决Score NaN
- Mapreduce编程1之WordCount
- 算法-排序之快速排序