如何开发一个FIFO循环缓冲区来分析Matlab中的实时数据?

时间:2013-02-26 19:22:34

标签: matlab buffer

我正在使用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个样本进行分析。

让我们对它进行一些头脑风暴! 我打开了一些聪明的主意。 提前致谢, 罗布

1 个答案:

答案 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的性能不依赖于缓冲区大小,与简单的副本相比缓冲液中。

双缓冲可以根据要在任何情况下附加的数据来确定追加的预测时间。将来这个课程会给你一个双重缓冲的选择是或否 - 如果你不需要保证时间,事情就会加速。 enter image description here