1

リアルタイムのモーショントラッキングにPolhemusLibertyシステムを使用するプロジェクトに取り組んでいます。最近、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つの列のみが削除または展開されます。これは、その特定の場合に非常にうまく機能します。サンプリングレートが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 のパフォーマンスはバッファ サイズに依存しないため、毎回追加するデータのサイズは小さいことがわかります。

ダブルバッファリングは、どのような状況でも追加するデータに応じて、追加の予測時間を保証します。将来、このクラスは、ダブル バッファリングの yes または no を選択できるようになります。 ここに画像の説明を入力

于 2014-06-21T15:19:24.613 に答える