前提・実現したいこと
環境はMATLAB2019b, windows10です
現在、以下のようなプログラムを構築しようと考えております。
- 外部デバイスからの生体信号をMATLAB上で得続け、描画する
- 生体信号にて特定の波形が見つかったらトリガーを出すことを繰り返す
- トリガーが得られたら、特定の動作を行う。得られていない場合はほかの動作を繰り返す
そこで、1~2を合わせたものと3の内容の2つを並列処理させればいいのではと思いましたが、
並列処理を扱ったことがないため、関数parfevalを用いて簡易的なものを書いてみました。
内容は、動作1にて特定回数whileがまわるごとにtrig=1を送り、動作2ではtrigに基づきコメント表示するといったものを意図しました。
しかし、現状は動かしても"start"と表示されて以降音沙汰なく、エラーも表示されないため、どこが誤っているかもわからない状況になっております。
現在の問題解決、あるいは、本来の行いたい動作 (生体信号処理に関する1.~3.) を達成するために、お知恵をお貸しください。
今回はperfevalを用いておりますが、他に推奨される方法などがありましたら、お教えいただけますと幸いです
よろしくお願いいたします。
(10/5)
逐次処理で書いたものを追記いたしました。
parfevalを用いたものよりも、こちらで書いた内容のほうがより本来行いたい内容と近くなっております。
以下、行いたい動作の詳細になります。
- 生体信号の取得開始、figure表示
- +キーの呈示
- 生体信号にて特定波形が得られるまで待機。得られた場合にtrig=1とする
- trig==1の場合、画像Aを呈示する
- キー入力を求める[j/f]
6-1. キー入力を求められてから反応するまでの時間が<5sの場合: 画像B呈示
6-2. 5s>の場合: 画像Cを呈示
以後、2~6を繰り返す
該当のソースコード
clear; clc; global trig; global cnt; trig = 0; trig_cnt = 0; f = parfeval(@aaaa, 1, trig); disp('start') while 1 // 動作2 if trig == 1 trig_cnt = trig_cnt + 1; fprintf(1,'第 %d \n', trig_cnt); trig = 0; end end function aaaa(trig) // 動作1 global trig; global cnt; cnt = 1; disp('aaaa') while 1 cnt = cnt + 1; if mod(cnt, 5) == 0 trig = 1; fprintf(1,'trig %d \n', cnt); elseif cnt == 100 break; else trig = 0; end WaitSecs(0.5); end end
逐次処理
% 本来行いたかった処理を逐次処理にて書いたものです (簡略化しております)。 % 動作2におけるキー反応待機中も動作1を行いたいのですが、停止してしまうという問題が生じるため並列処理を考えておりました KbName('UnifyKeyNames'); F_Key = KbName('f'); J_Key = KbName('j'); trig_cnt = 1; % テクスチャーの作成 (追記) imgfile = ['./Resource/fixation.jpg']; imgdata = imread(imgfile); imgtexFixation = Screen('MakeTexture', mainWindow, imgdata); imgfile = ['./Resource/imgA.jpg']; imgdata = imread(imgfile); imgteximgA = Screen('MakeTexture', mainWindow, imgdata); imgfile = ['./Resource/imgB.jpg']; imgdata = imread(imgfile); imgteximgB = Screen('MakeTexture', mainWindow, imgdata); while 1 trig = 0; % 動作1 (省略しております) % 外部デバイスからの信号を得続け、figureに描画する Screen('DrawTexture', mainWindow, imgtexFixation); % +表示 Screen('Flip', mainWindow); % 特定の波形が検出されるたびにtrig=1にし、その時刻を記録する if 特定の波形 trig = 1; end % 動作2 if trig == 1 trig_cnt = trig_cnt + 1; fprintf(1,'第 %d \n', trig_cnt); RT_start = GetSecs; KeyOn = 0; while KeyOn == 0 % キー入力があるまで待機 time_stim_presn_ed = GetSecs; [keyDown, secs, keycode] = KbCheck; if keycode(J_Key) || keycode(F_Key) KeyOn = 1; Screen('DrawTexture', mainWindow, imgteximgA); % 画像A呈示 Screen('Flip', mainWindow); break; % elseifを追記しました elseif round((time_stim_presn_ed-RT_start)*1000) >= 5000 % 5s(5000ms)反応がない場合 Screen('DrawTexture', mainWindow, imgteximgB); % 画像B呈示 Screen('Flip', mainWindow); break; end end RT = round((secs-RT_start)*1000); % 反応時間(ms)算出 disp(RT) end end
試したこと
どこで実行が止まっているかを確認するために、dispやfprintfをいたるところに入れて問題の抽出を行おうとしました。
結果、disp('start')のみが表示されています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/05 07:49
2020/10/05 08:06
2020/10/05 08:15
2020/10/05 08:48
2020/10/05 09:12
2020/10/05 09:19
2020/10/05 09:58
2020/10/05 12:09
2020/10/05 13:28