rmeddis@38
|
1 function fach=fourierautocorrelationhistogram(ANpattern,sfreq)
|
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));
|
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(acf,1)
|
rmeddis@38
|
51
|
rmeddis@38
|
52
|
rmeddis@38
|
53 smoothed_correlation = conv(acf(frame,:),hamm_window);
|
rmeddis@38
|
54 smoothed_correlation = smoothed_correlation(halfHamming+1:end-halfHamming)./norm';
|
rmeddis@38
|
55 fsra = abs(fft(smoothed_correlation-mean(smoothed_correlation)));
|
rmeddis@38
|
56 fsra = fsra(1:floor(length(fsra)/2));
|
rmeddis@38
|
57
|
rmeddis@38
|
58 t = [0:1/sfreq:length(smoothed_correlation)/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) 3]));
|
rmeddis@38
|
70 amp = sorted(1:min([length(sortedindex) 3]));
|
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 %fach = 0;
|