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

LittleBoy 发表于 2015-11-21 10:04

Multiwii2.2程序学习笔记——滤波一

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

:):):):):):):):):)

190808149 发表于 2016-4-25 15:59

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

可否这样理解。
页: [1]
查看完整版本: Multiwii2.2程序学习笔记——滤波一