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

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

    关注

    2526

    文章

    48104

    浏览量

    740099
  • 嵌入式
    +关注

    关注

    4982

    文章

    18285

    浏览量

    288477
  • 滤波器
    +关注

    关注

    158

    文章

    7332

    浏览量

    174784
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • AD采样
    +关注

    关注

    0

    文章

    23

    浏览量

    15671
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    基于FPGA的FIR滤波器设计与实现

    本帖最后由 eehome 于 2013-1-5 09:50 编辑 基于FPGA的FIR滤波器设计与实现   文章研究基于FPGA、采用分布式算法实现FIR滤波器的原理和方法,用
    发表于 08-11 15:32

    fpga实现滤波器

    fpga实现滤波器fpga实现滤波器在利用FPGA实现数字信号处理方面,分布式算法发挥着关键作用,与传统的乘加结构相比,具有并行处理的高效性
    发表于 08-12 11:50

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

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

    第37章 FIR滤波器实现

    转dsp系列教程 本章节讲解FIR滤波器的低通,高通,带通和带阻滤波器实现。 37.1 FIR滤波器介绍 37.2 Matlab工具箱生成C头文件 37.3 FIR低通
    发表于 09-29 08:32

    采用LabVIEW实现相关滤波器设计

    字技术迅速发展以后,相关滤波也经常利用A/D板对信号采样后,在计算机中实现,成为数字滤波的一种形式。本文设计了一种实现相关滤波的方法,这是相
    发表于 05-06 09:26

    LabVIEW如何实现数字滤波器的设计

    封闭的设计公式。虽然窗函数法对窗口函数可给出计算公式,但计算通带与阻带衰减仍无计算公式。FIR 滤波器的设计只有计算程序可循,因此对计算工具要求较高,不用计算机编程一般很难实现。IIR 滤波器
    发表于 07-26 05:30

    滑动窗口

    假设D=double(1,515), A=cell(1,103),窗口长度为25,滑动距离为5,从D(1)开始滑动窗口直到D的末尾,右端缺失部分补零,共得到103个
    发表于 11-22 11:22

    请问如何实现改进的中值滤波器的设计?

    如何实现改进的中值滤波器的设计?中值滤波的基本原理是什么?中值滤波的改进算法是什么?如何实现中值滤波器
    发表于 04-14 06:54

    fir滤波器的设计和实现

    对于fir滤波器,已经在前面的文章中记录了仿制DIY&关于MATLAB中滤波器设计工具的使用心得记录),其设计和实现都非常简单。如果在嵌入式系统中可以满足且有必要实时iir运算,那么
    发表于 12-22 08:29

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

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

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

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

    高斯滤波器的原理和实现

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

    滑动窗口算法技巧

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