前言
数据经过采集之后,还会包含很多噪声,和一些不必要的成分。为了方便后续处理和更加精确地计算结果,需要对采集的信号进行滤波。数字信号处理属于较难学科,博主才疏学浅,如有不足之处敬请指正。
一、修正上一章产生的错误
在上一章中,读取的PPG信号每个若干个周期会出现噪声,原因是读取时序和数据采集的时序对不上。使用中断管脚信号后错误消失。
二、FIR滤波器设计
1.对采集的信号进行频谱分析
可以看到PPG信号成分的频率主要集中在0.5-2Hz之间。为了消除个体差异,应该保留的频率成分0.5-3Hz(也就是心率30次/min - 180次/min)。
2.滤波器设计
为了易实现,设计一个低通滤波器。参数如下:
3.滤波器仿真
可以看到,保留了3Hz以下的频率成分,滤除了3Hz以上的频率成分。
三、ARM_MATH库实现(以STM32为例)
将ARM_MATH库移植到工程中,上文设计的滤波器参数生成头文件导入工程中。关键的两个函数如下:
arm_fir_init_f32(&S, NUM_TAPS,(float32_t *)&firCoeffs32LP[0], &firStateF32[0], blockSize);
arm_fir_f32(&S,&input,&output, blockSize);
这里不多介绍,需要了解的,可以参考安富莱的DSP教程。
实际效果测试
串口实时打印输出,红色的曲线为原始信号,蓝色的曲线为滤波后的波形。
滤波前
滤波后
四、获取工程源码
关注公众号,回复 “MAX30102V2” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!
|