简介:
  递推滤波程序通过不断让存入的数据队列化输入存储槽进行算数平均操作,因此相比直接进行存储算数平均输入的信号有着更好的平滑性,缺点是速度相比中位值和算数平均滤波有着更高的算数复杂度与更长的处理时间。
  
  const int Input = 1;//A1为电平输入口
  const int Output = 0;//A0为电平输出口
  const int savenum = 3;//每次存储多少个数
  int OriginValue[savenum];//数组存储输入的电平大小
  double AveValue = 0;//算数平均后得到的数值
  int Acount = 0;//计数器
  int OutputTime = 0;//输出结果次数计数器
  
  void setup() {
   
  // put your setup code here, to run once:
   
  Serial.begin(9600);
   
 
   
 
  }
  
  
  void Receive()//从第二次开始往后的接收函数
  {
   
  int i,temp[savenum-1];//temp临时存储数据
   
  for(i = 0;i
   
  {
   
  
  
  temp[i] = OriginValue[i+1] ;
   
  }
   
  OriginValue[savenum-1] = analogRead(Input);
   
  for(i = 0;i
   
  {
   
  
  
  temp[i] = OriginValue[i] ;
   
  }
   
  Average();
   
 
  }
  void FirstReceive()//第一次将输入模拟信号存储到数组的函数
  {
   
  
 
   
  if (Acount
   
  {
   
  
  
  OriginValue[Acount] = analogRead(Input);
   
  
  
  Acount++;
   
  }
   
  else
   
  {
   
  
  
  Acount= 0;
   
  
  
  Average();
   
  }
  
  }
  void Average()//求平均值的函数
  {
   
  int count;
   
  double Sum;
   
  for(count=0;count
   
  Sum += (double)(OriginValue[count]);
   
  AveValue = Sum / savenum;
   
  SignalOut();
  }
  
  void SignalOut()//输出信号的函数
  {
   
  analogWrite(Output,AveValue);//每次求平均值后输出
   
  Serial.println(AveValue);
   
  OutputTime++;
  }
  void loop() {
   
  // put your main code here, to run repeatedly:
  if(OutputTime == 0)
  FirstReceive();
   
 else
   
 Receive();
  
   
 
  }
  
  
  
                
        
    
                    转载请注明原文地址: https://ju.6miu.com/read-250.html