我试图在3 axiz上每 x ms轮询一个加速度计,并试图弄清楚如何确定我得到的读数的峰值和低谷。
理想情况下,在我开始计算峰值之前,我不想收集大量数据 - 如果首先需要数据收集,最多可能每10分钟一次。如果峰值的绝对值在可接受的距离内,则也应仅计算峰值"平均峰值集 - 以防止计算非常小的峰值...
我会很感激任何指针吗?
答案 0 :(得分:0)
您可以从标准差的计算开始,并计算偏差超过指定水平的峰值。
答案 1 :(得分:0)
这取决于你的信号是什么样的。我使用信号上的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。
现在您可以使用以下策略: 从accel中读取一个新值(检查新值是否高于前一个值,如果是,则将其保存为新的最大值。当它们停止增加时,这是您的最大值。您可以在一定范围内需要N个样本验证你是否处于峰值平顶的门槛。希望这能让你开始。