编程实现插值滤波器(扩展卡尔曼滤波器跟踪曲线)

//下面是用c语言编写的代码(将其复制到自己的main.c中就可以编译运行),现在小编就来说说关于编程实现插值滤波器?下面内容希望能帮助到你,我们来一起看看吧!

编程实现插值滤波器(扩展卡尔曼滤波器跟踪曲线)

编程实现插值滤波器

//下面是用c语言编写的代码(将其复制到自己的main.c中就可以编译运行)

#include <stdio.h>

#include <math.h>

#include <windows.h>

#include <time.h>

#include <stdlib.h>

#define N 50

#define Q 0.5

#define R 2

void gotoxy(int x,int y);

void setColor(int color);

int main(void)

{

float x[N]; //状态方程

float xekf[N]; //滤波值

float y[N]; //观测方程

float faik[N]; //状态矩阵

float Zn[N]; //观测预测

float Hn[N]; //观测矩阵

float Kn[N]; //卡尔曼增益

float Pn[N]; //协方差预测

float P0[N]; //协方差更新

float error[N]; //误差

float temp[N]; //中间变量

float Vk[N]; //过程噪声

float Wk[N]; //观测噪声

int i,n;

FILE *fp = NULL;

fp = fopen("D:\\test.csv","w") ;//在你的D盘建立一个test.csv文件

//产生随机观测和随机过程噪声随机数

for(i=0;i<N;i )

{

srand((unsigned)time(NULL));

Vk[i]=rand()%1;

Wk[i]=rand()%2;

}

x[0]=0.1; //初始值

y[0]=(x[0] * x[0]) / 20 Vk[0];//初始值

setColor(6);

printf("------------------------------------------------------------------------------------\n");

printf("真实值\t\t\t观测值\t\t\t滤波值\t\t\t误差\n");

printf("------------------------------------------------------------------------------------\n");

for(i=1;i<N;i )

{

x[i]=0.5 * x[i-1] (2.5 * x[i-1]) / (1 x[i-1] * x[i-1]) 8 * cos(1.2 * i) sqrt(Q) * Wk[i-1];

y[i]=(x[i] * x[i]) / 20 sqrt(R) * Vk[i];

temp[i]=x[i];

printf("%f\t\t%f\n",x[i],y[i]);//先打印这两个值

printf("------------------------------------------------------------------------------------\n");

}

//EKF滤波算法

xekf[0]=0.1;

P0[0]=1.0;

//状态预测

for(n=1;n<N;n )

{

//状态预测

xekf[n]=0.5 * xekf[n-1] (2.5 * xekf[n-1]) / (1 xekf[n-1] * xekf[n-1]) 8 * cos(1.2 * n);

//观测预测

Zn[n]=(x[n] * x[n]) / 20;

//状态转移矩阵

faik[n]=0.5 2.5 * (1 - x[n] * x[n]) / ((1 x[n] * x[n]) * (1 x[n] * x[n])) ;

//求观测矩阵

Hn[n]=xekf[n] / 10;

//求协方差预测

Pn[n]=faik[n] * P0[n-1] * faik[n] Q;

//求卡尔曼增益

Kn[n]=Pn[n] * Hn[n] * ( Hn[n] * Pn[n] * Hn[n] R);

//状态更新

xekf[n]=xekf[n] Kn[n] * (y[n] - Zn[n]);

gotoxy(48,2 * n 1);

printf("%f\n",xekf[n]);//打印滤波值

//协方差更新

P0[n]=(1.0 - Kn[n] * Hn[n]) * Pn[n];

error[n]=fabs(xekf[n] - temp[n]);

gotoxy(70,2 * n 1);

printf("%f\n",error[n]);//打印误差

if(n==1)

{

fprintf(fp,"%s,%s,%s,%s\n","真实值","观测值","滤波值","误差");

}

else

{

fprintf(fp,"%f,%f,%f,%f\n",temp[n],y[n],xekf[n],error[n]);

}

}

fclose(fp);

for(i=0;i<2 * N;i )

{

gotoxy(15,i);

printf("|");

gotoxy(39,i);

printf("|");

gotoxy(62,i);

printf("|");

gotoxy(83,i);

printf("|");

}

printf("\n\n");

return 0;

}

//光标位置函数

void gotoxy(int x,int y)

{

COORD pos;

pos.X=x;

pos.Y=y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

//文字背景颜色函数

void setColor(int color)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) ;

}

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页