tft每日頭條

 > 科技

 > 編程實現插值濾波器

編程實現插值濾波器

科技 更新时间:2025-01-13 11:42:51

編程實現插值濾波器?//下面是用c語言編寫的代碼(将其複制到自己的main.c中就可以編譯運行),現在小編就來說說關于編程實現插值濾波器?下面内容希望能幫助到你,我們來一起看看吧!

編程實現插值濾波器(擴展卡爾曼濾波器跟蹤曲線)1

編程實現插值濾波器

//下面是用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) ;

}

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved