0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

滑动窗口滤波器的原理与实现

CHANBAEK 来源:明解嵌入式 作者:Sharemaker001 2023-04-19 11:35 次阅读

前言

嵌入式开发程序中涉及数据采样如传感器采样,AD采样等如果直接读取信号后,将信号值直接参与后续逻辑处理,若程序无软件滤波,会导致静态或者动态采样时:

1、信号曲线相对没有那么平滑。

2、同时可能存在脉冲干扰导致逻辑判断错误。

在信号处理系统中,输入信号通常含有各种噪声和干扰。 为对信号进行准确的测量和控制,必须削弱或滤除被测信号中的噪声和干扰。 因此在工程应用需要使用软件滤波,软件滤波也称数字滤波,是通过一定的算法削弱噪声的影响。 在实际的开发过程中使用了滑动窗口滤波算法来对传感器的数据采样进行滤波处理。

一、图解滑动窗口滤波器的原理

1、建立采样窗口和滤波窗口,自定义各窗口长度大小。

图片

2、当数据样本点数未填满采样窗口,对采样窗口内的数据累加做平均值计算。

例如此时采样窗口内数据采样点只有4个,小于定义的采样窗口长度,则将4个值累加后再做平均值计算。

图片

3、当数据样本点数已填满采样窗口,进行冒泡排序后,去除n个最大值及最小值后,对滤波窗口内的数据累加做平均值运算。

例如此时采样窗口内数据采样点有7个,已填满定义长度大小的采样窗口,则分别去除自定义的1个最大值和1个最小值后,对剩余滤波窗口内的数据累加后再做平均值计算。

图片

4、新的数据样本到来,移除采样窗口中时间最早的点(FIFO),重复上述3操作。

图片

二、滑动窗口滤波器的特点

1、经过滤波处理后,滤除了噪声干扰,数据波动稳定平滑。

2、每采样一个新数据,就将最早采集的那个数据丢掉,因此每进行一次采样,就可计算出一个新的平均值,从而加快了数据处理的速度。

3、可以根据实时性的要求和需要滤波后数据的平滑度来设置采样窗口和滤波窗口的大小。

4、当采样的数据量非常大时,这时的采样窗口会设置很大,那么窗口需要消耗一定的内存空间。

5、当采样数据越多,数据实时性越差,当数据突然发生较大变化时,不能被立刻检测到,无法及时处理突发事件。

三、滑动窗口滤波器的C++代码实现

1、基本思路

1、在工程根目录下新建filter文件夹,将源文件filter.cpp和头filter.h放在文件夹中供修改调用。

2、头文件:

(1)定义滤波算法函数中的可修改宏值;

(2)声明定义的滤波函数模板;

(3)使用extern的方式声明实例化后的模板函数。

3、源文件:

(1)定义需要使用滤波算法的函数模板;

(2)在定义的函数模板后进行函数实例化操作,通过这样的方法实现具体的模板函数。

2、头文件filter.h

#ifndef _FILTER_H_
#define _FILTER_H_


#define MAX_SENSOR_NUM 9   //使用滤波时的传感器数量
#define MAX_DATA_NUM 9     //最大采样点数量,即采样窗口长度
#define WINDOW_DATA_NUM 5  //滤波窗口长度
//去除采样窗口内最大最小值的数量,这里去除两个最大和两个最小 
#define REMOVE_MAXMIN_NUM ((MAX_DATA_NUM - WINDOW_DATA_NUM)/2)  


//extern double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM];


//声明定义的函数模板
template<typename InType> InType Filter_SlidingWindowAvg(int index, InType data);
//使用extern的方式声明实例化后的模板函数,根据实际需要自定义数据类型
extern template short Filter_SlidingWindowAvg(int index, short data);
extern template unsigned int Filter_SlidingWindowAvg(int index, unsigned int data);


#endif

3、源文件filter.cpp

#include 
#include "Filter.h"


using namespace std;
//定义各个传感器的数据采样点列表
double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM] = {0};
//滑窗均值滤波,使用函数模板可用于适配不同数据类型的采样点
template<typename InType>
InType Filter_SlidingWindowAvg(int index, InType data)   
{
    static int dataNum[MAX_SENSOR_NUM] = {0}; //定义记录传感器的采样点个数
    int i;
    double sum = 0;
    double out = 0;
    double array[MAX_DATA_NUM] = {0};

    //数据采样点在采样窗口内移动,FIFO操作
    for(i = MAX_DATA_NUM - 2; i >= 0; i--)
        m_dataList[index][i+1] = m_dataList[index][i];

    m_dataList[index][0] = data;
    //数据采样点数量小于采样窗口长度,对采样窗口数据累加后进行平均值运算                                     
    if(dataNum[index] < MAX_DATA_NUM) 
    {
        dataNum[index]++;
        for(i = 0; i < dataNum[index]; i++)
        {
            sum += m_dataList[index][i];
        }
        out = sum / dataNum[index];
    }
    //数据采样点已填满采样窗口,进行排序后,去除n个最大值及最小值后,对滤波窗口内的数据累加后进 
    //行平均值运算   
    else        
    {  
        for(i = 0; i < MAX_DATA_NUM; i++)
        {
            array[i] = m_dataList[index][i];
        }
        //利用C++标准库的sort函数进行排序,这里使用默认的升序
        sort(array, array + MAX_DATA_NUM);

        int start = (MAX_DATA_NUM - WINDOW_DATA_NUM) / 2; //start = REMOVE_MAXMIN_NUM

        for(i = start; i < start + WINDOW_DATA_NUM; i++)
        {
            sum += array[i];
        }
        out = sum / WINDOW_DATA_NUM;
    }
    return out;
}


//对函数模板进行函数实例化操作,根据实际需要自定义数据类型
template short Filter_SlidingWindowAvg(int index, short data);
template unsigned int Filter_SlidingWindowAvg(int index, unsigned int data);

四、滑动窗口滤波器的C代码实现

1、基本思路

1、在工程根目录下新建filter文件夹,将头filter.h和源文件filter.c放在文件夹中供修改调用。

2、头文件:

(1)定义滤波算法函数中的可修改宏值;

(2)声明定义的滤波算法函数;

3、源文件:

(1)定义冒泡排序功能函数;

(2)定义滤波算法功能函数。

2、头文件filter.h

#ifndef _FILTER_H_
#define _FILTER_H_


#define MAX_SENSOR_NUM 9   //使用滤波时的传感器数量
#define MAX_DATA_NUM 9     //最大采样点数量,即采样窗口长度
#define WINDOW_DATA_NUM 5  //滤波窗口长度
//去除采样窗口内最大最小值的数量,这里去除两个最大和两个最小 
#define REMOVE_MAXMIN_NUM ((MAX_DATA_NUM - WINDOW_DATA_NUM)/2)  


//extern double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM];


//声明定义的函数
double Filter_SlidingWindowAvg(int index, double data);


#endif

3、源文件filter.c

#include "Filter.h"


//定义各个传感器的数据采样点列表
double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM] = {0};


//冒泡排序
void BubbleSort(int array[], int len)
{
    int temp;
    //外层循环控制排序的趟数,n个元素排序需要循环n-1次
    for(int i=0; i

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2553

    文章

    51513

    浏览量

    757294
  • 嵌入式
    +关注

    关注

    5096

    文章

    19201

    浏览量

    308318
  • 滤波器
    +关注

    关注

    161

    文章

    7884

    浏览量

    179156
  • C++
    C++
    +关注

    关注

    22

    文章

    2114

    浏览量

    73939
  • AD采样
    +关注

    关注

    0

    文章

    23

    浏览量

    16096
收藏 人收藏

    评论

    相关推荐

    梳状滤波器以及积分梳状滤波器的FPGA实现

    作者:lee 在实现多级CIC滤波器前我们先来了解滑动平均滤波器、微分、积分以及梳状
    的头像 发表于 11-21 09:57 5858次阅读
    梳状<b class='flag-5'>滤波器</b>以及积分梳状<b class='flag-5'>滤波器</b>的FPGA<b class='flag-5'>实现</b>

    基于FPGA的多级CIC滤波器原理

    实现多级CIC滤波器前我们先来了解滑动平均滤波器、微分、积分以及梳状
    的头像 发表于 12-03 11:55 5946次阅读
    基于FPGA的多级CIC<b class='flag-5'>滤波器</b>原理

    数字滤波器的设计和实现

    滤波器设计是一个创建满足指定滤波要求的滤波器参数的过程。滤波器实现包括滤波器结构选择和
    的头像 发表于 10-31 10:38 1684次阅读
    数字<b class='flag-5'>滤波器</b>的设计和<b class='flag-5'>实现</b>

    3*3窗口生成模块,用于生成滤波滑动窗口,得到窗口内的所有元素数据

    谁有用Verilog写的3*3的模块代码,3*3窗口生成模块,用于生成滤波滑动窗口,得到窗口内的所有元素数据。可否分享一下,谢谢。谁有代码
    发表于 08-24 20:06

    有源滤波器中数字低通滤波器的设计及其DSP实现

    有源滤波器中数字低通滤波器的设计及其DSP实现摘要:介绍了基于瞬时无功功率理论的ip iq 谐波检测方法及对低通滤波器的要求,分析讨论了数字低通滤波
    发表于 05-13 17:19 90次下载

    滑动滤波器型谱分析在极窄带滤波中的应用

    【摘 要】滑动滤波器型谱分析是通过短时傅立叶变换来进行实时谱分析的,本文详细分析了其用作滤波器时的频域特性。给出了极窄带滤波器的具体
    发表于 05-22 20:46 1212次阅读
    <b class='flag-5'>滑动</b><b class='flag-5'>滤波器</b>型谱分析<b class='flag-5'>器</b>在极窄带<b class='flag-5'>滤波</b>中的应用

    详细解析滤波器的定义,滤波器的特性,滤波器的工作原理,滤波器的分类,滤波器的典型电路原理图

    滤波器的基础是谐振电路,只要能构成谐振电路组合就可实现滤波器滤波器有4种基本原型,即低通滤波器、带通
    发表于 05-03 16:20 1.8w次阅读
    详细解析<b class='flag-5'>滤波器</b>的定义,<b class='flag-5'>滤波器</b>的特性,<b class='flag-5'>滤波器</b>的工作原理,<b class='flag-5'>滤波器</b>的分类,<b class='flag-5'>滤波器</b>的典型电路原理图

    通过滑动平均滤波器解决数控系统加减速控制的跳变问题

    本文通过在直线加减规划之后,通过滑动平均滤波器来解决加速度的跳变问题,在不改变原有程序结构的情况下,实现了和S形曲线等效的加减速效果。
    的头像 发表于 04-29 08:30 4871次阅读
    通过<b class='flag-5'>滑动</b>平均<b class='flag-5'>滤波器</b>解决数控系统加减速控制的跳变问题

    采用FPGA实现多级CIC滤波器的四倍抽取一

    实现多级CIC滤波器前我们先来了解滑动平均滤波器、微分、积分以及梳状
    发表于 06-22 10:35 3040次阅读
    采用FPGA<b class='flag-5'>实现</b>多级CIC<b class='flag-5'>滤波器</b>的四倍抽取一

    高斯滤波器的原理和实现

    高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。
    发表于 09-01 11:09 8813次阅读
    高斯<b class='flag-5'>滤波器</b>的原理和<b class='flag-5'>实现</b>

    空间滤波器matlab实现

    空间滤波器的调整取决于滤波器的类型,比如均值滤波器可以调整滤波器的大小,中值滤波器可以调整滤波器
    发表于 02-16 09:40 931次阅读
    空间<b class='flag-5'>滤波器</b>matlab<b class='flag-5'>实现</b>

    高通滤波器和低通滤波器的关系

    高通滤波器和低通滤波器是互补的,它们可以组合使用,从而实现更复杂的滤波功能。例如,可以将高通滤波器和低通
    发表于 02-17 17:47 5131次阅读

    腔体滤波器和介质滤波器的区别

    腔体滤波器和介质滤波器都是常见的微波滤波器,它们的主要区别在于工作原理和实现方式。
    发表于 02-27 11:44 4137次阅读

    滑动窗口算法技巧

    说起滑动窗口算法,很多读者都会头疼。这个算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案么。LeetCode 上有起码 10 道运用
    的头像 发表于 04-19 10:55 955次阅读
    <b class='flag-5'>滑动</b><b class='flag-5'>窗口</b>算法技巧

    emi滤波器是什么滤波器

    会对电子设备的正常工作产生影响,甚至导致设备损坏。因此,EMI滤波器在电子设备中具有非常重要的作用。 EMI滤波器的原理 EMI滤波器的基本原理是利用滤波器对电磁波进行选择性传输或阻断
    的头像 发表于 08-25 15:59 1318次阅读