標(biāo)題: 卡爾曼濾波什么情況要用矩陣運(yùn)算? 什么情況無需矩陣運(yùn)算? [打印本頁]

作者: Kxuan163    時(shí)間: 2021-6-2 13:10
標(biāo)題: 卡爾曼濾波什么情況要用矩陣運(yùn)算? 什么情況無需矩陣運(yùn)算?
本帖最后由 Kxuan163 于 2021-6-2 13:16 編輯

例如以下例子,沒有矩陣運(yùn)算:
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;   //濾波所得最優(yōu)值
float  MV;      //浮點(diǎn)數(shù)格式的采樣值,即測(cè)量值
float  KG;      //KalmanGain 卡爾曼增益
float  EC =0.1; //EstimateCovariance 估計(jì)協(xié)方差初值
float  MC =0.2; //MeasureCovariance 測(cè)量協(xié)方差初值
float  EV=1000;  //EstimateValue 估計(jì)初值

//卡爾曼濾波函數(shù)/////////////////
  float kalman_Filter()
{
data =ADC_GetConversionValue(ADC1); //采樣
MV =(float)data;

KG =EC*sqrt(1/(EC*EC+MC*MC)); //計(jì)算卡爾曼增益
EV =EV +KG*(MV-EV);  //計(jì)算本次估計(jì)值
EC =sqrt(1-KG)*EC;   //更新估計(jì)協(xié)方差
MC =sqrt(1-KG)*MC;   //更新測(cè)量協(xié)方差
return EV;           //返回最優(yōu)估計(jì)值
}

//主函數(shù)////////////////////////////////
int main()
{
  delay_init();         
  ADC1_GPIO_Config();
  ADC_Config();  
  MCP4725_Init();                     

while(1)
  {
    kalman_Filter(); //卡爾曼濾波
    data2 =(u16)EV;                 
    MCP4725_WriteData_Digital(data2); //濾波后再作DA變換        
   }
}



作者: yabiyff    時(shí)間: 2021-6-3 12:27
看著來唄,多個(gè)輸入就列出列向量,濾波參數(shù)作為系數(shù)矩陣,然后for循環(huán)解完發(fā)出去。
個(gè)人認(rèn)為是不是矩陣其實(shí)無所謂,無非寫出來更好看,效率更高
作者: Kxuan163    時(shí)間: 2021-6-3 13:06
本帖最后由 Kxuan163 于 2021-6-3 13:07 編輯
yabiyff 發(fā)表于 2021-6-3 12:27
看著來唄,多個(gè)輸入就列出列向量,濾波參數(shù)作為系數(shù)矩陣,然后for循環(huán)解完發(fā)出去。
個(gè)人認(rèn)為是不是矩陣其 ...

謝謝回答! 未知我的理解是否正確:
在SISO(單輸入單輸出)系統(tǒng),無需矩陣運(yùn)算;
在MIMo(多輸入多輸出)系統(tǒng),宜用矩陣運(yùn)算。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1