我有测试加速度计数据,需要使用Matlab来查找速度和位置。我需要速度和位置的实际数据点,而不仅仅是曲线下的累积面积。我有我正在使用的样本数据,并且能够通过相当冗长和特定的矢量化编码来实现这一点,但我需要找到一种更通用的方法。我不能只使用曲线拟合然后估计面积,因为我有离散数据,不能承受任何错误。这种基本上计算每个矩形区域的方法是最准确的方法。到目前为止,我有我的尝试:
%Variables
clear
DeltaTime=0.2; %10 Hz sampling rate
Acceleration=[0, 1, 2, 4, 3, 1, 2]; %Sample random data set
TTime=(0.2:DeltaTime:1.4);
VelocityL=zeros(size(Acceleration));
VelocityLL=zeros(size(Acceleration));
%Velocity
DeltaVelocityVect=Acceleration*DeltaTime;
VelocityV=[sum(DeltaVelocityVect(1)),sum(DeltaVelocityVect(1:2)),...
sum(DeltaVelocityVect(1:3)), sum(DeltaVelocityVect(1:4)), sum(DeltaVelocityVect(1:5))...
sum(DeltaVelocityVect(1:6)), sum(DeltaVelocityVect(1:7))];
%Position
DeltaPositionVect=VelocityV*DeltaTime;
PositionV=[sum(DeltaPositionVect(1)),sum(DeltaPositionVect(1:2)),...
sum(DeltaPositionVect(1:3)), sum(DeltaPositionVect(1:4)), sum(DeltaPositionVect(1:5))...
sum(DeltaPositionVect(1:6)), sum(DeltaPositionVect(1:7))];
我已经手工解决了这一切,并在纸上和Matlab以及上述作品中绘制了它。但是,数据集的长度会有所不同,因此从长远来看不会起作用。我试图使用循环来解决这个问题,因为索引可以很容易地改变以适应任何长度的向量,同时保持采样率,但我无法让它输出实际的数据点。我需要上面的一般形式。
for index=1:length(Acceleration);
DeltaVelocityLoop(index)= DeltaTime*Acceleration(index);
end
for index2=1:7
VelocityL(index2)= sum(DeltaVelocityLoop(index2));
VelocityLL=VelocityLL+DeltaVelocityLoop(index2);
end
这是我的第10次尝试,所以它包括重复。 VelocityL返回与DeltaVelocityLoop完全相同的向量(没有前面的区域相加,这是目标)。 VelocityLL只返回曲线下面的总面积,写入矢量加速度的长度。如果您对我如何绕过这个障碍有任何想法,请告诉我。
答案 0 :(得分:4)
当你说你不能只使用曲线下的累积面积时,我有点困惑。 是积分,所以如果你想整合加速度数据以获得速度和位置,那么它正是你所需要的。如果您的准确性很差,那么您可能需要更高质量的加速度计数据,但这在后期处理中无济于事。
我建议只使用cumsum()或cumtrapz()来整合您的数据。
答案 1 :(得分:1)
您可以使用样条曲线精确表示离散化的加速度数据,然后将该区域下的区域进行积分以获得速度,然后再次获得位置。
您需要确定用于推断采样点之间的加速度值的方法。一般来说,三次样条函数可以很好地表示“真实世界”的加速度,而线性样条曲线最容易使用,并且仍能提供相当好的结果。
请注意,您的结果会因原始读数的好坏以及采样频率而异。如果您想要一个高精度的精确瞬时速度/位置,您可能想要使用直接测量它们的传感器。
答案 2 :(得分:1)
如果您需要快速和矢量化的内容,请使用cumtrapz
。假设向量t
包含测量时间,该向量acc
包含加速度测量值,初始位置为pos0
,而初始速度为vel0
,我写:
velocity = vel0 + cumtrapz(t,acc);
positions = pos0 + cumtrapz(velocity);
我只有一些测量点cumtrapz可能是准确性和简单性方面的最佳解决方案之一。
希望这有帮助。
一个。