多普勒雷达(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
对该号码的作用。把它换回来。