0001 function out=DIVA_AuditoryCortexCategorical(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 out=[];
0074 global DIVA_AuditoryCortexCategorical_data
0075
0076 for indexargin=1:2:nargin,
0077 switch(varargin{indexargin}),
0078 case 'init',
0079 SessionFolder=strcat(DIVA('SessionFolder'),filesep);
0080 if nargin<indexargin+1 || isempty(varargin{indexargin+1}),
0081 initfile='';
0082 else,
0083 initfile=[SessionFolder,'Session_',varargin{indexargin+1},filesep,mfilename,'.mat'];
0084 end
0085 if isempty(initfile) || isempty(dir(initfile)),
0086 disp([mfilename, ' : Defining new session...']);
0087
0088 DIVA_AuditoryCortexCategorical_data.params=struct(...
0089 'ntimepoints',64,...
0090 'delayToSoundMap',.005,...
0091 'SilenceThresholdEnergy',.05,...
0092 'SilenceThresholdTime',.050,...
0093 'match',-1,...
0094 'AuditoryTargets',...
0095 repmat(struct(...
0096 'mean',[],...
0097 'var',[],...
0098 'velocity',[],...
0099 'label',[],...
0100 'nsamples',[],...
0101 'ntrained',[]),[1,0]));
0102
0103
0104 else,
0105 data=load(initfile,'-mat');
0106 DIVA_AuditoryCortexCategorical_data.params=data.params;
0107 end
0108
0109 DIVA_AuditoryCortexCategorical_data.params.TimeStep = DIVA('TimeStep');
0110
0111
0112
0113 DIVA_AuditoryCortexCategorical_data.params.current=struct(...
0114 'SoundSegment',[],...
0115 'PhonemeLabel',[]);
0116
0117
0118
0119 out={'sound'};
0120
0121
0122
0123
0124 case 'save',
0125 SessionFolder=strcat(DIVA('SessionFolder'),filesep);
0126 if nargin<indexargin+1,
0127 initfile=[SessionFolder,'Session_','default',filesep,mfilename,'.mat'];
0128 else,
0129 initfile=[SessionFolder,'Session_',varargin{indexargin+1},filesep,mfilename,'.mat'];
0130 end
0131 params=DIVA_AuditoryCortexCategorical_data.params;
0132 save(initfile,'params');
0133
0134
0135 case 'exit',
0136 clear DIVA_AuditoryCortexCategorical_data;
0137
0138
0139
0140
0141 case 'disp',
0142 disp(DIVA_AuditoryCortexCategorical_data.params);
0143 out=fieldnames(DIVA_AuditoryCortexCategorical_data.params);
0144
0145
0146
0147
0148 case 'sound',
0149 idx = find(~any(isnan(varargin{indexargin+1})));
0150 DIVA_AuditoryCortexCategorical_data.params.current.SoundSegment(:,end+(1:length(idx))) = ...
0151 varargin{indexargin+1}(:,idx);
0152
0153
0154 if isempty(find(idx==size(varargin{indexargin+1},2))) && ...
0155 ~isempty(DIVA_AuditoryCortexCategorical_data.params.current.SoundSegment),
0156 disp('DIVA_AuditoryCortexCategorical: Received sound segment');
0157
0158
0159
0160 e1 = DIVA_AuditoryCortexCategorical_data.params.current.SoundSegment;
0161 e1 = mean(e1./repmat(max(e1,[],2),1,size(e1,2)),1);
0162 n = ceil(DIVA_AuditoryCortexCategorical_data.params.SilenceThresholdTime/...
0163 DIVA_AuditoryCortexCategorical_data.params.TimeStep);
0164
0165
0166
0167
0168 if(length(e1)==1)
0169 e2=1;
0170 else
0171 e2=find(min(sample_window(e1',n,n-1),[],1));
0172 end
0173 if ~length(e2),
0174 if(length(e1)>0),
0175 disp('DIVA_AuditoryCortexCategorical: Sound segment contains only silence');
0176 end
0177 else,
0178 if length(e2)>1,
0179 lims = max(1,min(length(e1),[e2(1)-n,e2(end)+2*n-1]));
0180
0181
0182 [SoundSegment,time] = ...
0183 equalstep(DIVA_AuditoryCortexCategorical_data.params.current.SoundSegment(:,lims(1):lims(2)),...
0184 DIVA_AuditoryCortexCategorical_data.params.ntimepoints,'fixedlength');
0185 time = time*DIVA_AuditoryCortexCategorical_data.params.TimeStep;
0186 vel = 1./diff(time);
0187 else,
0188 SoundSegment = ...
0189 DIVA_AuditoryCortexCategorical_data.params.current.SoundSegment(:,ones(1,DIVA_AuditoryCortexCategorical_data.params.ntimepoints));
0190 vel = 0;
0191 end
0192
0193
0194
0195 matchlevels = ...
0196 nan + zeros(1,length(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets));
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219 if ~isempty(DIVA_AuditoryCortexCategorical_data.params.current.PhonemeLabel),
0220
0221 match = strmatch(DIVA_AuditoryCortexCategorical_data.params.current.PhonemeLabel,...
0222 {DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(:).label},...
0223 'exact');
0224
0225
0226 if isempty(match),
0227 match = length(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets)+1;
0228 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean = SoundSegment;
0229
0230 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var = ...
0231 repmat([400;2500;10000],1,size(SoundSegment,2));
0232 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).velocity=vel;
0233 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).label = ...
0234 DIVA_AuditoryCortexCategorical_data.params.current.PhonemeLabel;
0235 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples = 1;
0236 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).ntrained = 0;
0237
0238
0239 temp = DIVA('AuditoryCortex','WeightsFromTargets');
0240 temp(1:2*size(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean,1),...
0241 DIVA_AuditoryCortexCategorical_data.params.ntimepoints*(match-1)+...
0242 (1:DIVA_AuditoryCortexCategorical_data.params.ntimepoints)) = ...
0243 [DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean - ...
0244 sqrt(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var);...
0245 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean + ...
0246 sqrt(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var)];
0247
0248 DIVA_AuditoryCortexCategorical_data.params.match=match-1;
0249
0250
0251 DIVA('AuditoryCortex','WeightsFromTargets',temp);
0252 disp(['DIVA_AuditoryCortexCategorical: Created new phonemic target: ',...
0253 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).label]);
0254
0255 else,
0256
0257 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean = ...
0258 (DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples*...
0259 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean+SoundSegment)/...
0260 (DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples+1);
0261
0262
0263 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var = ...
0264 (DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples*...
0265 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var+...
0266 repmat([400;2500;10000],1,size(SoundSegment,2)))/...
0267 (DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples+1);
0268
0269
0270 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).velocity = ...
0271 (DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples*...
0272 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).velocity+vel)/...
0273 (DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples+1);
0274
0275 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples = ...
0276 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).nsamples+1;
0277
0278
0279 temp = DIVA('AuditoryCortex','WeightsFromTargets');
0280
0281 temp(1:2*size(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean,1),...
0282 DIVA_AuditoryCortexCategorical_data.params.ntimepoints*(match-1)+...
0283 (1:DIVA_AuditoryCortexCategorical_data.params.ntimepoints)) = ...
0284 [DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean - ...
0285 sqrt(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var);...
0286 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).mean + ...
0287 sqrt(DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).var)];
0288
0289 DIVA_AuditoryCortexCategorical_data.params.match=match-1;
0290
0291 DIVA('AuditoryCortex','WeightsFromTargets',temp);
0292 disp(['DIVA_AuditoryCortexCategorical: Updated phonemic target ',...
0293 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).label]);
0294 end
0295
0296 else
0297 disp('Phoneme Label not specified');
0298 end
0299 end
0300 DIVA_AuditoryCortexCategorical_data.params.current.SoundSegment=[];
0301 DIVA_AuditoryCortexCategorical_data.params.current.PhonemeLabel=[];
0302 end
0303
0304 if ~nargout,
0305 DIVA('ModelStatePlot','AuditoryCortexCategorical','sound');
0306 end
0307
0308
0309
0310 case 'label',
0311 DIVA_AuditoryCortexCategorical_data.params.current.PhonemeLabel=varargin{indexargin+1};
0312
0313
0314 case 'target',
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328 out=[];
0329 if(~iscell(varargin{indexargin+1}))
0330 tempQueue{1}=varargin{indexargin+1};
0331 else
0332 tempQueue=varargin{indexargin+1};
0333 end
0334 vel=1;
0335 m=1;
0336 delay(1)=0;
0337 for n=1:length(tempQueue)
0338 if(ischar(tempQueue{n}))
0339 targetQueue{m}=tempQueue{n};
0340 m=m+1;
0341 delay(m)=0;
0342 else
0343 delay(m)=delay(m)+tempQueue{n};
0344 end
0345 end
0346
0347 for n=1:length(targetQueue)
0348 if(ischar(targetQueue{n}))
0349 targetlabel=targetQueue{n};
0350 end
0351
0352 if(n>1)
0353 delay(n)=delay(n)+length(out)*DIVA('TimeStep');
0354 end
0355 match = strmatch(targetlabel,...
0356 {DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(:).label},...
0357 'exact');
0358
0359 DIVA_AuditoryCortexCategorical_data.params.match=match-1;
0360 if isempty(match),
0361 warning('DIVA_AuditoryCortexCategorical: Non-existing target');
0362 end
0363
0364
0365 velthis = vel*DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).velocity;
0366
0367 if ~velthis,
0368 targetindexthis = DIVA_AuditoryCortexCategorical_data.params.ntimepoints/2*...
0369 ones(1,ceil(vel/DIVA_AuditoryCortexCategorical_data.params.TimeStep));
0370 idx=(match-1)*DIVA_AuditoryCortexCategorical_data.params.ntimepoints + targetindexthis;
0371
0372 else,
0373 [nill,targetindexthis] = equalstep(cumsum([0,1./velthis]),...
0374 DIVA_AuditoryCortexCategorical_data.params.TimeStep);
0375
0376 idx=(match-1)*DIVA_AuditoryCortexCategorical_data.params.ntimepoints + targetindexthis;
0377
0378 end
0379 out=idx;
0380 if ~nargout
0381 match=DIVA_AuditoryCortexCategorical_data.params.match+1;
0382 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).ntrained=...
0383 DIVA_AuditoryCortexCategorical_data.params.AuditoryTargets(match).ntrained+1;
0384 DIVA('SoundMap','target',out,...
0385 sum(delay(1:n))+DIVA_AuditoryCortexCategorical_data.params.delayToSoundMap);
0386 DIVA('ModelStatePlot','AuditoryCortexCategorical','target');
0387 end
0388 end
0389
0390
0391
0392
0393 otherwise,
0394 if isfield(DIVA_AuditoryCortexCategorical_data.params,varargin{indexargin}),
0395 if indexargin==nargin,
0396 out=DIVA_AuditoryCortexCategorical_data.params.(varargin{indexargin});
0397 else,
0398 DIVA_AuditoryCortexCategorical_data.params.(varargin{indexargin})=varargin{indexargin+1};
0399 end
0400 else,
0401 warning('DIVA_AuditoryCortexCategorical: wrong argument');
0402 end
0403 end
0404 end
0405