精华内容
下载资源
问答
  • 滑动滤波

    千次阅读 2019-04-01 15:42:43
    滑动滤波 #define NUM 10 // 缓存区大小 float filter(uint8_t data) { static uint8_t buf[NUM]; static uint8_t index=0,flag=0; static float sum=0; // 替换之前位置上的数据 sum += data - buf[index];...

    滑动滤波

    设置一个缓存区,剔除最旧数据,将新数据添加到缓存区,再取缓存区里面现有数据的平均值,以此循环。

    #define NUM 10		// 缓存区大小
    float filter(int16_t data)
    {
    	static int16_t buf[NUM];
    	static int16_t index=0,flag=0;
    	static float sum=0;
    	
    	// 替换之前位置上的数据
    	sum += data - buf[index];	
    	buf[index] = data;
    	index++;
    	
    	// 控制数据循环放置到缓冲区
    	if(index==NUM)
    	{
    		index = 0;
    		flag = 1;
    	}
    	
    	// 如果没有充满缓存区,有几个就取几个的平均
    	if(flag==0)		return sum/index;
    	else			return sum/NUM;
    }
    
    展开全文
  • 滑动滤波算法

    千次阅读 2017-12-15 21:50:53
    滑动滤波

    思路

    数据由队列管理,先减去头部的数,再加上新的数据到尾部,除以队列有效数据长度

    代码实现

    static int PowerMag_CaptureBatteryVoltage(RobotBatteryPowerInfo_typedef* BatteryInfor)
    {
        #define BATTERY_VOLTAGE_LENGTH (uint8_t)20
        #define BATTERY_VOLTAGE_TOP_ERR (uint32_t)40000   //mV
        static float s_fReadBatteryVoltage = 0.0;
        static float s_fReadBatteryVoltageArry[BATTERY_VOLTAGE_LENGTH] = {0.0};
        static float s_fReadBatteryVoltageTotoal = 0.0;
        static uint8_t  s_ReadBatteryVoltageIndex = 0;
        static uint8_t  s_TempCnt = 0;
    
        s_fReadBatteryVoltage = ad74xx.readBatteryVoltage(BATTERY_VOL_SENSOR_1ST);
    
        /* Judge the voltage is valid  */
        if(s_fReadBatteryVoltage == 0)  
            return (-1);
        if(s_fReadBatteryVoltage > BATTERY_VOLTAGE_TOP_ERR) 
            return (-2);
    
        s_fReadBatteryVoltageTotoal -= s_fReadBatteryVoltageArry[s_ReadBatteryVoltageIndex];
        s_fReadBatteryVoltageArry[s_ReadBatteryVoltageIndex] = s_fReadBatteryVoltage;
        s_fReadBatteryVoltageTotoal += s_fReadBatteryVoltageArry[s_ReadBatteryVoltageIndex];
    
        if(s_ReadBatteryVoltageIndex < (BATTERY_VOLTAGE_LENGTH-1)){
            s_ReadBatteryVoltageIndex++;
            s_TempCnt ++;
        }else{
            s_ReadBatteryVoltageIndex = 0;
        }
    #if 1  /* This way is always to be avange */
        if(s_TempCnt >= 1){
            if(s_TempCnt >=  BATTERY_VOLTAGE_LENGTH){
                s_TempCnt = BATTERY_VOLTAGE_LENGTH;
            }
            BatteryInfor->RobotVoltage = s_fReadBatteryVoltageTotoal/s_TempCnt;
        }
    #else  /* This way RobotVoltage would be appeared after start 2s */
        if(s_TempCnt >= BATTERY_VOLTAGE_LENGTH){
            BatteryInfor->RobotVoltage = s_fReadBatteryVoltageTotoal / BATTERY_VOLTAGE_LENGTH;
            s_TempCnt  = BATTERY_VOLTAGE_LENGTH; 
        }
    #endif  
        return 0;
    }
    展开全文
  • 针对实际采样过程中出现的采样非均匀性,提出了基于连续傅里叶变换的非均匀采样信号频谱分析方法和非均匀采样信号的滑动滤波方法。将非均匀采样信号描述为不均匀采样时刻冲激函数代数和的形式,利用连续傅里叶变换...
  • 一种基于滑动滤波的数字AGC应用,吕余清,,阐述了一种基于滑动滤波的数字自动增益控制(DAGC)的实现方法,采用数字下变频(DDC)后数据的模值作为样本数据,运用滑动滤波算法,
  • 针对具有复杂背景干扰和立体结构的陶瓷瓦表面裂纹缺陷,提出基于滑动滤波和自动区域生长的方法对陶瓷瓦表面裂纹进行提取。首先对采集图像进行预处理,并将图像分割为瓦头和纹理两个区域;然后用自定义滑动滤波法对瓦头...
  • 摘 要: 针对实际采样过程中出现的采样非均匀性,提出了基于连续傅里叶变换的非均匀采样信号频谱分析方法和非均匀采样信号的滑动滤波方法。通过MATLAB仿真软件验证了这种非均匀采样信号分析与处理方法的正确性,将...
  • 摘 要: 针对实际采样过程中出现的采样非均匀性,提出了基于连续傅里叶变换的非均匀采样信号频谱分析方法和非均匀采样信号的滑动滤波方法。通过MATLAB仿真软件验证了这种非均匀采样信号分析与处理方法的正确性,将...
  • MATLAB的滑动滤波算法 对于滤波算法:这里不强调数学公式的推理,只要讲一下在工程中的应用,举个最简单的例子,假如有1000个数,4个为一组,那么一共有250组。取第,1,2,3,4个数取平均值,新的数组的第一个向量A...

                                  MATLAB的滑动滤波算法

    • 对于滤波算法:这里不强调数学公式的推理,只要讲一下在工程中的应用,举个最简单的例子,假如有1000个数,4个为一组,那么一共有250组。取第,1,2,3,4个数取平均值,新的数组的第一个向量A的第一个数,A(1);之后取第,2,3,4,5个数的平均值,放入A(2);依次类推。 注意这里不是第1,2,3,4个数为一组,第2,3,4,5个数为一组,若这样则会损失大约750个数。

    •  

    • 代码实例

      clear all;
      clc;
      A=importdata('E:\MATLAB代码\toulan.txt');
      xlswrite('E:\MATLAB代码\toulan.xlsx',A);

       我这里以一个txt中的数据为例作为处理,如果是图像也一样的,但是图像的像素点是二维的,要放入矩阵中,而不是向量内。

    importdata()函数的使用可以了解下,非常好用的一个函数,具体可以用help importdata在matlab的命令窗口中走一下,大致就是给一个文件的地址(filename),返回其中文件的内容。

    xslwrite()这个函数暂时可以忽略,我是将txt文件导出的数据放到一个Excel表格中便于观察才写的。

    B=A(:,7);
    subplot(3,1,1)
    plot(B);
    title('原数据');
    
    • A是在上一个代码例子中从txt文件内得到的数据,我需要其中第七列的所有数据,并把它提取到B中,并用plot打印。

    • L=length(B);
      i=1;
      N=4;
      for i=1:L-N
          C(i)=mean(B(i:i+N-1));
      end
      subplot(3,1,2);
      plot(C);
      title('滤波后');

      取B的长度,放入循环中,由于N=4,故取的是每4个数为一组。

    注意for循环的范围,如果有1000个数,那么在996时循环就要停止,因为如果997+4=1001超出范围了,会报错的。

    • 下面上一组数据,可能不是很明显,所以我做了一个滤波的对比图。

    展开全文
  • test3、用均值法将原始的传感器信号进行滤波处理test4、用滑动滤波法将原始的传感器信号进行滤波处理 总结 1.为什么传感器要进行信号处理: 仪器仪表上面的数据如果是跳来跳去的话,就没法用,比如说压力传感器,...

    总结

    1.为什么传感器要进行信号处理:
    仪器仪表上面的数据如果是跳来跳去的话,就没法用,比如说压力传感器,一会显示1一会显示2,那么这个数字就没多大意义,所以需要进行信号处理。
    2.这个仿真的代码中while(1)起到的是画点的作用,
    LCD_L0_DrawPixel(x, y)是画一个像素点,可以用一个for循环改变这个点的xy坐标值画不同的连续的点,很多个点动起来就成了一条线。
    其中rand()%40意味着随机信号的幅度在40以内。
    3.void draw_graphic(int y,int z,int color)这个函数起到了让点动起来的作用。

    test1、动态显示一段正弦波信号的曲线:

    整个文件很大,但是目前只需要处理MainTask.c文件的内容:

    以下是MainTask.c文件的内容

    #include "GUI.h"
    #include "GUI_Protected.h"
    
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define pi 3.1415926
    #define LVBOTIME 20
    extern const GUI_BITMAP bmMicriumLogo;
    extern const GUI_BITMAP bmMicriumLogo_1bpp;
    void draw_graphic(int y,int z,int color);
    int yy[2][320];
    int LVBO[LVBOTIME];
    
    /*
    *******************************************************************
    *
    *              main()
    *
    *******************************************************************
    */
    void MainTask(void) {
    	int Cnt =0;
    	int YPos,shidu=0,wendu=0;
    	int x,y=0,flag_x=1,flag_y=1;
    	float z=0,i=0;
    	int LCDXSize = LCD_GET_XSIZE();
    	int LCDYSize = LCD_GET_YSIZE();
    	const GUI_BITMAP *pBitmap;
    	GUI_Init();
    	GUI_SetColor(GUI_BLUE);
    	GUI_SetBkColor(GUI_WHITE);
    	GUI_Clear();
    	
    	GUI_DispStringHCenterAt("jym016", 280, 200);
    	while(1)
    	{
    		i++;
    		if(i==360) i=0;
    		z=sin(i/180*pi*4);
    		draw_graphic(z*20+120,1,GUI_RED);
    	}
    }
    
    void draw_graphic(int y,int z,int color)
    {
    	int x=0;
    	GUI_SetColor(GUI_WHITE);
    	for(x=0;x<320;x++)
    	{   
    		LCD_L0_DrawPixel(x+1, yy[z][x]);
    		if(yy[z][x]<yy[z][x+1])
    			GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    		else
    			GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); 
    	}
    	for(x=0;x<320;x++)
    	{yy[z][x]=yy[z][x+1];}
    	yy[z][319]=y;
    	GUI_SetColor(color);
    	for(x=0;x<320;x++)
    	{
    		LCD_L0_DrawPixel(x+1, yy[z][x]);
    		if(yy[z][x]<yy[z][x+1])
    			GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    		else
    			GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); 
    	}
    	GUI_Delay(50);
    }
    

    实验结果:
    在这里插入图片描述
    在这里插入图片描述

    test2、现提供随机信号函数,随意设定两路不同幅度的随机信号,动态显示出来。

    #include "GUI.h"
    #include "GUI_Protected.h"
    
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define pi 3.1415926
    #define LVBOTIME 20
    extern const GUI_BITMAP bmMicriumLogo;
    extern const GUI_BITMAP bmMicriumLogo_1bpp;
    void draw_graphic(int y,int z,int color);
    int yy[2][320];
    int LVBO[LVBOTIME];
    
    /*
    *******************************************************************
    *
    *              main()
    *
    *******************************************************************
    */
    void MainTask(void) {
    	int Cnt =0;
    	int i,YPos,shidu=0,wendu=0;
    	int x,y,flag_x=1,flag_y=1;
    	float z=0;
    	int LCDXSize = LCD_GET_XSIZE();
    	int LCDYSize = LCD_GET_YSIZE();
    	const GUI_BITMAP *pBitmap;
    	GUI_Init();
    	GUI_SetColor(GUI_BLUE);
    	GUI_SetBkColor(GUI_WHITE);
    	GUI_Clear();
    	
    	GUI_DispStringHCenterAt("jym016", 280, 200);
    	while(1)
    	{
    		y = rand()%40;
    		draw_graphic(y+50,0,GUI_RED);
    		y = rand()%10;
    		draw_graphic(y+150,1,GUI_BLUE);
    	}
    }
    
    void draw_graphic(int y,int z,int color)
    {
    	int x=0;
    	GUI_SetColor(GUI_WHITE);
    	for(x=0;x<320;x++)
    	{   LCD_L0_DrawPixel(x+1, yy[z][x]);
    	if(yy[z][x]<yy[z][x+1])
    		GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    	else
    		GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); }
    	for(x=0;x<320;x++)
    	{yy[z][x]=yy[z][x+1];}
    	yy[z][319]=y;
    	GUI_SetColor(color);
    	for(x=0;x<320;x++)
    	{
    		LCD_L0_DrawPixel(x+1, yy[z][x]);
    		if(yy[z][x]<yy[z][x+1])
    			GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    		else
    			GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); 
    	}
    	GUI_Delay(50);
    }
    

    实验结果:
    在这里插入图片描述
    在这里插入图片描述

    test3、用均值法将原始的传感器信号进行滤波处理

    #include "GUI.h"
    #include "GUI_Protected.h"
    
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define pi 3.1415926
    #define LVBOTIME 20
    extern const GUI_BITMAP bmMicriumLogo;
    extern const GUI_BITMAP bmMicriumLogo_1bpp;
    void draw_graphic(int y,int z,int color);
    int yy[2][320];
    int LVBO[LVBOTIME];
    
    /*
    *******************************************************************
    *
    *              main()
    *
    *******************************************************************
    */
    void MainTask(void) {
    	int Cnt =0;
    	int i,YPos,shidu=0,wendu=0;
    	int x,y=0,flag_x=1,flag_y=1;
    	float z=0;
    	int LCDXSize = LCD_GET_XSIZE();
    	int LCDYSize = LCD_GET_YSIZE();
    	const GUI_BITMAP *pBitmap;
    	GUI_Init();
    	GUI_SetColor(GUI_BLUE);
    	GUI_SetBkColor(GUI_WHITE);
    	GUI_Clear();
    	
    	GUI_DispStringHCenterAt("jym016", 280, 200);
    	while(1)
    	{
    		draw_graphic(y+50,0,GUI_RED);
    		for(x=0;x<LVBOTIME;x++)
    		{
    			y = rand()%40;
    			z+=y;
    		}
    		z/=LVBOTIME;
    		draw_graphic(z+150,1,GUI_GREEN);
    	}
    }
    
    void draw_graphic(int y,int z,int color)
    {
    	int x=0;
    	GUI_SetColor(GUI_WHITE);
    	for(x=0;x<320;x++)
    	{   
    		LCD_L0_DrawPixel(x+1, yy[z][x]);
    		if(yy[z][x]<yy[z][x+1])
    			GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    		else
    			GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); 
    	}
    	for(x=0;x<320;x++)
    	{yy[z][x]=yy[z][x+1];}
    	yy[z][319]=y;
    	GUI_SetColor(color);
    	for(x=0;x<320;x++)
    	{
    		LCD_L0_DrawPixel(x+1, yy[z][x]);
    		if(yy[z][x]<yy[z][x+1])
    			GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    		else
    			GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); 
    	}
    	GUI_Delay(50);
    }
    

    实验结果:
    在这里插入图片描述

    test4、用滑动滤波法将原始的传感器信号进行滤波处理

    #include "GUI.h"
    #include "GUI_Protected.h"
    
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define pi 3.1415926
    #define LVBOTIME 20
    extern const GUI_BITMAP bmMicriumLogo;
    extern const GUI_BITMAP bmMicriumLogo_1bpp;
    void draw_graphic(int y,int z,int color);
    int yy[2][320];
    int LVBO[LVBOTIME];
    
    /*
    *******************************************************************
    *
    *              main()
    *
    *******************************************************************
    */
    void MainTask(void) {
    	int Cnt =0;
    	int i,YPos,shidu=0,wendu=0;
    	int x,y,flag_x=1,flag_y=1;
    	float z=0;
    	int LCDXSize = LCD_GET_XSIZE();
    	int LCDYSize = LCD_GET_YSIZE();
    	const GUI_BITMAP *pBitmap;
    	GUI_Init();
    	GUI_SetColor(GUI_BLUE);
    	GUI_SetBkColor(GUI_WHITE);
    	GUI_Clear();
    	
    	GUI_DispStringHCenterAt("jym016", 280, 200);
    	while(1)
    	{
    		y = rand()%40;
    		draw_graphic(y+50,0,GUI_RED);
    		for(x=0;x<LVBOTIME;x++)
    			LVBO[x] = LVBO[x+1];
    		LVBO[LVBOTIME-1] = y;
    		z=0;
    		for(x=0;x<LVBOTIME;x++)
    			z += LVBO[x];
    		z/=LVBOTIME;
    		draw_graphic(z+140,1,GUI_GREEN);
    	}
    }
    
    void draw_graphic(int y,int z,int color)
    {
    	int x=0;
    	GUI_SetColor(GUI_WHITE);
    	for(x=0;x<320;x++)
    	{   LCD_L0_DrawPixel(x+1, yy[z][x]);
    	if(yy[z][x]<yy[z][x+1])
    		GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    	else
    		GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); }
    	for(x=0;x<320;x++)
    	{yy[z][x]=yy[z][x+1];}
    	yy[z][319]=y;
    	GUI_SetColor(color);
    	for(x=0;x<320;x++)
    	{
    		LCD_L0_DrawPixel(x+1, yy[z][x]);
    		if(yy[z][x]<yy[z][x+1])
    			GUI_DrawVLine(x+1, yy[z][x], yy[z][x+1]); 
    		else
    			GUI_DrawVLine(x+1, yy[z][x+1], yy[z][x]); 
    	}
    	GUI_Delay(50);
    }
    

    实验结果:
    在这里插入图片描述
    可以看出滑动滤波比均值滤波效果好得多

    展开全文
  • 滑动滤波并填充空值

    2021-03-10 17:03:45
    ymean =y.rolling(window=12).mean()#滑动窗口取平均值,我取了12个 ymean[ymean.isnull()] = y[ymean.isnull()]#a列中的空值用b列中的对应值填充 print(ymean)
  • import numpy as np import matplotlib . pyplot as plt class kalman_filter2 : def __init__ ( self , Q , R ) : self ...小结:卡尔曼Q R值调试是个技术活,对滤波效果影响很大
  • 1、限幅滤波法(又称程序判断滤波法) 2、中位值滤波法 3、算术平均滤波法 4、递推平均滤波法(又称滑动平均滤波法 5、中位值平均滤波法(又称防脉冲干扰平均滤波法) 6、限幅平均滤波法 7、一阶滞后滤波法 8、加权...
  • 剔除毛刺滤波处理程序 *****************************************************************/ void BurrFilter(BURR_FILTER_STRUCT * filter) { int m_Deta; m_Deta = abs((filter->Input) - (f...
  • #include <iostream> #include <random> #include <functional> #include <vector> #include <deque> using namespace std; int main() { std::default_random_engine ... dist
  • 1限幅滤波法/程序判断滤波法A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次...
  • void saadc_evt_callback(nrf_drv_saadc_evt_t const * p_event) { } //滤波后的电池电压x100的值 比如 300 表示 3.0v uint16_t g_filteredBatteryVol = 0; //读电池电压引脚工作模式 static bool s_isBatPinAdcMode...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 641
精华内容 256
关键字:

滑动滤波