精华内容
下载资源
问答
  • 数字信号处理】十大经典软件滤波算法 2、matlab设计滤波器 经典滤波器的滤波思路是从频率域上将噪声滤掉,关键是设计相应的滤波器传递函数H(s)、H(z),分别对应着模拟滤波器和数字滤波器的实现。模拟滤波器主要...

    1、十大经典软件滤波算法

    【数字信号处理】十大经典软件滤波算法

    2、matlab设计滤波器

    经典滤波器的滤波思路是从频率域上将噪声滤掉,关键是设计相应的滤波器传递函数H(s)、H(z),分别对应着模拟滤波器和数字滤波器的实现。模拟滤波器主要是通过电感(L)、电容(C)、电阻(R)和运放(OPA)等元器件搭建传递函数为H(s)或者近似为H(s)的硬件电路来实现,比如RC滤波电路和有源滤波器等。数字滤波器(DF)从实现的结构上或者是单位脉冲响h(n)上可以分为无限长脉冲响应(IIR)和有限长脉冲响应(FIR)滤波器。两者在结构上的区别是:IIR有反馈回路,即当前输出y(n)中包含以前输出y(n-k)(k>0);FIR则没有反馈回路,当前输出y(n)中只包含输入x(n)和以前的输入x(n-k)(k>0)。正是有了反馈回路,导致了IIR单位脉冲响应h(n)的无限长。
    经典滤波器设计

    3、数字滤波C语言实现;

    数字滤波算法汇总与C语言实现

    4、七种滤波方法的matlab实现和测试

    七种滤波方法的matlab实现和测试

    5、MATLAB滤波器工具

    MATLAB滤波器工具

    6、matlab中sptool工具箱使用及介绍

    matlab中sptool工具箱使用及介绍

    展开全文
  • 常用滤波算法

    2019-07-12 10:51:49
    1.1RC滤波数字低通滤波  指在截止频率fc的时候,增益为-3db(Aup=0.707)的滤波器,也是模电书中出现的第一种硬件滤波器,以下是对应的软件形式的1阶RC滤波器的数字形式(本断程序节选自匿名4轴)  一阶形式:Y(n)...

    引用:https://www.cnblogs.com/Lxk0825/p/9908915.html


    一、低通滤波

    1.1RC滤波的数字低通滤波

      指在截止频率fc的时候,增益为-3db(Aup=0.707)的滤波器,也是模电书中出现的第一种硬件滤波器,以下是对应的软件形式的1阶RC滤波器的数字形式(本断程序节选自匿名4轴)

      一阶形式:Y(n)=(1-a)*Y(n-1)+a*X(n)

      下式中 oldData表示上一次的输出Y(n-1)  newData表示新的输入X(n)

    float LopPassFilter_RC_1st(float oldData, float newData, float a)
      {
        return oldData * (1 - a) + newData * a;
      }
    
      计算比例系数a:
    
      float LopPassFilter_RC_1st_Factor_Cal(float deltaT, float Fcut)
      {
        return deltaT / (deltaT + 1 / (2 * M_PI * Fcut));
      }

     

    1.2均值滤波:

      把一段时间内的数据累加后求平均值,达到平滑的作用,适用性广泛,元素越多滤波效果越好时延越高。

    uint16_t LowPassFilter_Average(uint16_t data[],uint16_t length)
    
      {
    
        uint32_t add=0;
        uint16_t result;
        int i;
    
        for(i=0;i<length;i++)
        {
          add += data[i];
        }
        result=add/length;
        return result;
      }
    
      //data[]放入一段时间里的数值,length:data数组的长度

    1.3滑动滤波

      在均值滤波的基础上,加上比例系数,最新的数据具有更大的比例,增加时效性。

      以下列举了一个三个元素的滑动滤波

    double LowPassFilter_Silding(double dataNewest,double dataMiddle,double dataLast)
      {
    
        #define PROPORTIONNEW 0.55
    
        #define PROPORTIONMID 0.35
    
        #define PROPORTIONLAST (1- PROPORTIONNEW -PROPORTIONMID )
    
        double result;
        result = PROPORTIONNEW *dataNewest+ PROPORTIONMID *dataMiddle+PROPORTIONLAST *dataLast;
        return result;
      }

      三个输入参数为连续3个读出的数据,其中 dataNewest 为最新数据,对应比例系数PROPORTIONNEW ,另外两个同理。比例系数根据需要改变

    1.4中值滤波

      当传感器采集的数据存在毛刺时,为了提取其中有效的数据,采用中值滤波的算法,只保存数据大小在中间的数值。

    uint16_t LowPassFilter_GetMiddleValue( uint16_t *pusBuffer, uint8_t ucLength )
      {
        uint8_t i;
        uint16_t usMiddle,usMax,usCount = 0,usPoint;
    
        while( usCount <= (ucLength/2) )
        {
          usPoint = 0;
          usMax = pusBuffer[0];
          for( i=1;i<ucLength;i++ ) 
          { 
            if( pusBuffer[i] > usMax ) 
            {
              usMax = pusBuffer[i];
              usPoint = i;
            } 
          }
          usMiddle = usMax;
          pusBuffer[usPoint] = 0; 
          usCount++; 
        }
        return usMiddle;
      }

      *pusBuffer:待改变的起始地址  ucLength:长度

      特别注意:为了运行效率,这个方法中没有对数组进行备份,会直接操作到源 *data并改变元素的值。

      这个快速中值算法原理是只排序最大或者最小值的一半,一半中的最后一个即为中间值

    1.5去除极值的XX滤波

      把中值滤波的优点结合给其他滤波,使其他滤波器也具有够剔除少量毛刺的能力。

      以下例子结合的是均值滤波,即去除极值的均值滤波

    int16_t LowPassFilter_RemoveExtremumAverage(int16_t data[],int16_t length)
      {
        #define EXTERMUM_NUMBER 1 //number of extermum
        int32_t sum=0;
        int16_t i;
    
        if(length<=2*EXTERMUM_NUMBER)
        {
          return 0;//length shorter than 2*EXTERMUM_NUMBER, return err
        }
    
        //sort
        BubbleSort_int16(data,length);
        
    
        //average filter
        for(i=EXTERMUM_NUMBER;i<length-EXTERMUM_NUMBER;i++)
        {
          sum+=data[i];
        }
    
        return sum/(length-2*EXTERMUM_NUMBER);
      }

      输入长度为length的数组data[]。EXTERMUM_NUMBER定义去除极值的个数(1表示去掉1个最大值和1个最小值)。先用排序法(本例使用下面给出的冒泡排序)对data数组进行排序,去除1个最大值和1个最小值后剩余求平均值。

      这段代码可能出现两个错误

      1、length比2倍的EXTERMUM_NUMBER短,本例用return 0一笔带过,实际需要在程序return 0处作处理

      2、如果输入length过长会使32位的sum在累加过程溢出,如果length很长建议改变均值滤波的顺序在累加之前线进行除法

      下面给出子程序冒泡排序

    void BubbleSort_int16(int16_t *a,int len)
      {
        int i;
        int j;
        int mid;
        for(i=0;i<len;i++)
        {
          for(j=0;j<len-i-1;j++)
          {
            if(*(a+j)>*(a+j+1))
            {
              mid=*(a+j);
              *(a+j)=*(a+j+1);
              *(a+j+1)=mid;
            }
          }
        }
      }

    1.6巴特沃斯低通滤波

      借助MATLAB使用数字滤波的方法来模拟巴特沃斯滤波器:

      IIR滤波的基本结构 y(n)+a1*y(n-1)+a2*y(n-2)....ai*y(n-i)=b0*x(n)+b1*x(n-1)+b2*x(n-2)....+bi*x(n-i);

      这里简单把IIR滤波理解为滑动滤波的进阶形式,其中i为阶数,x(n)为本次输入,x(n-1)为上一次输入,如此类推x(n-i)为i次前的输入。y(n)为输出,y(n-1)为上一次的输出。y(n-i)为i次前的输出。 a和b分别为比例。

      系数a和b改变达到模拟不同采样频率、不同截止频率的滤波效果。

      以下使用matlab计算一个1000HZ采样频率,100HZ截止频率,2阶的巴特沃斯滤波器的IIR系数:

      >>fdatool

    1.7切比雪夫低通滤波

    1.8卡尔曼滤波

    卡尔曼滤波是一种预测型滤波,这里把卡尔曼滤波归纳到低通滤波中,是因为在适用过程中卡尔曼增益Kg会慢慢收敛,变成跟低通滤波一样的效果

    float LowPassFilter_kalman(float data)
    { 
      static float Xlast=0.01;//初值 Xlast&Xpre
      static float P=0.1;//Plast&Pnow
      const float Q=0.44;//自己感觉的方差
      const float R=0.54;//测量器件的方差 
      float Kg,PP;//
      float Xnow;//经过卡尔曼滤波的值 Xnow
    
      //1式A=1 无输入
      PP=P+Q; //Ppre=Plast+Q (2)
      Kg=PP/(PP+R); //更新Kg Ppre/Ppre+R(4)
      Xnow=Xlast+Kg*(data-Xlast); // Xnow = Xpre+Kg*(Z(k)-H*Xpre)(3)
      P=(1-Kg)*PP; //Pnow=(I-Kg)*Ppre(5) 由于Pnow不会再使用,所以更新Plast=Pnow
      Xlast=Xnow; 
    
      return Xnow;
    }

    二、高通滤波

    三、融合滤波

    3.1互补滤波

    当有两种同一类型参数的时候,虽然不同它们的特性又刚好互有长短,为了各取所长,互补其短,所以叫互补滤波。以下为这种情况的举例:

    在姿态角测量中 加速度计(偏移小、精度低)和 陀螺仪 (偏移大、发散、精度高)

    在高度测量中 超声波传感器(偏移小、采样率低) 和 气压计(偏移大、采样率高)

    在位置测量中 GPS(偏移小、采样率低) 和 惯性导航系统(偏移大、采样率高)

     

     以下这段程序以姿态角计算为例说明

    提取Pitch轴说明: 陀螺仪读出角速度积分A,利用重力加速度读出加速度计可以计算出夹角B

    制作工艺使得陀螺仪积分角度A随时间的推移发生零点偏移(角度产生严重的偏差),积分后产生越来越严重的累计误差。

    另一方面,加速度计算夹角B没有积分过程不会产生如上问题,当物体运动时,物体本身的加速度没有被消除导致加速度计的值在物体加减速运动瞬间偏差。

    故使用互补滤波让陀螺仪A为精确测量部件占一个大的比例,加速度B占一个小的比例作为修正

    float FusionFilter_Complementary_1p(float AccAngle,float GyrRate,double PRYAngleLast,float dtC)
    {
      float tau=3;
      float porprtion;
      float RPYAngleNew;
    
      porprtion=tau/(tau+dtC); 
      RPYAngleNew=porprtion*(PRYAngleLast+GyrRate*dtC) + (1-porprtion)*(AccAngle);
      return RPYAngleNew;
    }

    AccAngle:输入加速度计算夹角后的值,GyrRate:角速度,PRYAngleLast:上一次的姿态角(Pitch或Roll适用),dtC:两次调用的时间间隔用于积分

    3.2卡尔曼滤波

    与上面低通滤波中的卡尔曼滤波不同,这次的输入参数包括两种,以一种对另一种进行预测,以下是一段修改自互联网的程序,使用加速度计和陀螺仪来计算姿态角

    void FusionFilter__Kalman_Filter_IMU(float Accel,float GyroRate,double *Angle ,double dt) 
    {
    
    static const float Q_angle=0.001; 
    static const float Q_gyro=0.003;
    static const float R_angle=0.5;
    //    static const float dt=0.01;    
    static const char C_0 = 1;
    static float Q_bias, Angle_err;
    static float PCt_0, PCt_1, E;
    static float K_0, K_1, t_0, t_1;
    static float Pdot[4] ={0,0,0,0};
    static float PP[2][2] = { { 1, 0 },{ 0, 1 } };
    
    *Angle +=(GyroRate - Q_bias) * dt; //先验估计
    
    Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // pk-先验估计误差协方差的微分
    
    Pdot[1]= -PP[1][1];
    Pdot[2]= -PP[1][1];
    Pdot[3]=Q_gyro;
    
    PP[0][0] += Pdot[0] * dt; //pk-先验估计误差协方差微分的积分
    PP[0][1] += Pdot[1] * dt; //=先验估计误差协方差
    PP[1][0] += Pdot[2] * dt;
    PP[1][1] += Pdot[3] * dt;
    
    Angle_err = Accel - *Angle;    //zk-先验估计
    
    PCt_0 = C_0 * PP[0][0];
    PCt_1 = C_0 * PP[1][0];
    
    E = R_angle + C_0 * PCt_0;
    
    K_0 = PCt_0 / E;
    K_1 = PCt_1 / E;
    
    t_0 = PCt_0;
    t_1 = C_0 * PP[0][1];
    
    PP[0][0] -= K_0 * t_0;    //后验估计误差协方差
    PP[0][1] -= K_0 * t_1;
    PP[1][0] -= K_1 * t_0;
    PP[1][1] -= K_1 * t_1;
    
    *Angle    += K_0 * Angle_err;    //后验算估计
    Q_bias    += K_1 * Angle_err;    //后验估计
    //    Gyro_y = GyroRate - Q_bias;    //输出值(后验估计)的微分 = 实际角速度
    }

     

     

     

     

    展开全文
  • STM32实战七 数字滤波

    千次阅读 2019-06-30 15:34:58
    数字滤波是数据处理是常用、灵活、有效的方法。前面的按键程序已经用到了滤波,属于开关量滤波,这里要讨论的是模拟量滤波程序,包括常用的两种方法,中值滤波和平均值滤波。 中值滤波的原理是,每次取最近几个数...

    数字滤波是数据处理是常用、灵活、有效的方法。前面的按键程序已经用到了滤波,属于开关量滤波,这里要讨论的是模拟量滤波程序,包括最常用的两种方法,中值滤波和平均值滤波。

    中值滤波的原理是,每次取最近几个数的中间值作为输出数据,每个波形的最高和最低几个数被滤掉,优点是基本保留原有数据,能有效抑制大幅值低频尖峰干扰,俗称椒盐噪声。

    平均值滤波,就是对最近一些数求平均,是最常用最简单的方法,对高频低幅值随机噪声有效,缺点是会损失原始数据中的高频分量,对高幅值干扰会扩大影响。下面的程序中应用了移位平均算法,效率高,且不受求平均的数据数目大小的影响。两种滤波方式都有一定延时。

    AverageFilter.h

    #ifndef __AVERAGEFILTER__
    #define __AVERAGEFILTER__
    
    extern "C" {				// 兼容C,按C语言编译,Keil5中的包含文件已经加入了C++兼容,不用再加这一段
    #pragma diag_remark 368		//消除 warning:  #368-D: class "<unnamed>" defines no constructor to initialize the following:
    
    #include "stm32f10x.h"
    
    #pragma diag_default 368	// 恢复368号警告
    }
    
    #define AF_MAXWINDOW 150	// 最大窗宽150
    
    class AverageFilter
    {
    // Construction
    public:
    	AverageFilter( s32 ini, u16 nNum );
    
    // Properties
    public:
    	u16 m_number;				// 指定平均的个数,最多150
    	u16 m_seek;					// 游标
    	s32 m_summation;			// 指定数组的总和
    	s32 m_input[AF_MAXWINDOW];	// 数据缓存
    
    private:
    
    // Methods
    public:
    	s32 filter( s32 vi );		// 滤波算法
    		
    // Overwrite
    public:
    };
    
    #endif
    

    AverageFilter.cpp

    /**
      ******************************************************************************
      * @file		AverageFilter.cpp
      * @author		Mr. Hu
      * @version	V1.0.0 STM32F103VET6
      * @date		06/06/2019
      * @brief		均值滤波
      ******************************************************************************
      * @remarks
      *		采用移位平均法,大大提高效率,不受数据数量的影响
      */ 
    
    /* Includes ------------------------------------------------------------------*/
    extern "C" {	// 兼容C,按C语言编译,Keil5中的包含文件已经加入了C++兼容,不用再加这一段
    #pragma diag_remark 368			//消除 warning:  #368-D: class "<unnamed>" defines no constructor to initialize the following:
    
    #pragma diag_default 368	// 恢复368号警告
    }
    
    #include "AverageFilter.h"
    
    /**
      * @date	06/06/2019
      * @brief  均值滤波
      * @param	ini 初始值,避免前几个输出数偏差太大
      * @param	nNum 滤波数量,最大150,越大效果越好,但延时较多
      * @retval None
    */
    AverageFilter::AverageFilter( s32 ini, u16 nNum )
    : m_number(nNum)
    , m_seek(0)
    , m_summation(0)
    {
    	if( m_number > AF_MAXWINDOW )	// 控制在数组范围内
    		m_number = AF_MAXWINDOW;
    	
    	// 初始化数组
    	for( int i = 0; i < AF_MAXWINDOW; i++ )
    	{
    		m_input[i] = ini;
    	}
    	
    	// 初始化总和
    	m_summation = ini * m_number;
    }
    
    /**
      * @date	06/06/2019
      * @brief  滤波算法,采用移位算法,减去第一个,加上最后一个。
      * @param	vi 输入数据
      * @retval 滤波后输出数据
    */
    s32 AverageFilter::filter( s32 vi )
    {
    	m_summation += ( vi - m_input[m_seek] );	// 总和中减去最早的数,加上新数
    	
    	// 用循环方法记录输入数据
    	assert_param(m_number <= AF_MAXWINDOW);
    	m_input[m_seek] = vi;
    	if (++m_seek >= m_number)
    		m_seek = 0;
    	
    	// 返回平均值
    	return m_summation / m_number;
    }
    

    MedianFilter.h

    #ifndef __MEDIANFILTER__
    #define __MEDIANFILTER__
    
    extern "C" {	// 兼容C,按C语言编译,Keil5中的包含文件已经加入了C++兼容,不用再加这一段
    #pragma diag_remark 368			//消除 warning:  #368-D: class "<unnamed>" defines no constructor to initialize the following:
    
    #include "stm32f10x.h"
    
    #pragma diag_default 368	// 恢复368号警告
    }
    
    #define DF_MAXWINDOW 21		// 最大窗宽,奇数,太大了反而不好
    
    class MedianFilter
    {
    // Construction
    public:
    	MedianFilter( s32 ini, u16 nNum );
    
    // Properties
    public:
    	u16 m_dfMedian;				// 半窗宽,最大10
    	u16 m_seek;					// 输入数据指针
    	s32 m_input[DF_MAXWINDOW];	// 输入数据,循环使用,不用移位,提高效率
    	s32 m_sort[DF_MAXWINDOW];	// 排序数据,最近输入的数据排序,取中间值输出
    
    private:
    
    // Methods
    public:
    	s32 filter( s32 vi );		// 滤波算法
    		
    // Overwrite
    public:
    };
    
    #endif
    

    MedianFilter.cpp

    /**
      ******************************************************************************
      * @file		MedianFilter.cpp
      * @author		Mr. Hu
      * @version	V1.0.0 STM32F103VET6
      * @date		06/05/2019
      * @brief		中值滤波
      ******************************************************************************
      * @remarks
      *		中值滤波的原理是,每次取最近几个数的中间值作为输出数据,每个波形的最高和最低
      *	几个数被滤掉,优点是基本保留原有数据,相当于去掉几个最高数,去掉几个最低数,能有
      * 效抑制大幅值低频尖峰干扰,俗称椒盐噪声。
      */ 
    
    /* Includes ------------------------------------------------------------------*/
    extern "C" {	// 兼容C,按C语言编译,Keil5中的包含文件已经加入了C++兼容,不用再加这一段
    #pragma diag_remark 368			//消除 warning:  #368-D: class "<unnamed>" defines no constructor to initialize the following:
    
    #pragma diag_default 368	// 恢复368号警告
    }
    
    #include "MedianFilter.h"
    
    /**
      * @date	06/05/2019
      * @brief  中值滤波
      * @param	ini 初始值,前几个输出数都是这个值
      * @param	nNum 滤波数,最大10,越大效果越好,但延时较多
      * @retval None
    */
    MedianFilter::MedianFilter( s32 ini, u16 nNum )
    : m_dfMedian(nNum)
    , m_seek(0)
    {
    	if( m_dfMedian > (DF_MAXWINDOW - 1) / 2 )	// 中值限制在数组范围内
    		m_dfMedian = (DF_MAXWINDOW - 1) / 2;
    	
    	// 初始化两个数组
    	for( int i = 0; i < DF_MAXWINDOW; i++ )
    	{
    		m_input[i] = ini;
    		m_sort[i] = ini;
    	}
    }
    
    /**
      * @date	06/05/2019
      * @brief  滤波算法
      * @param	vi 输入数据
      * @retval 滤波后输出数据
    */
    s32 MedianFilter::filter( s32 vi )
    {
    	u8 w1 = m_dfMedian * 2;		// 窗宽-1
    	
    	assert_param(w1 < DF_MAXWINDOW);
    	
    	// 计算将要移除的值在排序数组中的位置
    	u8 j = 0;
    	for (; j <= w1 && m_input[m_seek] != m_sort[j]; j++);
    
    	// 移除最早的数据并把新数据插入到适当的位置
    	// 如果新数据在较小半段,数据后移,否则数据前移,实现排序
    	// 只处理大于和小于情况,等于时不动
    	if (vi < m_input[m_seek])
    	{	// 向前移
    		while (j > 0 && vi < m_sort[j-1])
    		{
    			j--;
    			m_sort[j + 1] = m_sort[j];
    		}
    	}
    	else if (vi > m_input[m_seek])
    	{	// 向后移
    		while (j < w1 && vi > m_sort[j+1])
    		{
    			j++;
    			m_sort[j - 1] = m_sort[j];
    		}
    	}
    
    	// 加入新值
    	assert_param(j >= 0 && j < w);
    	m_sort[j] = vi;
    
    	// 用循环方法记录输入数据,高效
    	m_input[m_seek] = vi;
    	if (++m_seek > w1)
    		m_seek = 0;
    
    	// 返回中间值
    	return m_sort[m_dfMedian];
    }
    

    STM32实战系列源码,按键/定时器/PWM/ADC/DAC/DMA/滤波
    STM32实战一 初识单片机
    STM32实战二 新建工程
    STM32实战三 C++ IO.cpp
    STM32实战四 定时器和按键
    STM32实战五 板载LED显示数据
    STM32实战六 PWM加移相正交
    STM32实战七 数字滤波
    STM32实战八 DAC/ADC
    STM32实战九 编码器
    STM32开发过程的常见问题

     

     

    展开全文
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除...下面给出几种常用数字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo C ...

    99875969_1

    在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动检测系统中,为了提高采样的可靠性,减少虚假信息的影响,常常采用数字滤波的方法。

    数字滤波的方法有很多种,可以根据不同的测量参数进行选择。下面给出几种常用的数字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo C 2.0编制而成,在研华PC-610/386机上均编译通过,适用于PC机及其兼容机。

    1.程序判数滤波采样信号

    如因常受到随机干扰传感器不稳定而引起严重失真时,可以采用此方法。

    方法是:根据生产经验确定两交采样允许的最大偏差△×,若先后两次采样的信号相减数值大于△×,表明输入的是干扰信号,应该去掉;用上次采样值作为本次采样值,若小于、等于△×表明没有受到干扰,本次采样值效。该方法适用于慢变化的物理参数的采样,如温度、物理位置等测量系统。

    程序判断滤波的C程序函数如下:

    float program_detect_filter(float old_new_value[], float X)

    {

    float sample_value;

    if (fabs(old_new_value[1]_old_new_value[0])>X)

    sample_value=old_new_value[0];

    else

    sample_value=old_new_value[1];

    retrun(sample_value);

    }

    函数调用需一个一维的两个元素的数组(old_new_value[2],用于存放上次采样值(old_new_value[0],)和本次采样值(old_new_value[1],),函数中sample_value表示有效采样值,X表示根据根据经验确定的两次采样允许的最大偏差△×。

    2、中值滤波

    中值滤汉是对某一参数连续输入N次(一般N取奇数),从中选择一个中间值作为本次采样值,若变量变化比较缓慢,采用此方法效果比较好,但对快速变化过程的参数,如流量、自然伽玛等,则不宜采用。

    中值滤波的C程序函数如下:

    float middle_filter(float middle_value [] , intcount)

    {

    float sample_value, data;

    int i, j;

    for (i=1; i for(j=count-1; j>=i,--j){

    if(middle_value[j-1]=middle_value[j]{

    data=middle_value[j-1];

    middle_value[j-1]=middle_value[j]

    middle_value[j]=data;

    }

    }

    sample_value=middle_value(count-1)/2];

    return(sample_value);

    }

    函数假设对某一参数连续采样3次,若多次采样,可 对该函数稍作修改即可。3次采样值存储在数组mddle_value[3],其中Sample-value表示有效采样值,count表示连续采样次。

    3、滑动算术平均值滤波

    滑动算术平均值滤波是设一循环队列,依顺序存放N次采样数据,每次数据采集时,先将放在队列中第一个最早采集的数据丢掉,再把新数据放入队尾,然后求包括新数据在内的N个数据的算术平均值,便得到该次采样的有效数据。该方法主要用于对压力、流量等周期脉动的采样值进行平滑加工处理。

    滑动算术平均值滤波C程序函数如下:

    float middle_filter(float middle_value [] , intcount)

    float move_average_filtaer(float data_buf[], int count)

    {

    float sample_vaue,data=0;

    int i;

    for (i=0;i data+=data_buf;

    sample_value=data/count;

    return(sample_value;

    }

    函数假设顺序存放5次采样数据的数据缓冲区data_buf[5],对于多于5次的滑动算术平均值滤波,只需对该函数稍作修改即可,其中sample_value表示本次采样的有效数据,count表示数据有样次数。

    4.滑动加权平均值滤波

    滑动加权平均滤波是设一个数据缓冲区依顺序存放N次采样数据,每采进一个新数据,就将最先采集的数据丢掉,而后求包括新数据在内的N个数据的加权平均值,便得到该次采样的有效数据。该方法对脉冲性干扰的平滑作用尚不理想,不适用于脉冲性干扰比较严重的场合。

    滑动加权平均值滤波的C程序函数如下:

    floa move_times_filter(float data _buf [])

    {

    float sample_value;

    float filter_k[3]={0.3,0.2,0.15》;

    sample_value=filter_k[0]*data_buf[2]+filter_k[1]*(data_buf[1]

    +data_buf[3])+filter_k[2]*(data_buf[0]+data_buf[4;

    return(sample_value);

    }

    函数假设依次存放5次采样数据的数据缓冲区data_buf[5],对于多于5次的滑动加权平均滤波,只需对该函数稍作修改即可,其中数据组filter_k[3]表示加权系数,这三个系数的关系为filter_k[0]+2*filter_k[1]+2*filter_k[2]=1,本次采样的有效数据用sample_value表示。

    5、防脉冲干扰平均值滤波

    防脉冲干扰平均值滤波是连续进行N次采样,去掉其中最大值和最小值,然后求剩下的N-2个数据的平均值,作为本次采样的有效值。该方法适用于变量跳变比较严重的场合。这种滤波也应用边采样边计算的方法。

    float max_min_chioce(float x_buffer[],int number

    {

    int max_value, min_value;

    float sample_value=0.0;

    int i;

    max_value, =x_buffer[o];

    min_value=x_buffer[0];

    for(i=1;i){

    if(x_buffer>max_value)max_value=x_buffer;

    if(x_buffer }

    for(i=0; i sample_value=(sample_value_max_value_min_value)/(number-2);

    return(sample_value);

    }

    函数假设存放连续进行5次采样的数据缓冲区data_buf[5],对于多于5次的防脉冲干扰平均值滤波,只需对该函数稍作修改即可,其中Sample_value表示本次采样的有效数据,number表示连续进行的采样次数。

    6、低通数字滤波

    低通滤波也称一阶滞后滤波,方法是第N次采样后滤波结果输出值是(1-a)乘第N次采样值加a乘上次滤波结果输出值。可见a<>float low_filter(float low_buf[])

    {

    float sample_value;

    float X=0.01;

    sample_value=(1_X)*low_buf[1]+X*low buf[0];

    retrun(sample_value);

    }

    函数假设求第2次采样后滤波结果输出值sampe_valeu,数组low_buf[2]表示存放上次滤波结果输出值(low_buf[0])和本次采样值(low_buf[1]),X表示a。

    为方便以上几种滤波函数的理解,下面给出调用以上函数的程序例。

    #include

    #include

    #include

    main()

    {

    folat old_new_buf[2]={1.2,2.6};

    float middle_value[3]={20,12,18};

    float data_average_buf[5]={10,20,20,10,10};

    float data_times_buf[5]={1.4,1.5,1.3,1.2,1.0};

    float data_max_min_buf[5]={1.2,80,1.4,0.2,1.3};

    foat low_buf[2]={1.2,2.0};

    float xx;

    xx=program_detect_filter(old_new_buf,1.0};

    printf('The program detect filter value is:%f\n',xx);

    xx=middle_filter (middle_value, 3);

    printf('The middle filter value is:%f\n:,xx);

    xx=move_avergae_filter(data_avergae_buf,5);

    printf('the mover average filter value is:%f\n',xx);

    xx=move_times_filter(data_time_fud);

    printf('The move times filter value is:%f\n',xx);

    xx=max_min_choice(data_max_min_buf,5);

    printf('The max-min filter value is:%f\n',xx);

    xx=low_filter(low_buf);

    printf('The low filter value is:%f\n',xx);

    }

    运行执行程序,屏幕显示:

    The program detect filter value is: 1.200000

    The middle filter value is:18.000000

    The move average filter value is:14.000000

    The move times filter value is:1.310000

    The max_min filter value is:1.366666

    The low filter value is:1.992000

    数字滤波器与模拟滤波器的区别主要在于一个是采用软件(程序)的数值计算(数字滤波器),另外一个是采用硬件电路获得(模拟滤波器)。

    数字滤波器的原理有多种,取平均值是其中的一种。取平均值就是滤除任何有具有频率的变化分量的信号。数字滤波器还可根据不同原理编制专门的程序,对采集的信号进行特殊的计算来滤除特定频率的信号。

    模拟滤波器的原理主要是利用电容器对高频信号的低阻抗、对低频信号的高阻抗和电感对对低频信号的低阻抗、对高频信号的高阻抗的特性,滤除特定频率的信号。

    展开全文
  • OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法。 线性滤波: 1.方框滤波:模糊图像 2.均值滤波:模糊图像 3.高斯滤波:信号的平滑处理,去除符合正太分布的噪声 非线性滤波 1.中值滤波...
  • highspeedlogic算法仿真---数字滤波技术

    千次阅读 2020-08-29 16:22:23
    数字滤波器是输入数字序列变为输出数字序列的数字信号处理器,是语音与图形处理,模式...数字滤波是数字信号处理理论的一部分。数字信号处理主要是研究用数字或符号的序列来表示信号波形,并用数字的方式去处理这些序列
  • 常用数字滤波方法都有哪些,写出其中三种数字经典滤波的概念,是根据傅里叶分析和变换提出的一个工程概念。根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成。换句话说,...
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,...下面给出几种常用数字滤波方法的C语言函数,这些函数有一定的通用性,适用于PC...
  • 用C语言实现数字滤波

    千次阅读 2016-09-12 15:37:03
    最近在做金属检测机,发射线圈正弦波信号产生磁场,变化的磁场再在两个接收线圈中产生频率相同,相位和幅值变化的信号,嵌入式芯片通过AD芯片模块采集到调制后的信号,对采集的信号数据进行滤波处理,去掉高频部分,...
  • 关注、星标公众号,直达精彩内容单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,可避免地要用到数学运算,尽管单片机并擅长实现算法和进行复杂的运算。下面主要是...
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除...下面给出几种常用数字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo C ...
  • 串口通信之常用滤波算法

    千次阅读 2013-04-12 16:35:36
    在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常...下面给出几种常用数字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo
  • 为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实现数字滤波,其算法往往是系统测控算法的一个重要组成部分,实时性很强,采用汇编语言来编写。 采用数字滤波算法克服随机干搅引入的误差...
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,可避免地要用到数学运算,尽管单片机并擅长...
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,可避免地要用到数学运算,尽管单片机并擅长...
  • 本文将向您介绍MVTec HALCON中一些最常用的滤波器,它们是如何工作的以及可以用于什么。 mean_image:均值滤波器 首先,我们读取具有背景纹理的示例图像。我们的目标是在改变实际信息的情况下删除背景纹理。让...
  • Date: 2019.04.03【Tag:算法总结】 前言     图像滤波是图像去噪的经典方法滤波过程本质就是卷积过程,...本文主要是对常用数字图像滤波去噪算法进行总结,并给出常用滤波算法的matlab实现(调用函数)。
  • 滤波

    千次阅读 2015-08-19 16:59:33
    数字滤波(digital filtering):指用数字设备,通过一定的算法,对信号进行处理,将某个频段的信号进行滤除,得到新的信号的这一过程叫做数字滤波。数字滤波器可以分为两大部分:即经典滤波器和现代滤波器。经典...
  • X是输入信号 y = filter(b,a,X)完成对输入信号X的滤波,y与x的大小相同 7 filtfilt y = filtfilt(b,a,X) 对输入信号X进行零相位数字滤波 b和a分别为滤波器传递函数H(z)的分子多项式和分母多项式系数;
  • 第1章为计算机控制系统概述,介绍了计算机控制系统的组成,常用的工业控制计算机,工业计算机总线技术,计算机控制技术的发展趋势等.第2章为计算机控制过程通道,介绍以ISA总线为规范的计算机控制过程通道的一般结构,数字...
  • 很多时候将图像噪声看作多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述,即使用其概率分布函数和概率密度分布函数。图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中...
  • 介绍常用数字信号的产生,傅里叶变换,卷积,FIR、IIR滤波器设计,频谱分析,图像处理,全书446页,包括完整的C语言实现代码
  • 详解卡尔曼滤波原理

    万次阅读 多人点赞 2017-03-18 13:54:15
    详解卡尔曼滤波原理 在网上看了不少与卡尔曼滤波相关的博客、论文,要么是只谈理论、缺乏感性,或者有感性认识,缺乏理论推导。能兼顾二者的少之又少,直到我看到了国外的一篇博文,真的惊艳到我了,不得佩服作者...
  • 以下介绍十种数据采集滤波方法和编程实例。这10种方法针对不同的噪声和采样信号具有不同的性能,为不同场合的应用提供了较广的选择空间。选择这些方法时,必须了解电路种存在的主要噪声类型,主要包括一下方面: ...
  • 常用数字图像分割方法

    千次阅读 2018-11-05 06:52:50
    常用的阈值化分割方法是将图像的灰度分成不同的级别,然后设置灰度门限值,再基于这个门限值将图像分割为不同的区域。 阈值化分割由于其直观性和易操作性成为最常见的图像分割方法之一。 图像分割阈值化处理的...
  • 介绍几种邻域滤波方法

    千次阅读 2017-07-20 11:33:52
    【卷积滤波】 ...通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素: 其中权重核 为“滤波系数”。上面的式子可以简记为: 【方框滤波】 最简单的线
  • 本部分主要对应第三章《3.1节 背景知识》和《3.2节 一些基本的灰度变换函数》,介绍了空间域、灰度变换、空间滤波、邻域的概念,结合案例介绍了灰度变换中的图像反转、对数变换、幂律变换、分段线性变换的原理和用途...
  • 本文主要给大家讲解图像空间域滤波的相关内容,包括空域滤波概念,以及常用的空域滤波算法,并通过C语言编程来实现几种常用空域滤波(均值滤波、中值滤波、最大值滤波、最小值滤波、高斯滤波和统计滤波),帮助初学者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,114
精华内容 4,045
关键字:

常用数字滤波方法不包括