/k值的计算方法。
//符号:Sr-采样率(sampling rate,次/秒),f-截止频率(Hz),Pi-圆周率(3.14...)
//k=(2*Pi*f)/Sr
typedef struct
{
float k;//滤波系数
float lVal;//上次计算值
}rcPara_t;
//低通滤波:
//rcPara-指向滤波参数
//val-采样值
//返回值-滤波结果
float rcLfFiter(rcPara_t *rcPara, float val)
{
rcPara->lVal=((float)val*rcPara->k+rcPara->lVal*(1-rcPara->k));
return rcPara->lVal;
}
//高通滤波:
float rcHpFiter(rcPara_t *rcPara, float val)
{
rcPara->lVal=((float)val*rcPara->k+rcPara->lVal*(1-rcPara->k));
// return -(val-rcPara->lVal);//滤波结果
return (val-rcPara->lVal);//如果直接返回滤波结果,滤波后图像是倒转的,在心电图等一些场合,需要将图像再镜像过来
}
#define RC_F 1.0f
#define RC_K 0.3// (2*3.14f*RC_F/500)
rcPara_t rcParaLpMutiL1 = {.k=RC_K};
rcPara_t rcParaLpMutiL2 = {.k=RC_K};
rcPara_t rcParaLpMutiL3 = {.k=RC_K};
void TestPro(int16_t *ad_valuebuf_High)
{
uint8_t i=0;
for(i=0;i<512;i++)
{
TestValue=rcLfFiter(&rcParaLpMutiL1,ad_valuebuf_High[i]);
printf("%d,%d,%f\r\n",ad_valuebuf_Low[i],ad_valuebuf_High[i],TestValue);
}
}
测试程序传入参数为AD采样值.根据需求调节RC_K比例.
个人理解:类似于加权平均计算,历史计算值*占比+当前采样值*(1-占比).
实际测试效果
黄色的线 表示采集到的原始ADC,浮动比较大,绿色线为加入一阶滤波之后的数据波形,宽度不一致以及滞后是因为实际程序为测试程序在采集完数据后做的滤波处理,程序不在一个地方处理造成的.