一阶低通滤波算法(C语言 单片机)

文章介绍了RC滤波器的计算方法,包括低通滤波和高通滤波的实现。通过示例代码展示了如何使用滤波系数k进行滤波处理,其中RC_K为预定义的滤波常数。测试结果显示,原始ADC数据经过一阶滤波后波动减小,但存在滞后和宽度不一致的问题,这是因为滤波处理不在实时采集时进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/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,浮动比较大,绿色线为加入一阶滤波之后的数据波形,宽度不一致以及滞后是因为实际程序为测试程序在采集完数据后做的滤波处理,程序不在一个地方处理造成的.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值