技术心得记录:常用的滤波算法

简介: 技术心得记录:常用的滤波算法

滤波是传感器处理中的重要算法,经常接触底层常常用到,以下总结了一些滤波算法,供以后参考调用。


一、低通滤波


1.1RC滤波的数字低通滤波


  指在截止频率fc的时候,增益为-3db(Aup=0.707)的滤波器,也是模电书中出现的第一种硬件滤波器,以下是对应的软件形式的1阶RC滤波器的数字形式(本断程序节选自匿名4轴)


  一阶形式:Y(n)=(1-a)Y(n-1)+aX(n)


  下式中 oldData表示上一次的输出Y(n-1) newData表示新的输入X(n)


1   float LopPassFilter_RC_1st(float oldData, float newData, float a)


2   {


3     return oldData (1 - a) + newData a;


4   }


5


6   计算比例系数a:


7


8   float LopPassFilter_RC_1st_Factor_Cal(float deltaT, float Fcut)


9   {


10     return deltaT / (deltaT + 1 / (2 M_PI Fcut));


11   }


1.2均值滤波:


  把一段时间内的数据累加后求平均值,达到平滑的作用,适用性广泛,元素越多滤波效果越好时延越高。


1   uint16_t LowPassFilter_Average(uint16_t data【】,uint16_t length)


2


3   {


4


5     uint32_t add=0;


6     uint16_t result;


7     int i;


8


9     for(i=0;i

10     {


11       add += data【i】;


12     }


13     result=add/length;


14     return result;


15   }


16


17   //data【】放入一段时间里的数值,length:data数组的长度


1.3滑动滤波


  在均值滤波的基础上,加上比例系数,最新的数据具有更大的比例,增加时效性。


  以下列举了一个三个元素的滑动滤波


1   double LowPassFilter_Silding(double dataNewest,double dataMiddle,double dataLast)


2   {


3


4     #define PROPORTIONNEW 0.55


5


6     #define PROPORTIONMID 0.35


7


8     #define PROPORTIONLAST (1- PROPORTIONNEW -PROPORTIONMID )


9


10     double result;


11     result = PROPORTIONNEW dataNewest+ PROPORTIONMID dataMiddle+PROPORTIONLAST dataLast;


12     return result;


13   }


  三个输入参数为连续3个读出的数据,其中 dataNewest 为最新数据,对应比例系数PROPORTIONNEW ,另外两个同理。比例系数根据需要改变


1.4中值滤波


  当传感器采集的数据存在毛刺时,为了提取其中有效的数据,采用中值滤波的算法,只保存数据大小在中间的数值。


1   uint16_t LowPassFilter_GetMiddleValue( uint16_t pusBuffer, uint8_t ucLength )


2   {


3     uint8_t i;


4     uint16_t usMiddle,usMax,usCount = 0,usPoint;


5


6     while( usCount <= (ucLength/2) )


7     {


8       usPoint = 0;


9       usMax = pusBuffer【0】;


10       for( i=1;i

11       {


12         if( pusBuffer【i】 > usMax )


13         {


14           usMax = pusBuffer【i】;


15           usPoint = i;


16         }


17       }


18       usMiddle = usMax;


19       pusBuffer【usPoint】 = 0;


20       usCount++;


21     }


22     return usMiddle;


23   }


  pusBuffer:待改变的起始地址 ucLength:长度


  特别注意:为了运行效率,这个方法中没有对数组进行备份,会直接操作到源 data并改变元素的值。


  这个快速中值算法原理是只排序最大或者最小值的一半,一半中的最后一个即为中间值


1.5去除极值的XX滤波


  把中值滤波的优点结合给其他滤波,使其他滤波器也具有够剔除少量毛刺的能力。


  以下例子结合的是均值滤波,即去除极值的均值滤波


1   int16_t LowPassFilter_RemoveExtremumAverage(int16_t data【】,int16_t length)


2   {


3     #define EXTERMUM_NUMBER 1 //number of extermum


4     int32_t sum=0;


5     int16_t i;


6


7     if(length<=2EXTERMUM_NUMBER)


8     {


9       return 0;//length shorter than 2EXTERMUM_NUMBER, return err


10     }


11


12     //sort


13     BubbleSort_int16(data,length);


14     


15


16     //average filter


17     for(i=EXTERMUM_NUMBER;i

18     {


19 //代码效果参考:http://www.jhylw.com.cn/424538107.html

      sum+=data【i】;

20     }


21


22     return sum/(length-2EXTERMUM_NUMBER);


23   }


  输入长度为length的数组data【】。EXTERMUM_NUMBER定义去除极值的个数(1表示去掉1个最大值和1个最小值)。先用排序法(本例使用下面给出的冒泡排序)对data数组进行排序,去除1个最大值和1个最小值后剩余求平均值。


  这段代码可能出现两个错误


  1、length比2倍的EXTERMUM_NUMBER短,本例用return 0一笔带过,实际需要在程序return 0处作处理


  2、如果输入length过长会使32位的sum在累加过程溢出,如果length很长建议改变均值滤波的顺序在累加之前线进行除法


  下面给出子程序冒泡排序


1   void BubbleSort_int16(int16_t a,int len)


2   {


3     int i;


4     int j;


5     int mid;


6     for(i=0;i

7     {


8       for(j=0;j

9       {


10         if((a+j)>(a+j+1))


11         {


12           mid=(a+j);


13           (a+j)=(a+j+1);


14           (a+j+1)=mid;


15         }


16       }


17     }


18   }


1.6巴特沃斯低通滤波


  借助MATLAB使用数字滤波的方法来模拟巴特沃斯滤波器:


  IIR滤波的基本结构 y(n)+a1y(n-1)+a2y(n-2)....aiy(n-i)=b0x(n)+b1x(n-1)+b2x(n-2)....+bix(n-i);


  这里简单把IIR滤波理解为滑动滤波的进阶形式,其中i为阶数,x(n)为本次输入,x(n-1)为//代码效果参考:http://www.jhylw.com.cn/425229475.html

上一次输入,如此类推x(n-i)为i次前的输入。y(n)为输出,y(n-1)为上一次的输出。y(n-i)为i次前的输出。 a和b分别为比例。

  系数a和b改变达到模拟不同采样频率、不同截止频率的滤波效果。


  以下使用matlab计算一个1000HZ采样频率,100HZ截止频率,2阶的巴特沃斯滤波器的IIR系数:


  ]fdatool


1.7切比雪夫低通滤波


1.8卡尔曼滤波


卡尔曼滤波是一种预测型滤波,这里把卡尔曼滤波归纳到低通滤波中,是因为在适用过程中卡尔曼增益Kg会慢慢收敛,变成跟低通滤波一样的效果


1 float LowPassFilter_kalman(float data)


2 {


3   static float Xlast=0.01;//初值 Xlast&Xpre


4   static float P=0.1;//Plast&Pnow


5   const float Q=0.44;//自己感觉的方差


6   const float R=0.54;//测量器件的方差


7   float Kg,PP;//


8   float Xnow;//经过卡尔曼滤波的值 Xnow


9


10   //1式A=1 无输入


11   PP=P+Q; //Ppre=Plast+Q (2)


12   Kg=PP/(PP+R); //更新Kg Ppre/Ppre+R(4)


13   Xnow=Xlast+Kg(data-Xlast); // Xnow = Xpre+Kg(Z(k)-HXpre)(3)


14   P=(1-Kg)PP; //Pnow=(I-Kg)Ppre(5) 由于Pnow不会再使用,所以更新Plast=Pnow


15   Xlast=Xnow;


16


17   return Xnow;


18 }


二、高通滤波


三、融合滤波


3.1互补滤波


当有两种同一类型参数的时候,虽然不同它们的特性又刚好互有长短,为了各取所长,互补其短,所以叫互补滤波。以下为这种情况的举例:


在姿态角测量中 加速度计(偏移小、精度低)和 陀螺仪 (偏移大、发散、精度高)


在高度测量中 超声波传感器(偏移小、采样率低) 和 气压计(偏移大、采样率高)


在位置测量中 GPS(偏移小、采样率低) 和 惯性导航系统(偏移大、采样率高)


以下这段程序以姿态角计算为例说明


提取Pitch轴说明: 陀螺仪读出角速度积分A,利用重力加速度读出加速度计可以计算出夹角B


制作工艺使得陀螺仪积分角度A随时间的推移发生零点偏移(角度产生严重的偏差),积分后产生越来越严重的累计误差。


另一方面,加速度计算夹角B没有积分过程不会产生如上问题,当物体运动时,物体本身的加速度没有被消除导致加速度计的值在物体加减速运动瞬间偏差。


故使用互补滤波让陀螺仪A为精确测量部件占一个大的比例,加速度B占一个小的比例作为修正


1 float FusionFilter_Complementary_1p(float AccAngle,float GyrRate,double PRYAngleLast,float dtC)


2 {


3   float tau=3;


4   float porprtion;


5   float RPYAngleNew;


6


7   porprtion=tau/(tau+dtC);


8   RPYAngleNew=porprtion(PRYAngleLast+GyrRatedtC) + (1-porprtion)(AccAngle);


9   return RPYAngleNew;


10 }


AccAngle:输入加速度计算夹角后的值,GyrRate:角速度,PRYAngleLast:上一次的姿态角(Pitch或Roll适用),dtC:两次调用的时间间隔用于积分


3.2卡尔曼滤波


与上面低通滤波中的卡尔曼滤波不同,这次的输入参数包括两种,以一种对另一种进行预测,以下是一段修改自互联网的程序,使用加速度计和陀螺仪来计算姿态角


1 void FusionFilter__Kalman_Filter_IMU(float Accel,float GyroRate,double Angle ,double dt)


2 {


3


4 static const float Q_angle=0.001;


5 static const float Q_gyro=0.003;


6 static const float R_angle=0.5;


7 // static const float dt=0.01;


8 static const char C_0 = 1;


9 static float Q_bias, Angle_err;


10 static float PCt_0, PCt_1, E;


11 static float K_0, K_1, t_0, t_1;


12 static float Pdot【4】 ={0,0,0,0};


13 static float PP【2】【2】 = { { 1, 0 },{ 0, 1 } };


14


15 Angle +=(GyroRate - Q_bias) dt; //先验估计


16


17 Pdot【0】=Q_angle - PP【0】【1】 - PP【1】【0】; // pk-先验估计误差协方差的微分


18


19 Pdot【1】= -PP【1】【1】;


20 Pdot【2】= -PP【1】【1】;


21 Pdot【3】=Q_gyro;


22


23 PP【0】【0】 += Pdot【

相关文章
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
282 3
|
11月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
279 2
|
10月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
408 0
|
算法 数据处理 数据安全/隐私保护
基于投影滤波算法的rick合成地震波滤波matlab仿真
本课题基于MATLAB2022a实现对RICK合成地震波的滤波仿真,采用投影滤波与卷积滤波投影两种方法处理合成地震剖面。地震波滤波是地震勘探中的关键步骤,用于去噪和增强信号。RICK模型模拟实际地震数据,投影滤波算法通过分解信号与噪声子空间实现有效去噪。完整程序运行无水印,包含核心代码与理论推导,适用于地震数据处理研究及学习。
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
320 4
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
340 2
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
370 7
|
运维 监控 算法
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
317 6

热门文章

最新文章