找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1215|回复: 2
收起左侧

卡尔曼滤波什么情况要用矩阵运算? 什么情况无需矩阵运算?

[复制链接]
ID:858964 发表于 2021-6-2 13:10 | 显示全部楼层 |阅读模式
本帖最后由 Kxuan163 于 2021-6-2 13:16 编辑

例如以下例子,没有矩阵运算:
main.c

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "MCP4725.h"
#include "myiic.h"
#include <stdio.h>
#include "kalman.h"        
#include "math.h"        

u16    data;    //ADC采样值
u16    data2;   //滤波所得最优值
float  MV;      //浮点数格式的采样值,即测量值
float  KG;      //KalmanGain 卡尔曼增益
float  EC =0.1; //EstimateCovariance 估计协方差初值
float  MC =0.2; //MeasureCovariance 测量协方差初值
float  EV=1000;  //EstimateValue 估计初值

//卡尔曼滤波函数/////////////////
  float kalman_Filter()
{
data =ADC_GetConversionValue(ADC1); //采样
MV =(float)data;

KG =EC*sqrt(1/(EC*EC+MC*MC)); //计算卡尔曼增益
EV =EV +KG*(MV-EV);  //计算本次估计值
EC =sqrt(1-KG)*EC;   //更新估计协方差
MC =sqrt(1-KG)*MC;   //更新测量协方差
return EV;           //返回最优估计值
}

//主函数////////////////////////////////
int main()
{
  delay_init();         
  ADC1_GPIO_Config();
  ADC_Config();  
  MCP4725_Init();                     

while(1)
  {
    kalman_Filter(); //卡尔曼滤波
    data2 =(u16)EV;                 
    MCP4725_WriteData_Digital(data2); //滤波后再作DA变换        
   }
}


回复

使用道具 举报

ID:818024 发表于 2021-6-3 12:27 | 显示全部楼层
看着来呗,多个输入就列出列向量,滤波参数作为系数矩阵,然后for循环解完发出去。
个人认为是不是矩阵其实无所谓,无非写出来更好看,效率更高
回复

使用道具 举报

ID:858964 发表于 2021-6-3 13:06 | 显示全部楼层
本帖最后由 Kxuan163 于 2021-6-3 13:07 编辑
yabiyff 发表于 2021-6-3 12:27
看着来呗,多个输入就列出列向量,滤波参数作为系数矩阵,然后for循环解完发出去。
个人认为是不是矩阵其 ...

谢谢回答! 未知我的理解是否正确:
在SISO(单输入单输出)系统,无需矩阵运算;
在MIMo(多输入多输出)系统,宜用矩阵运算。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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