Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino:查找传感器数据中的波峰和波谷_Arduino - Fatal编程技术网

Arduino:查找传感器数据中的波峰和波谷

Arduino:查找传感器数据中的波峰和波谷,arduino,Arduino,我试图在3Axiz上每x ms轮询一个加速计,并试图找出如何确定我得到的读数的峰值和低谷 理想情况下,我不想在开始计算峰值之前收集一大堆数据——如果首先需要收集数据,最多可能每10分钟收集一次。只有当峰值的绝对值在平均峰值集的可接受“距离”内时,才应计算峰值-以防止计算非常小的峰值 我希望有人能指点我做这件事 您可以从计算标准偏差开始,并计算偏离超过指定水平的峰值 您可以从计算标准偏差开始,并计算偏差超过指定水平的峰值 这取决于信号的外观。我解决了一个与正弦信号类似的问题,在信号上使用IIR滤波

我试图在3Axiz上每x ms轮询一个加速计,并试图找出如何确定我得到的读数的峰值和低谷

理想情况下,我不想在开始计算峰值之前收集一大堆数据——如果首先需要收集数据,最多可能每10分钟收集一次。只有当峰值的绝对值在平均峰值集的可接受“距离”内时,才应计算峰值-以防止计算非常小的峰值


我希望有人能指点我做这件事

您可以从计算标准偏差开始,并计算偏离超过指定水平的峰值


您可以从计算标准偏差开始,并计算偏差超过指定水平的峰值


这取决于信号的外观。我解决了一个与正弦信号类似的问题,在信号上使用IIR滤波器来平滑噪声并防止假峰值

您可以尝试以下方法:

int signalPin = 3;     // accel connected to pin 3
float signal;
float gain = 0.1;

void setup()
{
  pinMode(signalPin, INPUT);
  signal = analogRead(signalPin);  // get initial reading
}

void loop()
{
  // allow a new reading of the accel to slightly change the signal (depending on the value of gain)
  signal += (analogRead(signalPin)*gain - signal);  // IIR filter
}
您可能还想使用map函数来调整从analogRead获得的值,如果担心效率,还可以使用int或long代替float

现在,您可以使用如下策略:
从加速度传感器读取新值(检查新值是否高于上一个值,如果高于,则将其另存为新的最大值。当它们停止增加时,这是您的最大值。您可以要求在某个阈值内进行N次采样,以验证您是否处于峰值的平顶。希望这能让您开始。

这取决于信号的外观。我解决了一个similar问题,正弦信号使用IIR滤波器对信号进行滤波,以消除噪声并防止假峰值

您可以尝试以下方法:

int signalPin = 3;     // accel connected to pin 3
float signal;
float gain = 0.1;

void setup()
{
  pinMode(signalPin, INPUT);
  signal = analogRead(signalPin);  // get initial reading
}

void loop()
{
  // allow a new reading of the accel to slightly change the signal (depending on the value of gain)
  signal += (analogRead(signalPin)*gain - signal);  // IIR filter
}
您可能还想使用map函数来调整从analogRead获得的值,如果担心效率,还可以使用int或long代替float

现在,您可以使用如下策略: 从加速度传感器读取新值(检查一个新值是否高于上一个值,如果高于,则将其另存为新的最大值。当它们停止增加时,这就是您的最大值。您可以要求在某个阈值内进行N次采样,以验证您是否处于峰值的平顶。希望这能让您开始。

感谢Espen,这可能需要额外的一点。)涂抹润滑脂-我的样本可能间隔很近,因此我必须构建一个子例程来“聚集”峰值,并只取最大值,而且如果最大值有多个值,则只取一个最大值。仍然希望以前做过此工作的人提供一些代码片段…;)多亏了Espen,这可能需要额外涂抹一点肘部润滑脂——我的样本可能间隔很近,所以我必须在“集群”中构建一个子例程峰值和只取最大值,也只有一个最大值。最大值应该有多个值。仍然希望有人能提供一些以前这样做过的代码片段…;)