rmeddis@38: function fach=fourierautocorrelationhistogram(ANpattern,sfreq) rmeddis@38: rmeddis@38: rmeddis@38: time_axis = 0:1/sfreq:(size(ANpattern,2)-1)/sfreq; rmeddis@38: rmeddis@38: %find how many samples of AN_pattern are 10ms and 3ms rmeddis@38: %one_sample_is_a_time_of = time_axis(2); rmeddis@38: [tmp, start_time_index] = min(abs(0-time_axis)); rmeddis@38: [tmp, stop20_time_index] = min(abs(0.020-time_axis)); rmeddis@38: number_of_samples20ms = stop20_time_index - start_time_index; rmeddis@38: rmeddis@38: [tmp, stop3_time_index] = min(abs(0.003-time_axis)); rmeddis@38: number_of_samples3ms = stop3_time_index - start_time_index; rmeddis@38: every_3ms = 1:number_of_samples3ms:size(ANpattern,2)-number_of_samples20ms; rmeddis@38: rmeddis@38: hamm_window = hamming(11); rmeddis@38: halfHamming = (length(hamm_window)-1)/2; rmeddis@38: rmeddis@38: % window normalization rmeddis@38: rmeddis@38: norm = conv(ones(1,floor(number_of_samples20ms/2)),hamm_window); rmeddis@38: norm = norm(5+1:end-5)'; rmeddis@38: win_size = number_of_samples20ms; rmeddis@38: half_win_size = floor(win_size/2); rmeddis@38: hop_size = number_of_samples3ms; rmeddis@38: rmeddis@38: %preallocation due to speed rmeddis@38: fach = zeros(half_win_size,size(every_3ms,2)); rmeddis@38: rmeddis@38: for iCounter = 1:size(ANpattern,1) %each channel rmeddis@38: fprintf('Channel No. %i\n',iCounter); rmeddis@38: %time_counter = 1; rmeddis@38: %for jCounter = every_3ms %every 3ms time segment rmeddis@38: rmeddis@38: rmeddis@38: rmeddis@38: %% Guy's code rmeddis@38: % enframe this signal rmeddis@38: rmeddis@38: frames = enframe(ANpattern(iCounter,:),win_size,hop_size); rmeddis@38: rmeddis@38: % compute the autocorrelation rmeddis@38: rmeddis@38: acf = real(ifft(abs(fft(frames,[],2)).^2,[],2)); rmeddis@38: acf(acf<0)=0; rmeddis@38: acf = sqrt(acf(:,1:half_win_size)); rmeddis@38: rmeddis@38: % smooth with hamming window and take the root rmeddis@38: rmeddis@38: for frame=1:size(acf,1) rmeddis@38: rmeddis@38: rmeddis@38: smoothed_correlation = conv(acf(frame,:),hamm_window); rmeddis@38: smoothed_correlation = smoothed_correlation(halfHamming+1:end-halfHamming)./norm'; rmeddis@38: fsra = abs(fft(smoothed_correlation-mean(smoothed_correlation))); rmeddis@38: fsra = fsra(1:floor(length(fsra)/2)); rmeddis@38: rmeddis@38: t = [0:1/sfreq:length(smoothed_correlation)/sfreq-1/sfreq]; rmeddis@38: frequency = [0:1/t(end):1/(2*(t(2)-t(1)))]; rmeddis@38: %identify peaks in the fft rmeddis@38: df = [0 ; diff(fsra')]; rmeddis@38: idx = find((df(1:end-1)>=0)&(df(2:end)<0)); rmeddis@38: % % interpolate rmeddis@38: % a=df(idx); rmeddis@38: % b=df(idx+1); rmeddis@38: % idx = (idx-1+a./(a-b)); rmeddis@38: [sorted,sortedindex]=sort(fsra(idx),'descend'); rmeddis@38: % just take the three highest values of the fourier-transform rmeddis@38: valid_peak_index = sortedindex(1:min([length(sortedindex) 3])); rmeddis@38: amp = sorted(1:min([length(sortedindex) 3])); rmeddis@38: rmeddis@38: %store valid peaks according to amplitude in a histogram rmeddis@38: if (~isempty(valid_peak_index)) rmeddis@38: for k=1:length(valid_peak_index), rmeddis@38: fach(idx(valid_peak_index(k)),frame) = fach(idx(valid_peak_index(k)),frame)+amp(k); rmeddis@38: end rmeddis@38: end rmeddis@38: %transform index into frequencies rmeddis@38: rmeddis@38: end rmeddis@38: end rmeddis@38: rmeddis@38: %fach = 0;