annotate userProgramsTim/fourierautocorrelationhistogram_direct.m @ 38:c2204b18f4a2 tip

End nov big change
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 28 Nov 2011 13:34:28 +0000
parents
children
rev   line source
rmeddis@38 1 function fach=fourierautocorrelationhistogram_direct(ANpattern,sfreq,plothandle)
rmeddis@38 2
rmeddis@38 3
rmeddis@38 4 time_axis = 0:1/sfreq:(size(ANpattern,2)-1)/sfreq;
rmeddis@38 5
rmeddis@38 6 %find how many samples of AN_pattern are 10ms and 3ms
rmeddis@38 7 %one_sample_is_a_time_of = time_axis(2);
rmeddis@38 8 [tmp, start_time_index] = min(abs(0-time_axis));
rmeddis@38 9 [tmp, stop20_time_index] = min(abs(0.020-time_axis));
rmeddis@38 10 number_of_samples20ms = stop20_time_index - start_time_index;
rmeddis@38 11
rmeddis@38 12 [tmp, stop3_time_index] = min(abs(0.003-time_axis));
rmeddis@38 13 number_of_samples3ms = stop3_time_index - start_time_index;
rmeddis@38 14 every_3ms = 1:number_of_samples3ms:size(ANpattern,2)-number_of_samples20ms;
rmeddis@38 15
rmeddis@38 16 hamm_window = hamming(11);
rmeddis@38 17 halfHamming = (length(hamm_window)-1)/2;
rmeddis@38 18
rmeddis@38 19 % window normalization
rmeddis@38 20
rmeddis@38 21 norm = conv(ones(1,floor(number_of_samples20ms/2)),hamm_window);
rmeddis@38 22 norm = norm(5+1:end-5)';
rmeddis@38 23 win_size = number_of_samples20ms;
rmeddis@38 24 half_win_size = floor(win_size/2);
rmeddis@38 25 hop_size = number_of_samples3ms;
rmeddis@38 26
rmeddis@38 27 %preallocation due to speed
rmeddis@38 28 fach = zeros(half_win_size,size(every_3ms,2)+1);
rmeddis@38 29
rmeddis@38 30 for iCounter = 1:size(ANpattern,1) %each channel
rmeddis@38 31 fprintf('Channel No. %i\n',iCounter);
rmeddis@38 32 %time_counter = 1;
rmeddis@38 33 %for jCounter = every_3ms %every 3ms time segment
rmeddis@38 34
rmeddis@38 35
rmeddis@38 36
rmeddis@38 37 %% Guy's code
rmeddis@38 38 % enframe this signal
rmeddis@38 39
rmeddis@38 40 frames = enframe(ANpattern(iCounter,:),win_size,hop_size);
rmeddis@38 41
rmeddis@38 42 % compute the autocorrelation
rmeddis@38 43
rmeddis@38 44 %acf = real(ifft(abs(fft(frames,[],2)).^2,[],2));
rmeddis@38 45 %acf(acf<0)=0;
rmeddis@38 46 %acf = sqrt(acf(:,1:half_win_size));
rmeddis@38 47
rmeddis@38 48 % smooth with hamming window and take the root
rmeddis@38 49
rmeddis@38 50 for frame=1:size(frames,1)
rmeddis@38 51
rmeddis@38 52
rmeddis@38 53 smoothed_frame = conv(frames(frame,:),hamm_window);
rmeddis@38 54 smoothed_frame = smoothed_frame(halfHamming+1:end-halfHamming);
rmeddis@38 55 fsra = 20*log10(abs(fft(smoothed_frame-mean(smoothed_frame))));
rmeddis@38 56 fsra = fsra(1:floor(length(fsra)/2));
rmeddis@38 57
rmeddis@38 58 t = [0:1/sfreq:length(smoothed_frame)/sfreq-1/sfreq];
rmeddis@38 59 frequency = [0:1/t(end):1/(2*(t(2)-t(1)))];
rmeddis@38 60 %identify peaks in the fft
rmeddis@38 61 df = [0 ; diff(fsra')];
rmeddis@38 62 idx = find((df(1:end-1)>=0)&(df(2:end)<0));
rmeddis@38 63 % % interpolate
rmeddis@38 64 % a=df(idx);
rmeddis@38 65 % b=df(idx+1);
rmeddis@38 66 % idx = (idx-1+a./(a-b));
rmeddis@38 67 [sorted,sortedindex]=sort(fsra(idx),'descend');
rmeddis@38 68 % just take the three highest values of the fourier-transform
rmeddis@38 69 valid_peak_index = sortedindex(1:min([length(sortedindex) 1]));
rmeddis@38 70 amp = sorted(1:min([length(sortedindex) 1]));
rmeddis@38 71
rmeddis@38 72 %store valid peaks according to amplitude in a histogram
rmeddis@38 73 if (~isempty(valid_peak_index))
rmeddis@38 74 for k=1:length(valid_peak_index),
rmeddis@38 75 fach(idx(valid_peak_index(k)),frame) = fach(idx(valid_peak_index(k)),frame)+amp(k);
rmeddis@38 76 end
rmeddis@38 77 end
rmeddis@38 78 %transform index into frequencies
rmeddis@38 79
rmeddis@38 80 end
rmeddis@38 81 end
rmeddis@38 82
rmeddis@38 83
rmeddis@38 84 %plot the result
rmeddis@38 85 if ~exist('plothandle'), plothandle=figure; end
rmeddis@38 86 maxfrequency = 4000;
rmeddis@38 87 [tmp,number_of_channels_to_display] = min(abs(frequency-maxfrequency));
rmeddis@38 88 frequency = frequency(1:number_of_channels_to_display);
rmeddis@38 89
rmeddis@38 90 set(gcf,'Currentaxes',plothandle);
rmeddis@38 91
rmeddis@38 92 YTickIdx = 1:floor(numel(frequency)/6):numel(frequency);
rmeddis@38 93 XTickIdx = 1:floor(numel(every_3ms)/6):numel(every_3ms);
rmeddis@38 94 YTickIdxRev = numel(frequency)+1-YTickIdx;
rmeddis@38 95 if ~isempty(gca)
rmeddis@38 96 axes(gca); %#ok<MAXES>
rmeddis@38 97 imagesc(fach(1:number_of_channels_to_display,:));
rmeddis@38 98 axis xy
rmeddis@38 99 set(gca, 'YTick', YTickIdx);
rmeddis@38 100 set(gca, 'YTickLabel', num2str( frequency(YTickIdx)', '%0.0f' ));
rmeddis@38 101 ylabel('frequency (Hz)')
rmeddis@38 102 set(gca, 'XTick', XTickIdx);
rmeddis@38 103 set(gca, 'XTickLabel', XTickIdx.*3);
rmeddis@38 104 xlabel('Time (ms)')
rmeddis@38 105 end
rmeddis@38 106
rmeddis@38 107
rmeddis@38 108
rmeddis@38 109