广东湘恒智能科技有限公司
主营产品: 西门子PLC代理商,plc变频器,伺服电机,人机界面,触摸屏,线缆,DP接头
SIEMENS河北省邯郸市 西门子代理商——西门子华北一级总代理

获取滤波结果

参考FreeRTOS的设计方式,在获取滤波结果时,将之前创建的滤波器句柄作为参数传进来,实现对特定滤波数据的获取。
































/*滑动平均滤波器——获取结果SAFiter:滤波器句柄input:未滤波的原始数据返回滤波结果*/float GetSAFiterRes(SAFilterHandle_t SAFiter, float input){    SAFiter_t *pFilter = (SAFiter_t *)SAFiter;    if(!pFilter->isfull) /*还没有存满*/    {        pFilter->has++; /*求当前数组中已有数据数量*/        if(pFilter->has == pFilter->len)        {            pFilter->isfull = 1; /*标记数组已满*/        }    }    else /*已存满,覆盖写入*/    {        pFilter->sum -= pFilter->data[pFilter->index]; /*先移除最早的数据*/     }    /*写入新的数据*/    pFilter->data[pFilter->index] = input;     /*求当前数组中已有数据的总和*/    pFilter->sum += input;     /*更新下次数据的索引号*/    pFilter->index = (pFilter->index == pFilter->len - 1) ? 0 : pFilter->index + 1;    /*求当前数组中已有数据的平均值*/    pFilter->res = pFilter->sum / pFilter->has;    return pFilter->res;}3使用示例

以MPU6050陀螺仪的数据滤波为例(相关介绍参考MPU6050姿态解算方式1-DMP),假设需要对pitch数据和roll数据进行滤波,使用方式为:

定义2滤波器句柄

创建2滤波器

循环获取数据并滤波




















//滤波器句柄SAFilterHandle_t SAFilter_pitch;SAFilterHandle_t SAFilter_roll;
//创建2个滤波器SAFilter_pitch = SlipAveFilterCreate(10);SAFilter_roll = SlipAveFilterCreate(10);
//循环获取数据并滤波while(1){    if(mpu_dmp_get_data(&pitch,&roll,&yaw,&accx,&accy,&accz,&gyrox,&gyroy,&gyroz)==0)    {        pitch_res = GetSAFiterRes(SAFilter_pitch,pitch);//pitch数据滤波结果        roll_res = GetSAFiterRes(SAFilter_roll,roll);//roll数据滤波结果        printf("pitch:%f,%f,roll:%f,%f\r\n",pitch,pitch_res,roll,roll_res);//打印原始数据与滤波后的数据    }    vTaskDelay(1);}

滤波后的结果如下,蓝色为原始数据,橙色为滤波后的结果:



展开全文
相关产品
拨打电话 微信咨询 发送询价