卡尔曼滤波

看完这篇卡尔曼滤波原理,我被惊到了! - 微波基础知识 - 微波射频网

复制代码
#ifndef __COM_FILTER_H__
#define __COM_FILTER_H__
#include "stdint.h"

/* 卡尔曼滤波器结构体 */
typedef struct
{
    float LastP; // 上一时刻的状态方差(或协方差)
    float Now_P; // 当前时刻的状态方差(或协方差)
    float out;   // 滤波器的输出值,即估计的状态
    float Kg;    // 卡尔曼增益,用于调节预测值和测量值之间的权重
    float Q;     // 过程噪声的方差,反映系统模型的不确定性
    float R;     // 测量噪声的方差,反映测量过程的不确定性
} KalmanFilter_Struct;

extern KalmanFilter_Struct kfs[3];
int16_t Com_Filter_LowPass(int16_t newValue, int16_t preFilteredValue);

double Com_Filter_KalmanFilter(KalmanFilter_Struct *kf, double input);

#endif /* __COM_FILTER_H__ */


#include "Com_Filter.h"

#define ALPHA 0.15 /* 一阶低通滤波 指数加权系数 */
/**
 * @description: 一阶低通滤波
 *  是一种常用的滤波器,用于去除高频噪声或高频成分,保留信号中的低频成分。
 *  在单片机应用中,一种简单且常见的低通滤波器是一阶无限脉冲响应(IIR)低通滤波器,
 *  通常实现为指数加权移动平均滤波器。
 * @param {int16_t} newValue 需要滤波的值
 * @param {int16_t} preFilteredValue 上一次滤波过的值
 * @return {*}
 */
int16_t Com_Filter_LowPass(int16_t newValue, int16_t preFilteredValue)
{
    return ALPHA * newValue + (1 - ALPHA) * preFilteredValue;
}

/* 卡尔曼滤波参数 */
KalmanFilter_Struct kfs[3] = {
    {0.02, 0, 0, 0, 0.001, 0.543},
    {0.02, 0, 0, 0, 0.001, 0.543},
    {0.02, 0, 0, 0, 0.001, 0.543}};
double Com_Filter_KalmanFilter(KalmanFilter_Struct *kf, double input)
{
    kf->Now_P = kf->LastP + kf->Q;
    kf->Kg    = kf->Now_P / (kf->Now_P + kf->R);
    kf->out   = kf->out + kf->Kg * (input - kf->out);
    kf->LastP = (1 - kf->Kg) * kf->Now_P;
    return kf->out;
}
相关推荐
刻BITTER4 小时前
用EXCEL 将单色屏幕的Bitmap 字模数据还原回图形
单片机·嵌入式硬件·excel·arduino
撬动未来的支点6 小时前
【嵌入式】MCU和MPU的区别
单片机·嵌入式硬件
一支闲人7 小时前
CAN:STM32 CAN外设2
stm32·单片机·基础知识·can协议·stm外设
雅欣鱼子酱8 小时前
两种电流检测电路设计方案 高侧,低侧,最高耐压90V
单片机·嵌入式硬件·芯片·电子元器件·电流检测芯片
平凡灵感码头8 小时前
经典按键扫描程序算法实现方式
单片机·矩阵·计算机外设
d111111111d9 小时前
STM32--SPI通讯外设-学习笔记
笔记·stm32·单片机·嵌入式硬件·学习
@good_good_study9 小时前
STM32 UART常用配置函数及实验
stm32
bai5459369 小时前
STM32旋转编码计次
stm32·单片机·嵌入式硬件
d111111111d9 小时前
在STM32中有参宏定义define该怎么使用
笔记·stm32·单片机·嵌入式硬件·学习
KWTXX9 小时前
STM32工作原理与数电模电的紧密联系【主要是介绍电路,模数电,想看STM32的工作原理可以不用看】
stm32·单片机·嵌入式硬件