我正在尝试从数组acc
中的加速度数据生成速度信号,我还有time
另一个具有相同长度的数组numpy。
import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate
time = np.array([ , , ... , , ])
acc = np.array([ , , ... , , ])
# using this
vel=integrate.cumtrapz(acc,time,initial=0)
通过一些基本的微积分,很明显解决方案应该是类似的情节,但出于某种原因,我得到了这些
有任何建议吗?也许是因为初始条件但我不确定,而且我也无法访问它们,因为它是实验数据。
我也使用相同的数据并将其放在LabVIEW上,并且整合就是这个速度图像。
但显然与plt.plot(time,vel)
不一样。
答案 0 :(得分:1)
从acc
的图中,您可以粗略估计振幅为1.4,频率为136 Hz或854弧度/秒。因此,acc
的粗略模型是1.4 * cos(854 * t)+ b。我忽略了振荡的相位,而b是一个太小而不能从图中估计的常数。在python中,您可以使用acc.mean()
估算b。
然后,通过积分,速度应大致为1.4 / 854 * sin(854 * t)+ b * t = 0.00164 * cos(854 * t)+ b * t。所以你应该期望vel
的局部峰 - 峰变化大约为0.0033,这与你vel
的情节一致。
b是vel
中线性趋势的斜率,并且从vel
的图中,b可以估计为大约0.0085。所以我希望acc.mean()
约为0.0085。这是否与您的数据一致?
答案 1 :(得分:0)
由于细节不多: 1)是plt pylab吗? 2)如果是这样,使用plt.plot(time,vel,'。')来查看点的趋势,也许你可以看到一些问题。 3)查看此link
4)请发布更多详细信息,以便人们更好地了解您的问题。
希望这些话可能至少有点帮助: - )
答案 2 :(得分:0)
问题是您提到的初始条件。积分从任意阶段开始,具体取决于实验数据的采样。这表示添加到积分的输入的任意常数,因此是输出的线性斜坡分量。 (理想情况下,您应该在数据为零时开始采样,例如在加速开始之前,但这通常是不可能的。)
在已知输出为周期性的情况下,可以通过减去适当的线性拟合来简单地降低输出趋势。请注意,即使您小心地将其拟合为整数个周期,仅对数据拟合一条线然后减去该行也是不够的。考虑到采样数据包含1个或2个周期的情况,这是显而易见的,只有特定的起始阶段数据是对称的,并且可以计算出正确的斜率。
相反,拟合必须分三个阶段进行:1)将一条线穿过例如所有峰值,2)从数据中减去这条线,3)计算所得输出的平均值并将其减去。步骤2产生了周期性输出,消除了随时间线性上升的分量,但留下了任意偏移。最后一步是消除偏移的必要条件(假设您期望平均位移为零)。
步骤(1)可以通过其他方式完成-例如通过拟合奇数个半循环,或确保拟合来自例如第一个峰到最后一个峰。如上所述,但是,从第一个峰到最后一个谷的拟合会给出错误的斜率。