首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Matlab中开发用于分析实时数据的FIFO循环缓冲区?

问如何在Matlab中开发用于分析实时数据的FIFO循环缓冲区?
EN

Stack Overflow用户
提问于 2013-02-27 03:22:34
回答 1查看 2.1K关注 0票数 1

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

Create a buffer matrix for continuous measurements

1)缓冲区初始化:

代码语言:javascript
复制
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)连续循环,缓冲区使用:

代码语言:javascript
复制
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个样本要分析。

让我们集思广益一下吧!我很乐意有一些聪明的想法。提前谢谢你,罗布

EN

回答 1

Stack Overflow用户

发布于 2014-06-21 23:19:25

代码语言:javascript
复制
centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];

这是一个很好的简单的解决方案,但是速度很慢。每次添加新的向量时,matlab都必须复制除第一个条目之外的所有旧数据。如果你考虑的是实时,这不是一个好主意。

我刚刚上传了我的快速循环缓冲区的解决方案

http://www.mathworks.com/matlabcentral/fileexchange/47025-circvbuf-m

这种循环缓冲区的主要思想是恒定和快速的性能,并避免在程序中使用缓冲区时的复制操作:

代码语言:javascript
复制
% 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的性能不依赖于缓冲区大小。

根据在任何情况下要追加的数据,双缓冲保证了追加的预测时间。将来,这个类将为您提供是或否双缓冲的选择-如果您不需要更多的时间,事情将会加速。

​

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15097499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档