123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- %% ABR analysis script: this script takes the raw recordings and extracts the results
- % raw recordings are available from last author upon request
- %% settings
- fs=19200; % sampling rate after 20-fold resampling
- bma200_input_gain=10000; % value gained during calibration
- abr_scale_factor=1/(7e-5*bma200_input_gain); % in mV
- nboot=500; % number of bootstraps for statistics
- % set if you want to save the results and bootstrap options (1=on, 0=off)
- saveon=0;
- booton=1;
- % set abr analysis window
- ana_wind_start=0.001; % offset of rms calculation window
- ana_wind_dur=0.007; % duration of rms calculation window
- ana_wind_starts=round(ana_wind_start*fs);
- ana_wind_stops=round((ana_wind_start+ana_wind_dur)*fs);
- % define (internal) bat ID, recording date and recording number for analyses
- dates = {'20170207','20170210','20170817','20191204',...
- '20170213','20170223','20170818','20191204',...
- '20170217','20170220','20170821','20191205',...
- '20170203','20170209','20170817','20191204',...
- '20170208','20170216','20170818','20191203',...
- '20170306','20170313','20170821','20191205'};
- reco = {'3','3','3','2','3','3','8','2','3','5','3','2',...
- '5','3','7','2','3','3','3','3','3','7','4','2'};
- animalname = {'3','3','3','3','5','5','5','5','8','8','8','8',...
- '2','2','2','2','4','4','4','4','7','7','7','7'};
- %% data extraction and bootstrap analysis
- for i=1:24
- % choose current bat, date, record number
- batid=char(animalname(i));
- date=dates(i);
- recn=reco(i);
-
- % location of folder with the raw recordings
- rootpath=['D:\Documents\Manuskripte\Vocal_development\ABR_recordings\B' batid '\' char(date) '\'];
-
- % circumvent naming error of B2 files
- if batid=='2'
- recname=['abr_tonepips_ed_b' batid '_m' char(recn) '_'];
- else
- recname=['abr_tonepips_vpl_b' batid '_m' char(recn) '_'];
- end
-
- % access the folder with the recordings
- d=dir(rootpath);
- filenames=char(d.name); % read in the names of the files in this folder
- recnum=0; % set recnum to zero
- for fn=3:size(filenames,1) % go through all files in this folder
- filename=deblank(filenames(fn,:));
- if 1-isempty(strfind(filename,recname))
- % extract info from filename
- li=strfind(filename,'_l');
- fi=strfind(filename,'_fc');
- xi=strfind(filename,'_');
- xi=xi(min(find(xi>fi)));
- if xi>fi+4 % if there is frequency information in the filename
- xi=max(xi);
- recnum=recnum+1;
- lstring=filename(li+2:fi-1);
- current_level=str2num(lstring);
- fstring=filename(fi+3:xi-1);
- current_freq=str2num(fstring);
- load([rootpath filename]); % load the file to be analysed
- end
-
- mrxin=squeeze(mean(rxin,2)).*abr_scale_factor;
- levels(recnum)=current_level;
- freqs(recnum)=current_freq/1e3;
- rec(recnum,:)=mrxin;
-
- %%% BOOTSTRAPPING ANALYSIS STARTS HERE
- if booton==1
- data=rxin(ana_wind_starts:ana_wind_stops,:);
- datalong=reshape(data,numel(data),1);
-
- % do a bootstrapping analysis
- samplesize=size(data,1);
- indices=1:(length(datalong)-samplesize);
- samplenumber=size(data,2);
- originalsignal=mean(data,2);
- originalrms=std(originalsignal);
-
- for bn=1:nboot
- for rep=1:size(data,2)
- bsdata(:,rep)=circshift(data(:,rep),ceil(rand*size(data,1)));
- end
- bootrms(bn)=std(mean(bsdata,2));
- end
-
- confidence=numel(find(originalrms>bootrms))/nboot;
- confidences(recnum)=confidence;
- end %%% BOOTSTRAP ANALYSIS ENDS HERE
- end
- end
-
- % organise data for bootstrap plots
- all_levels=sort(unique(levels));
- all_freqs=sort(unique(freqs));
- out=zeros(length(all_levels),length(all_freqs));
- for sn=1:length(levels)
- cl=levels(sn);
- cf=freqs(sn);
- li=find(all_levels==cl);
- fi=find(all_freqs==cf);
- out(li,fi)=std(rec(sn,ana_wind_starts:ana_wind_stops)); % calculate rms from sample 31 because of rec onset irregularities
- end
- in=[freqs' levels' confidences'];
- sort_in=sortrows(in,[1 2]);
- ufreqs=unique(freqs);
- ulevels=unique(levels);
-
- for fn=1:length(ufreqs)
- cfreq=ufreqs(fn);
- fconf=sort_in(find(sort_in(:,1)==cfreq),3);
- threshold_ind=max(find(fconf<0.95))+1;
- if threshold_ind<=length(ulevels) & 1-isempty(threshold_ind)
- bootstrap_thresholds(fn)=ulevels(threshold_ind);
- else
- bootstrap_thresholds(fn)=nan;
- end
- end
-
- % save results in structures
- resultTHRES(i)=struct('uniqueFrequencies',ufreqs','bootstrapThresholds',bootstrap_thresholds');
- allCONFI(i)=struct('frequencies',freqs,'levels',levels,'confidences',confidences);
- heatRES(i)=struct('all_freqs',all_freqs,'all_levels',all_levels,'out',out);
- end
- %% saving of the variables
- if saveon==1
- bats = strcat('b', animalname);
- save('abr_deafening_results.mat','dates','bats','resultTHRES','allCONFI');
- end
|