Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Matlab中开发用于实时数据分析的FIFO循环缓冲区?_Matlab_Buffer - Fatal编程技术网

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

如何在Matlab中开发用于实时数据分析的FIFO循环缓冲区?,matlab,buffer,Matlab,Buffer,我正在做一个项目,使用Polhemus Liberty系统进行实时运动跟踪。最近,我在《Matlab指南》中开发了一个GUI,用于以240Hz采样频率获取附加传感器的位置和方向。此外,我还添加了一个人工神经网络(ANN)来实时预测运动学参数。然而,在得到ANN的预测之后,我应该对多维数组进行一些数据分析。由于高维性,如果没有实时标准,这种特殊的数据分析只能通过添加多个嵌套循环来完成。问题是,如果我在方法中添加FOR循环,那么实时(或接近实时)标准肯定会受到损害。为了避免添加嵌套FOR循环,我想我

我正在做一个项目,使用Polhemus Liberty系统进行实时运动跟踪。最近,我在《Matlab指南》中开发了一个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个样本进行分析

让我们集思广益吧! 我有一些聪明的想法。 提前感谢,, 抢劫

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

我刚刚将快速循环缓冲区的解决方案上载到

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

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

双缓冲区根据任何情况下要追加的数据来确定追加的预测时间。在未来的课程中,您可以选择双缓冲是或否-如果您不需要计算时间,事情会加速。

如果您内联另一篇文章中的相关部分代码,那就更好了,这样人们就不必深入挖掘了。为什么不呢!:我刚刚更新了这个问题!
% 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));