HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0705
単純反応時間2解決


リンク

2018/7/5(Thu) 14:07:50|NO.84722

単純反応時間を調べる実験で赤い丸のターゲットを100ms、25回ランダムに提示しターゲット提示からボタン押しまでの時間を計るプログラムを作りたいです。
背景は灰色、ターゲットは赤い丸、刺激時間間隔(ISI)は2000ms±1000msです。

#uselib "winmm.dll"
#func timeGetTime "timeGetTime"
#func timeBeginPeriod "timeBeginPeriod" int
#func timeEndPeriod "timeEndPeriod" int
timeBeginPeriod 1

buffer 2,300,300,0 : color 255,0,0 : circle 0,0,300,300,1

;縦横600ピクセルの刺激提示用ウィンドウ(ノーマルなもの)を作成
screen 0,600,600,0,0,0

;「スペースを押すと始まります」と提示し、スペース(コード16)を押すと先に進む
mes "スペースを押すと始まります。"
repeat
await 1
stick a
if a=16:break
loop

;保存用ファイル作成
;dataという一時バッファを作成
notesel data
noteadd "課題,試行数,反応時間"
notesave "RTdata.txt"

;試行開始(24試行。cntは1から)
repeat 25,1

;注視点提示:中央に黒い丸(295,295,305,305の大きさ)を提示する
cls
color 0.0.0
circle 295,295,305,305

;待機時間:ランダム
await rnd(2000)±1000

;刺激提示と提示時間保存
;刺激を提示する直前の時間をstart変数に代入する
timeGetTime:start=stat

;反応時間算出:現在の時間から刺激提示開始の時間を引き算してRT変数に代入する。
timeGetTime
RT=stat-?????←わからないです。

loop
timeEndPeriod 1
end

現状ではこのようになっているのですが、修正点など教えて下さい。
また、このコマンドの方がいいというのがあれば初心者なのでコマンドの順番などもわからないので最初から最後まで書いてもらえれば助かります。



この記事に返信する


あらや

リンク

2018/7/5(Thu) 18:56:14|NO.84725

名前が違っていたりしますが、これらは全てnさんですよね?
http://hsp.tv/play/pforum.php?mode=all&num=84518
http://hsp.tv/play/pforum.php?mode=all&num=84717

同じ内容なのに未解決のまま放置して、新規スレッドをたてるのはどうかと思いますよ。


質問に関してですが、こんな感じでしょうか。

#uselib "winmm.dll" #func timeGetTime "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int randomize; timeBeginPeriod 1 // 赤丸 コード簡略化のため、あらかじめ背景を灰色に塗り潰しておく buffer 2,300,300,0 : color 128, 128, 128: boxf; color 255,0,0 : circle 0,0,300,300,1; ;縦横600ピクセルの刺激提示用ウィンドウ(ノーマルなもの)を作成 screen 0,600,600,0,0,0 ;「スペースを押すと始まります」と提示し、スペース(コード16)を押すと先に進む mes "スペースを押すと始まります。" repeat await 1; stick a; if a&16:break; loop ;保存用ファイル作成 ;dataという一時バッファを作成 notesel data noteadd "課題,試行数,反応時間" dim RT, 26; // 反応時間記録用配列変数 ;試行開始(24試行。cntは1から) repeat 25,1 ;注視点提示:中央に黒い丸(295,295,305,305の大きさ)を提示する ;cls await 0; // awaitは前回のウェイトから指定時間待機する命令のため、一旦ここで0ms待機 redraw 0; color 128, 128, 128: boxf; color 0, 0, 0: circle 295, 295, 305, 305; pos 0, 0: mes ""+cnt+"回目"; // 確認用 redraw 1; ;待機時間:ランダム ;await rnd(2000)±1000 await 2000 + rnd(2001) - 1000; // 『rnd(2001) - 1000』で -1000〜+1000の範囲になる ;刺激提示と提示時間保存 ;刺激を提示する直前の時間をstart変数に代入する // 赤丸を表示 redraw 0; pos 150, 150: gcopy 2, 0, 0, 300, 300; pos 0, 0: mes ""+cnt+"回目"; // 確認用 redraw 1; rcflag = 1; // 赤丸の表示フラグ num = cnt; // 確認用 start = timeGetTime(); // 開始時間を記録 // 入力待機 repeat await 0; stick key; if( rcflag == 1 ) { // 100ms経過したら赤丸を消す if( 100 <= (timeGetTime() - start) ) { rcflag = 0; redraw 0; color 128, 128, 128: boxf; color 0, 0, 0: circle 295, 295, 305, 305; pos 0, 0: mes ""+num+"回目"; // 確認用 redraw 1; } } if key&16:break; loop ;反応時間算出:現在の時間から刺激提示開始の時間を引き算してRT変数に代入する。 ;RT=stat-?????←わからないです。 RT(cnt) = timeGetTime() - start; // 終了時間(現在の時間)から開始時間を引いた数字が反応時間 loop timeEndPeriod 1 // 試行終了後の画面表示、及び保存処理 redraw 0; color 255, 255, 255: boxf; color 0, 0, 0: pos 0, 0; mes "試行終了"; repeat 25, 1 mes strf("%2d回目 : %4dms", cnt, RT(cnt)); noteadd strf("課題とは?,%d,%dms", cnt, RT(cnt)), -1, 0; loop redraw 1; notesave "RTdata.txt"; // 保存処理は最後 stop

内容からして高い精度で時間測定ができた方がいいかと思いまして
以前のスレッドではtimebeginperiod timegettime timeendperiodを使用しました。
d3timer等が間違っている訳ではないので、好みの問題だと思ってください。



n

リンク

2018/7/5(Thu) 22:25:10|NO.84727

すみません、私の説明不足でわからない部分などもあったので載せさせてもらいました。
初心者でいろいろな方法があることが分からず質問ばかりになりましたが、皆さんのやり方を聞いて勉強になりました。ありがとうございます。
前回の質問で返答をもらったものとあらやさんのを元に理解を深めて行こうと思います。
教えて下さりありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.