已经通过sensor 把数据(PPG)读回来,希望得到更准确的值
希望采用合适的算法,来测量人的血氧饱和度 (SpO2)、心率、呼吸率
可以支付报酬
通俗理解卡尔曼滤波及其算法实现(实例解析)
https://blog.csdn.net/tiandijun/article/details/72469471
clear
N=200;
w(1)=0; %w为过程噪声
w=randn(1,N)
x(1)=25;
a=1; %a为方程中A(k)
for k=2:N;
x(k)=a*x(k-1)+w(k-1);
end
V=randn(1,N); %V为观察噪声
q1=std(V);
Rvv=q1.^2;
q2=std(x);
Rxx=q2.^2;
q3=std(w);
Rww=q3.^2;
c=0.2; %c为方程中H(k)
Y=c*x+V; %Y为观察值
p(1)=0;
s(1)=0;
for t=2:N;
p1(t)=a.^2*p(t-1)+Rww; %p1为方程中p'
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));
p(t)=p1(t)-c*b(t)*p1(t);
end
t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b');
参考卡尔曼滤波(Kalman filter)算法教程,学习一下
找到几篇相关的资料,希望对你有帮助
测量人的血氧饱和度 (SpO2)、心率、呼吸率,可以参考这篇文档,忘有帮助!
https://max.book118.com/html/2014/0801/9267102.shtm
PPG传感器是一种对器官(包括动脉)进行体积测量的仪器。这些传感器产生光学获得的体积描记图。市场上的产品使用专用的高性能模拟前端(AFE),这些前端驱动LED并检测反射的光信号。产生的原始信号可以通过多种方式处理,以产生各种有用的结果。
/卡尔曼滤波参数/
float p0[]={5.0};
float g0[]={0.0};
float q0[]={9e-6}; //过程噪声,q0增大,动态响应增大,稳定性变坏
float x0[]={5.0};
float r0={15.0}; //测量噪声,r0增大,收敛稳定性变好
/**********************************************/
u8 ADC_SENSOR_SIZE=30;
Filter_Kerman(ADC_SENSOR_SIZE,q0,r0,ss16Buf,&fAD,p0,g0);
void Filter_Kerman(int len,float q[],float r,signed short z[],float x[],float p[],float g[])
{
int i;
float p1[1],x1[1];
for (i=0;i<len;i++)
{
x1[0]=x[0];
p1[0]=p[0]+q[0];
g[0]=p1[0]/(r+p1[0]);
x[0]=x1[0]+g[0]*(z[i]-x1[0]);
p[0]=(1-g[0])*p1[0];
}
}
在预报阶段,根据前一时刻的模式状态生成当前时刻模式状态的预报值。在分析阶段,引入观测数据,利用最小方差估计方法对模式状态进行重新分析。随着模式状态预报的持续进行和新的观测数据的陆续输入,这个过程不断向前推进。即模式随着时间向前积分进行状态预报,当出现观测数据时,根据模式预报误差的协方差矩阵(已知)和观测误差的协方差矩阵(已知)之间相对大小导出状态的最小方差估计。
随着传感技术、机器人、自动驾驶以及航空航天等技术的不断发展,对控制系统的精度及稳定性的要求也越来越高。卡尔曼滤波作为一种状态最优估计的方法,其应用也越来越普遍,如在无人机、机器人等领域均得到了广泛应用。
对于Kalman Filter的理解,用过的都知道“黄金五条”公式,且通过“预测”与“更新”两个过程来对系统的状态进行最优估计,但完整的推导过程却不一定能写出来,希望通过此文能对卡尔曼滤波的原理及状态估计算法有更一步的理解。