常用滤波算法

  • r9_104909
    了解作者
  • 2.7KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-01 12:49
    上传日期
包含 移动平均滤波,中值平均滤波,一阶滞后滤波 三种常用滤波,可用于各种采样,AD,温度等等
Algorithm.rar
  • Algorithm
  • Algorithm.h
    1.7KB
  • Algorithm.c
    6.9KB
内容介绍
#include "Algorithm.h" //算法数据区 //AlgDataStr myAlgTemperDataStr={.ArraryLen=TD_ArraryNum}; //AlgDataStr myAlgDampnessDataStr={.ArraryLen=TD_ArraryNum}; //#define TemperLimitsValue 5 //#define DampnessLimitsValue 10 short TemperLastValue = 250;//25度 short DampnessLastValue = 550;//55% AlgDataStr TemperAlgDataStr={.ArraryLen=4}; //***************************** //PM25可先做中值平均滤波 //再用卡尔曼滤波 //但这样必须提高采样率 //***************************** //Q是预测协方差 过小系统收敛慢 过大有可能滤波不干净 ***** R值是测量协方差,影响延迟程度,越大越延迟 //AlgKalmanDataStr myAlgVocDataStr={.M_X_Last=50,.M_P_Last=10,.M_Q=0.005,.M_R=0.2};//Voc是热电阻式的,基本上不用做滤波 //AlgKalmanDataStr myAlgPM25DataStr={.M_X_Last=50,.M_P_Last=10,.M_Q=0.005,.M_R=0.1};//必须初始化的值 AlgKalmanDataStr myAlgPM25DataStr={.M_X_Last=50,.M_P_Last=10,.M_Q=0.01,.M_R=0.07};//必须初始化的值 //unsigned char VocTimeFlag=0;//在定时器中使用,原先采样是1s时间,现已修改,用此变量提高采样率 PreheatStr myPreheatStr={.PreheatFlag=0,.PreheatTime=0}; //算法数据区end //#################################################################### //********************************************************************************* //AlgorithmLimits //限值滤波 //------ //输入参数 //(short NewValue,short* LastValue,short LimitsValue)新的采样值,历史值,限制值 //------ //返回 //ret 经过滤波处理后的值 //超过限定值时就当做有效的 //********************************************************************************* short AlgorithmLimits(short NewValue,short* LastValue,short LimitsValue) { short ret=*LastValue; if(NewValue==*LastValue) { ret = *LastValue; } else if(NewValue>*LastValue) { if((NewValue-*LastValue)>=LimitsValue) { ret = NewValue; *LastValue = NewValue; } } else //if(NewValue<*LastValue) { if((*LastValue-NewValue)>=LimitsValue) { ret = NewValue; *LastValue = NewValue; } } return ret; } /********************************************************************************* //AlgorithmMidAv //中值平均滤波 //------ //输入参数 //DataArrary[] 要处理的数组 //ArraryLen 要计算的数组的元素个数 //------ //返回 //OutValue 经过滤波处理后的值 *********************************************************************************/ int AlgorithmMidAv(int DataArrary[],unsigned int ArraryLen) { int i; int MaxIndex=0,MinIndex=0; int OutValue=0; int Max=0,Min=0; //myprintf0("AlgorithmMidAv 1"); if(ArraryLen<3) // 长度小于三 算法没意义 return 0; //myprintf0("AlgorithmMidAv 2"); Max = DataArrary[0]; for(i=1;i<arraryLen;i++) //找到最大值的下标 { if(Max < DataArrary[i]) { Max = DataArrary[i]; MaxIndex = i; } } //myprintf0("AlgorithmMidAv 3"); Min = DataArrary[0]; for(i=1;i<ArraryLen;i++) //找到最小值的下标 { if(Min rel='nofollow' onclick='return false;'> DataArrary[i]) { Min = DataArrary[i]; MinIndex = i; } } //myprintf0("AlgorithmMidAv 4"); if(Min==Max) //最大和最小值相等 即所有值相等 { return Min; // 直接返回,不用再滤波 } //myprintf("MinIndex and MaxIndex = ",(unsigned int)MinIndex,(unsigned int)MaxIndex); DataArrary[MinIndex] = 0; DataArrary[MaxIndex] = 0;//把最大最小值去除 做0处理 bug 找不到 MaxIndex 会有可能 MaxIndex 为不定值,将会在这个不定的地址中写0 错误 所以在定义时 应该赋0 //myprintf0("AlgorithmMidAv 5"); for(i=0;i<arraryLen;i++) { OutValue += DataArrary[i]; } OutValue /= (ArraryLen-2);//去掉最大最小值后的均值 //myprintf0("AlgorithmMidAv 6"); return OutValue; } /////// ////////// //********************************************************************************* //AlgorithmQueueAv //递推平均滤波 //------ //输入参数 //myAlgDataStr 历史值结构体 //SamplingValue 新的采样值 //------ //返回 //OutValue 经过滤波处理后的值 //********************************************************************************* float AlgorithmQueueAv(AlgDataStr* myAlgDataStr,float SamplingValue) { int i; float OutValue=0; if(myAlgDataStr- rel='nofollow' onclick='return false;'>ArraryLen>1) { for(i=myAlgDataStr->ArraryLen-1;i>0;i--)//历史值前一位往后移 { myAlgDataStr->DataArrary[i] = myAlgDataStr->DataArrary[i-1]; } myAlgDataStr->DataArrary[0] = SamplingValue;//新值 for(i=0;i<myAlgDataStr->ArraryLen;i++) { OutValue += myAlgDataStr->DataArrary[i]; } OutValue /= myAlgDataStr->ArraryLen; } else { myAlgDataStr->DataArrary[0] = OutValue = SamplingValue; } return OutValue; } /////// //********************************************************************************* //AlgorithmOnceLag //一阶滞后滤波 //------ //输入参数 //myAlgDataStr 历史值结构体 //Coefficient 算法系数 0 <= Coefficient < 1 越接近1对历史值的依赖性越大 //SamplingValue 新的采样值 //------ //返回 //OutValue 经过滤波处理后的值 //********************************************************************************* //#define Coefficient 0.2 float AlgorithmOnceLag(AlgDataStr* myAlgDataStr,float SamplingValue,float Coefficient) { float OutValue=0; if(0<= Coefficient <1) { OutValue = Coefficient*myAlgDataStr->DataArrary[0] + (1-Coefficient)*SamplingValue; } else { OutValue = SamplingValue; } myAlgDataStr->DataArrary[0] = OutValue; return OutValue; } /////////// //********************************************************************************* // AlgorithmKalman //Kalman滤波 //------ //输入参数 //myAlgKalmanDataStr 要进行滤波计算的对象 //SamplingValue 新的采样值 //------ //返回 //经过滤波处理后的值 //********************************************************************************* float AlgorithmKalman(AlgKalmanDataStr* myAlgKalmanDataStr,float SamplingValue) { myAlgKalmanDataStr->M_X_Mid = myAlgKalmanDataStr->M_X_Last; myAlgKalmanDataStr->M_P_Mid = myAlgKalmanDataStr->M_P_Last + myAlgKalmanDataStr->M_Q; myAlgKalmanDataStr->M_Kg = myAlgKalmanDataStr->M_P_Mid/(myAlgKalmanDataStr->M_P_Mid + myAlgKalmanDataStr->M_R); myAlgKalmanDataStr->M_X_Now = myAlgKalmanDataStr->M_X_Mid + myAlgKalmanDataStr->M_Kg*(SamplingValue - myAlgKalmanDataStr->M_X_Mid); myAlgKalmanDataStr->M_P_Now = (1-myAlgKalmanDataStr->M_Kg)*myAlgKalmanDataStr->M_P_Mid; myAlgKalmanDataStr->M_X_Last = myAlgKalmanDataStr->M_X_Now; myAlgKalmanDataStr->M_P_Last = myAlgKalmanDataStr->M_P_Now; return myAlgKalmanDataStr->M_X_Now; } /* #define MTestNum 32 float MTest[MTestNum]={100,95,93,105,100,91,99,103,101,97, 99,100,106,101,95,98,99,100,103,96, 93,94,94,101,100,99,96,99,102,97, 102,98 }; float MTest2[MTestNum]; void KalmanTest(void) { int i; for(i=0;i<MTestNum;i++) { MTest2[i]=(short)AlgorithmKalman(&myAlgVocDataStr,MTest[i]); } i = 0; } */ ////////////////// //####################################################################
评论
    相关推荐
    • 算法
      算法 算法
    • 程序员算法
      这是一个算法文档压缩包,其中包括《可能与不可能的边界》、《具体数学》、《算法的乐趣》、《啊哈!算法》。这些书很适合对算法感兴趣的朋友,书籍讲解算法非常有趣。注意,其中有些文档是试读版本。
    • 算法实验
      算法实验算法实验算法实验算法实验算法实验算法实验算法实验算法实验
    • SIFT 算法
      SIFT 算法SIFT 算法SIFT 算法SIFT 算法
    • RSA算法
      RSA算法是公钥加密算法中重要的算法之一,本算法即实现RSA的加解密过程。
    • 分词算法介分词算法
      算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语...
    • unify算法
      unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法unify算法
    • 寻路算法
      寻路算法 寻路封装
    • dsp算法算法算法算法
      dsp各种算法
    • 大数据算法
      本书共分为10章,第1章概述大数据算法,第2章介绍时间亚线性算法,第3章介绍空间亚线性算法,第4章概述外存算法,第5章介绍大数据外存查找结构,第6章讲授外存图数据算法,第7章概述MapReduce算法,第8章通过一系列...