c语言 卡尔曼滤波

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

typedef struct{
	double prevData;
	double p,q,r,kGain;
}Kalman;

void KalmanInit(Kalman *k){
	k->kGain=0;
	k->p=5;	//p初值可以随便取,但是不能为0(0的话最优滤波器了)
	k->q=0.001;	//q参数调滤波后的曲线平滑程度,q越小越平滑
	k->r=0.5;	//r参数调整滤波后的曲线与实测曲线的相近程度,越小越接近
	k->prevData=0;
	return;
}
double KalmanFilter(Kalman *k,double data){
	k->p=k->p+k->q;
	k->kGain=k->p/(k->p+k->r);
	data=k->prevData+k->kGain*(data-k->prevData);
	k->p=(1-k->kGain*k->p);
	k->prevData=data;
	return data;
}
main(){
	Kalman kalman;
	int i;
	double t[100],tk[100];
	FILE *fp;
	#define NOISE (rand()%2000/1000.-1)
	KalmanInit(&kalman);
	kalman.p=5;
	kalman.q=0.8;
	kalman.r=4;
	for(i=0;i<100;i++){
		t[i]=sin(i/10.)+0.3*NOISE;
		tk[i]=KalmanFilter(&kalman,t[i]);
	}
	fp=fopen("1.csv","w");
	for(i=0;i<100;i++){
		fprintf(fp,"%d,%f,%f\n",i,t[i],tk[i]);
	}
	fclose(fp);
}
注:结构体的目的是可以很方便地使用多个滤波器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值