1

我正在使用 Polhemus Liberty 系统进行实时运动跟踪的项目。最近,我在 Matlab 的 GUIDE 中开发了一个 GUI,以 240Hz 的采样频率获取附加传感器的位置和方向。此外,我添加了一个人工神经网络 (ANN) 来实时对运动学参数进行一些预测。但是,在获得 ANN 的预测之后,我应该对多维数组进行一些数据分析。由于高维,在没有实时标准的情况下,这种特定的数据分析只能通过添加多个嵌套循环来完成。问题是,如果我在方法中添加 FOR 循环,那么实时(或接近实时)标准肯定会受到损害。为了避免添加嵌套的 FOR 循环,我想我可以创建一个缓冲区(FIFO 循环缓冲区)来临时存储预测数据并分析数据。我在以下链接下找到了一个智能解决方案:

为连续测量创建缓冲矩阵

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,会发生什么情况。给定一个无限的while循环,在不改变缓冲区参数的情况下,数据丢失将增加。

有人知道如何修改链接的解决方案或创建一个全新的解决方案吗?在缓冲区中,我应该有 100 个样本要分析。

让我们对此进行一些头脑风暴!我愿意有一些聪明的想法。在此先感谢,罗布

4

1 回答 1

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 的性能不依赖于缓冲区大小。

双缓冲根据在任何情况下要追加的数据来保证追加的预测时间。将来,本课程将为您提供双缓冲是或否的选择 - 如果您不需要保证时间,事情会加速。 在此处输入图像描述

于 2014-06-21T15:19:24.613 回答