活动过去了有一段时间了,根据[传感器大派送]+ 10.基于BH1790GLC脉搏数据采集[含视频]的帖子,注意到在处理脉搏数据的时候,有用到3.5HZ的IIR低通滤波器和0.5HZ的IIR高通滤波器。 所以,我就继续的研究了下官网的源码。
源码中的IIR滤波器选用的是直接I型IIR滤波器,其基于二阶Biquad级联的方式来实现的。每个Biquad由一个二阶的滤波器组成:y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]
直接 I 型算法每个阶段需要 5 个系数和 4 个状态变量。 x[n]就是输入变量,y[n]就是基于IIR滤波之后的输出值,b0 、b1、 b2、a1、a2是滤波器的参数;这些参数当然不是手算的,而是使用MATLAB计算出来的。
使用fdatool打开滤波器设计工具箱:
设置滤波器参数: 注意的是:我们配置的BH1790GLC心率传感器输出数据是按照32HZ的,所以滤波器的采样频率是32HZ,截至频率是3.5HZ,滤波器参数使用MATLAB输出如下: 得到了滤波器的参数,就可以开始写代码。 定义IIR滤波器参数结构体: IIR滤波器初始化 注意,初始化时候的参数,就是我们使用MATLAB计算出来的参数一样,只是,最后两个需要取反,因为MATLAB的计算公式和我们的公式有一点点差别。 IIR滤波器计算实现代码如下: 这个里面的代码就是上文介绍IIR的那个公式。 y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]
最后,在说到IIR滤波器,那就不得不说FIR滤波器,这两个都是一种数字的线性滤波器,其两者最大的区别是: 1、在相同的技术指标下, IIR滤波器由于存在着输出对输入的反馈,因而可用比FIR滤波器需要更少的参数和资源。 2、FIR滤波器可得到严格的线性相位, 而IIR滤波器则做不到这一点。 3、IIR滤波器可以设计成标准低通、高通、带通、带阻、全通滤波器,而FIR滤波器则要灵活得多,可以设计出理想正交变换器、理想微分器、线性调频器等 所以在我们的应用中,考虑IIR滤波器就可以了。相位移位对我来说,没有任何问题。
|