通过ADC采集到的位于袖袋内的压力传感器的电压值,我们可以换算得到对应的压力值。然后根据血压算法,找到对应的收缩压和舒张压。系统实现的核心就是滤波和寻找算法。在ADC采样之前加入一个硬件的RC高通滤波器获得交流信号。但是这个交流信号采样后依然会有ADC本身的噪声和白噪声,这时就需要加入软件滤波算法。
有限长滤波器
有限长滤波器是一种数字滤波器(finite impulse response filter)。窗函数法设计FIR数字滤波器是在时域进行的,因而必须由理想的频率响应推导出对应的单位取样响应hd(n),hd(n)是无限的。必须设计一个有限的单位取样响应h (n)去逼近hd(n) 。
有限长单位脉冲响应hd(n)可以由期待得到的频率响应函数和公式hd(n)=1/2π∫Hd(e^jw)(e^jw)dw得到。
Matlab实现
<!-- lang: cpp -->
n=2;f0=0.6;fs=200; %2代表阶数,fs为采样率,f0是截止频率
[b,a]=butter(n,f0/(fs/2),'high') %用butter函数获取butter滤波器的系数
y(1:3)=0; %滤波后的前面3个点为0
for i=3:1:num2 %高通滤波,从第3个点到最后一个点
y(i)=-1*(a(2)*y(i-1)+a(3)*y(i-2))+b(1)*u(i)+b(2)*u(i-1)+b(3)*u(i-2);
C实现
<!-- lang: cpp -->
void butter_high(double* in,double* out,int length)
{
int i;
for(i=2;i<length-1;i++)
out[i]=-1*(A2_H*out[i-1]+A3_H*out[i-2])+B1_H*in[i]+B2_H*in[i-1]+B3_H*in[i-2];
}
其中A2_H,A3_H为Matlab算得的滤波系数。我感觉FIR和小波算法很像,都是构造一些系数用来卷积。而这些系数相乘后的频率响应在频域上刚好构造了一个高通滤波器,这就达到了滤波的目的。
Reference
[1].http://wenku.baidu.com/view/dae2fb0103d8ce2f0066236b.html