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