我正在使用Polhemus Liberty系统进行实时动作跟踪的项目。最近,我在Matlab的指南中开发了一个GUI,以240Hz的采样频率获取连接的传感器的位置和方向。此外,我添加了一个人工神经网络(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 zeroes
2)连续循环,缓冲区使用:
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个采样/秒而是240Hz,会发生什么。给定无限循环时,数据丢失将在不改变缓冲区参数的情况下增加。
有人知道如何修改链接的解决方案或创建一个全新的解决方案?在缓冲区中,我应该有100个样本进行分析。
让我们对它进行一些头脑风暴! 我打开了一些聪明的主意。 提前致谢, 罗布
答案 0 :(得分:0)
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的性能不依赖于缓冲区大小,与简单的副本相比缓冲液中。
双缓冲可以根据要在任何情况下附加的数据来确定追加的预测时间。将来这个课程会给你一个双重缓冲的选择是或否 - 如果你不需要保证时间,事情就会加速。