Arduino:查找传感器数据中的波峰和波谷
我试图在3Axiz上每x ms轮询一个加速计,并试图找出如何确定我得到的读数的峰值和低谷 理想情况下,我不想在开始计算峰值之前收集一大堆数据——如果首先需要收集数据,最多可能每10分钟收集一次。只有当峰值的绝对值在平均峰值集的可接受“距离”内时,才应计算峰值-以防止计算非常小的峰值Arduino:查找传感器数据中的波峰和波谷,arduino,Arduino,我试图在3Axiz上每x ms轮询一个加速计,并试图找出如何确定我得到的读数的峰值和低谷 理想情况下,我不想在开始计算峰值之前收集一大堆数据——如果首先需要收集数据,最多可能每10分钟收集一次。只有当峰值的绝对值在平均峰值集的可接受“距离”内时,才应计算峰值-以防止计算非常小的峰值 我希望有人能指点我做这件事 您可以从计算标准偏差开始,并计算偏离超过指定水平的峰值 您可以从计算标准偏差开始,并计算偏差超过指定水平的峰值 这取决于信号的外观。我解决了一个与正弦信号类似的问题,在信号上使用IIR滤波
我希望有人能指点我做这件事 您可以从计算标准偏差开始,并计算偏离超过指定水平的峰值
您可以从计算标准偏差开始,并计算偏差超过指定水平的峰值
这取决于信号的外观。我解决了一个与正弦信号类似的问题,在信号上使用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,这可能需要额外涂抹一点肘部润滑脂——我的样本可能间隔很近,所以我必须在“集群”中构建一个子例程峰值和只取最大值,也只有一个最大值。最大值应该有多个值。仍然希望有人能提供一些以前这样做过的代码片段…;)