Multiwii2.2程序学习笔记——滤波一-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9419|回复: 2

[资料] Multiwii2.2程序学习笔记——滤波一

[复制链接]
发表于 2015-11-21 10:04 | 显示全部楼层 |阅读模式
      在模拟电路里,滤波器就是一种能过滤掉特定频率的电路,在计算机领域,滤波器是一种能消除特定干扰的程序代码。滤波器的种类甚多,尤其是在计算机领域,有均值滤波,限幅滤波,平滑滤波,一阶滤波,卡尔曼滤波等等,花样繁多。实际上这些算法都是在数字统计理论的应用而已。
在飞行器姿态解算中,最常见的就是平滑滤波,一阶滞后滤波,卡尔曼滤波,互补滤波等,今天我们就结合MWC飞控程序实际分析一下这些滤波器是怎样实现的(MWC主要采用的是一阶滤波和互补滤波)。
      一阶滞后滤波:一阶滞后滤波属于低通滤波,这种滤波器原理简单,计算量少,适合资源有限的嵌入式平台,但是它也有明显的缺陷,就是会造成输出信号与输入信号的相位迟滞。它的公式如下:
       F=A×(1-f)+f×B(公式一);F为输出,A和B为两个输入,f为置信度。其核心就是对两个输入分别赋予不同的置信度,两输入的置信度之和恒为一,通常这两个输入分别为本次采样值和上次的滤波输出值。因为f通常较小,所以即使因为传感器噪声,采样误差,机械振动等造成的本次输入值偏差过大,它对本次滤波器的输出造成的影响也非常小,这样就达到了滤波的效果。MWC程序中大量使用了该算法,但是很多MWC程序解析文章中都将其称为平均滑动滤波(固定序列长度求平均),但事实并非如此,在接下来的文章中我将一一分析为什么不是。
     第一段滤波程序:
          gyroADCinter[axis] =  gyroADC[axis]+gyroADCp[axis];   //ADCinter = ADC + ADCp
          gyroData[axis] = (gyroADCinter[axis]+gyroADCprevious[axis])/3;  //gyroData = (ADCinter + ADCp)/3
           gyroADCprevious[axis] = gyroADCinter[axis]>>1;   //ADCp = ADCinter/2
    分析:
           我们将其写成数学形式:gyroData=[ADC+ADCp+(ADC+ADCp)/2]/3   化简 gyroData=1/2(ADC+ADCp)
最终得到:gyroData=1/2ADC+(1-1/2)ADCp(其中:gyroData为本次滤波输出值,ADC为本次陀螺仪测量值,ADCp为上一次的滤波输出值,很明显它符合公式一,说明它就是采用的一阶滞后滤波)实际物理意义:公式中输出等于本次采样值乘以置信度与上一次滤波输出值乘以1与置信度的差的和。即对本次采样值和上次的输出值的信任度都为50%,在后面的算法中置信度一般都很小,即对本次的采样的信任度很小)。



发表于 2016-4-25 15:59 | 显示全部楼层
F=A×(1-f)+f×B
其中A是上一次滤波输出值,B是本次采样值。置信度f越小,则对本次采样信任度越小。
实际物理意义:公式中输出等于本次采样值乘以置信度与上一次滤波输出值乘以1与置信度的差的和。即对本次采样值和上次的输出值的信任度都为50%,在后面的算法中置信度一般都很小,即对本次的采样的信任度很小)。

可否这样理解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:40 , Processed in 0.204133 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表