我正在做一个使用Polhemus Liberty系统进行实时运动跟踪的项目。最近,我在Matlab的指南中开发了一个GUI,用于在240‘s的采样频率下获取连接的传感器的位置和方向。此外,我还添加了一个人工神经网络(ANN)来对运动学参数进行实时预测。然而,在有了ANN的预测之后,我应该对多维数组进行一些数据分析。在没有实时标准的情况下,这种特定的数据分析只能通过添加多个嵌套循环来完成,因为高维。问题是,如果我将FOR循环添加到方法中,那么实时(或接近实时)标准肯定会受到损害。为了避免添加嵌套的FOR循环,我认为可以创建一个缓冲区(FIFO循环缓冲区)来临时存储预测数据并对数据进行分析。我在下面的链接中找到了一个聪明的解决方案:
Create a buffer matrix for continuous measurements
1)缓冲区初始化:
nBuffer = 10; % You can set this to whatever number of time points
% you want to store data for
nSamples = 2; % You can set this to the number of data values you
% need for each point in time
centroidBuffer = zeros(nSamples,nBuffer); % Initialize the buffer to zeroes2)连续循环,缓冲区使用:
keepLooping = true;
processTime = 0;
while keepLooping,
% Capture your image
% Compute the centroid data and place it in the vector "centroidData"
centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];
processTime = processTime+1;
if (processTime == nBuffer),
% Do whatever processing you want to do on centroidBuffer
processTime = 0;
end
% Choose to set keepLooping to false, if you want
end在我的理解中,上述解决方案的工作方式是“1帧/秒”。因此,在捕获图像并定义其“质心数据”之后,只有一列将在缓冲机制中被移除或扩展。这在这种特殊情况下工作得很好。如果采样率不是1采样/秒而是240 if,会发生什么?给定一个无限的while循环,在不改变缓冲区参数的情况下,数据丢失将会增加。
有人知道如何修改链接的解决方案或创建一个全新的解决方案吗?在缓冲区中,我应该有100个样本要分析。
让我们集思广益一下吧!我很乐意有一些聪明的想法。提前谢谢你,罗布
发布于 2014-06-21 23:19:25
centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];这是一个很好的简单的解决方案,但是速度很慢。每次添加新的向量时,matlab都必须复制除第一个条目之外的所有旧数据。如果你考虑的是实时,这不是一个好主意。
我刚刚上传了我的快速循环缓冲区的解决方案
http://www.mathworks.com/matlabcentral/fileexchange/47025-circvbuf-m
这种循环缓冲区的主要思想是恒定和快速的性能,并避免在程序中使用缓冲区时的复制操作:
% create a circular vector buffer
bufferSz = 1000;
vectorLen= 7;
cvbuf = circVBuf(int64(bufferSz),int64(vectorLen));
% fill buffer with 99 vectors
vecs = zeros(99,vectorLen,'double');
cvbuf.append(vecs);
% loop over lastly appended vectors of the circVBuf:
new = cvbuf.new;
lst = cvbuf.lst;
for ix=new:lst
vec(:) = cvbuf.raw(:,ix);
end
% or direct array operation on lastly appended vectors in the buffer (no copy => fast)
new = cvbuf.new;
lst = cvbuf.lst;
mean = mean(cvbuf.raw(3:7,new:lst));查看屏幕截图可以看到,与简单的复制缓冲区相比,如果缓冲区较大,则此循环缓冲区具有优势,但每次要附加的数据大小较小,因为circVBuf的性能不依赖于缓冲区大小。
根据在任何情况下要追加的数据,双缓冲保证了追加的预测时间。将来,这个类将为您提供是或否双缓冲的选择-如果您不需要更多的时间,事情将会加速。

https://stackoverflow.com/questions/15097499
复制相似问题