多普勒雷达(HB100)Arduino代码:我们为什么使用位移?

多普勒雷达(HB100)Arduino代码:我们为什么使用位移?,arduino,Arduino,我一直在做我的多普勒雷达测速计划有一段时间了。我发现下面的链接和代码非常有用: // Based on the Adafruit Trinket Sound-Reactive LED Color Organ // http://learn.adafruit.com/trinket-sound-reactive-led-color-organ/code #define RADAR A5 // RADAR inut is attached to A7 #define MICRODELAY 100

我一直在做我的多普勒雷达测速计划有一段时间了。我发现下面的链接和代码非常有用:

// Based on the Adafruit Trinket Sound-Reactive LED Color Organ
// http://learn.adafruit.com/trinket-sound-reactive-led-color-organ/code

#define RADAR A5 // RADAR inut is attached to A7
#define MICRODELAY 100 // 100microseconds ~10000hz
#define MAXINDEX 1024 // 10 bits
#define TOPINDEX 1023 // 10 bits

byte collect[MAXINDEX];
int mean;
int minimum;
int maximum;
int hysteresis; // 1/16 of max-min
bool currentphase; // are value above mean + hysteresis;
int lastnull; // index for last null passing value
int prevnull; // index for previous null passing value
int deltaindex;
int deltadeltaindex;
int index;
bool phasechange = false;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while (!Serial) {}
  index = 0;
  mean = 0;
  maximum = 255;
  minimum = 0;
  hysteresis = 0;
  currentphase = false;
  lastnull = 0;
  prevnull = 0;

  Serial.print("deltadeltaindex");
  Serial.print("\t");
  Serial.print("deltaindex");
  Serial.print("\t");
  Serial.println("delta");
}

void loop() {
  int newVal = analogRead(RADAR); // Raw reading from amplified radar
  mean -= (collect[index] >> 2);
  mean += (newVal >> 2);
  collect[index]= newVal;
  minimum = newVal < minimum ? newVal : minimum + 1;
  maximum = newVal > maximum ? newVal : maximum - 1;
  hysteresis = abs(maximum - minimum) >> 5;

  if(newVal > (mean + hysteresis))
  {
    if(false == currentphase)
    {
      currentphase = true;
      phasechange = true;
    }
  }
  else if(newVal < (mean - hysteresis))
  {
    if(currentphase)
    {
      currentphase = false;      
      phasechange = true;
    }
  }

  if(phasechange)
  {
    prevnull = lastnull;
    lastnull = index;

    int delta = (prevnull > lastnull) ? 
        (lastnull - prevnull + MAXINDEX) : 
        (lastnull - prevnull);
    deltadeltaindex = abs(deltaindex - delta);
    deltaindex = delta;
    Serial.print(deltadeltaindex);
    Serial.print("\t");
    Serial.print(deltaindex);
    Serial.print("\t");
    Serial.println(delta);
  }

  index = index == TOPINDEX ? 0 : index + 1;
  phasechange = false;
  //delayMicroseconds(10);
}
//基于Adafruit饰品声音反应LED彩色风琴
// http://learn.adafruit.com/trinket-sound-reactive-led-color-organ/code
#定义雷达A5//雷达inut连接到A7
#定义微延迟100//100微秒~10000hz
#定义MAXINDEX 1024//10位
#定义TOPINDEX 1023//10位
字节收集[MAXINDEX];
整数均值;
最小整数;
int最大值;
int滞后;//最大最小值的1/16
bool currentphase;//值高于平均值+滞后;
int lastnull;//最后一个空传递值的索引
int prevnull;//前一个空传递值的索引
int deltaindex;
int deltadeltaindex;
整数指数;
bool phasechange=false;
无效设置(){
//将安装代码放在此处,以便运行一次:
序列号开始(115200);
而(!Serial){}
指数=0;
平均值=0;
最大值=255;
最小值=0;
滞后=0;
currentphase=false;
lastnull=0;
prevnull=0;
串行打印(“deltadeltaindex”);
串行打印(“\t”);
串行打印(“deltaindex”);
串行打印(“\t”);
序列号。打印号(“增量”);
}
void循环(){
int newVal=analogRead(雷达);//放大雷达的原始读数
平均值-=(收集[索引]>>2);
平均值+=(newVal>>2);
collect[index]=newVal;
最小值=新值<最小值?新值:最小值+1;
最大值=新值>最大值?新值:最大值-1;
滞后=abs(最大值-最小值)>>5;
如果(新值>(平均值+滞后))
{
如果(false==currentphase)
{
currentphase=真;
相位变化=真;
}
}
否则如果(新值<(平均值-滞后))
{
如果(当前相位)
{
currentphase=false;
相位变化=真;
}
}
如果(相位变化)
{
prevnull=lastnull;
lastnull=索引;
int delta=(prevnull>lastnull)?
(lastnull-prevnull+MAXINDEX):
(lastnull-prevnull);
deltadeltaindex=abs(deltaindex-delta);
deltaindex=delta;
串行打印(deltadeltaindex);
串行打印(“\t”);
串行打印(deltaindex);
串行打印(“\t”);
序列号println(delta);
}
索引=index==TOPINDEX?0:索引+1;
相位变化=假;
//延迟微秒(10);
}
我在我的Arduino上试用了HB100(带突破板的型号),效果很好

然而,我真正想做的是理解代码背后的机制。我读了一些关于滞后和位移位的文章,但我根本不明白这里的程序员为什么使用位移位

什么是
意思-=(收集[索引]>>2)
平均值+=(newVal>>2)您对这些值做了什么


我们将不胜感激

我投票结束这个问题,因为这不是一个真正的信号处理问题;这是一个基本的数字问题。记住这个提示:用二进制写下一个数字。确保您了解
>2
对该号码的作用。把它换回来。