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