rmeddis@28: % ------------------------------------------------------- psychometricFunction rmeddis@28: function [psy, levelsBinVector, binFrequencies, nNo, nYes]=... rmeddis@28: psychometricFunction(levels, responses, psyBinWidth) rmeddis@28: % computes a psychometric function from rwo vectors (levels and responses) rmeddis@28: % responses is a binary vectory (1=yes) rmeddis@28: % psyBinWidth is the bin width (dB) of the output psychometric function rmeddis@28: % this function is called by both fitPsychometricFunction and subjGUI rmeddis@28: % for this reason it should notbe bundled with fitPsychometricFunction rmeddis@28: rmeddis@28: binFrequencies=[]; nNo=[]; nYes=[]; rmeddis@28: if min(levels)+abs(psyBinWidth) < max(levels) rmeddis@28: % create a set of bins for the psychometric function rmeddis@28: levelsBinVector= min(levels): abs(psyBinWidth): max(levels); rmeddis@28: else rmeddis@28: psy=[]; levelsBinVector=[]; rmeddis@28: return rmeddis@28: end rmeddis@28: rmeddis@28: idx0=find(responses==0); % isolate 'no' rmeddis@28: z=levels(idx0); rmeddis@28: nNo=hist(z, levelsBinVector); rmeddis@28: rmeddis@28: idx1=find(responses>0); % isolate 'yes' rmeddis@28: y=levels(idx1); rmeddis@28: nYes=hist(y, levelsBinVector); rmeddis@28: rmeddis@28: if sum(nNo)==0 | sum(nYes)==0 rmeddis@28: psy=[]; levelsBinVector=[]; rmeddis@28: return % yesses and nos required for a function rmeddis@28: end rmeddis@28: rmeddis@28: binFrequencies=nNo+nYes; rmeddis@28: rmeddis@28: warning off MATLAB:divideByZero rmeddis@28: psy=nYes./binFrequencies; % psy is the proportion of 'yes' responses rmeddis@28: warning on MATLAB:divideByZero rmeddis@28: lastwarn(''); rmeddis@28: rmeddis@28: idx=~isnan(psy); %remove empty bins rmeddis@28: idx=(nYes>0) |(nNo>0); %remove empty bins rmeddis@28: psy=psy(idx); rmeddis@28: levelsBinVector=levelsBinVector(idx); rmeddis@28: binFrequencies=binFrequencies(idx); rmeddis@28: nNo=nNo(idx); rmeddis@28: nYes=nYes(idx); rmeddis@28: rmeddis@28: % [nNo' nYes'] rmeddis@28: % [levelsBinVector' psy'] rmeddis@28: % plot(levelsBinVector,psy,['o'])