To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

The primary repository for this project is hosted at git://github.com/rmeddis/MAP.git .
This repository is a read-only copy which is updated automatically every hour.

Statistics Download as Zip
| Branch: | Revision:

root / userProgramsTim / IPIHextract.m @ 38:c2204b18f4a2

History | View | Annotate | Download (7.53 KB)

1 38:c2204b18f4a2 rmeddis
function [iih,IPIhisttime,IPIhistweight]=IPIHextract(IFRAN_pattern, sfreq)
2
%
3
% tracks the formants according to an analysis proposed in Secker-Walker
4
% JASA 1990, section V.A
5
% Tim J?rgens, February 2011, code from Guy Brown included
6
%
7
% input:  IFRAN_pattern: pattern of the auditory model (dependend on the number of modules used)
8
%                        first dimension: frequency channel,
9
%                        second dimension: time (samples)
10
%         sfreq:         sampling frequency
11
% output: iih:           interpeak-interval histogram, matrix very similar
12
%                        the plot 5 in the Secker-Walker paper
13
%
14
%
15
%
16
17
18
time_axis = 0:1/sfreq:(size(IFRAN_pattern,2)-1)/sfreq;
19
20
%find how many samples of AN_pattern are 10ms and 3ms
21
%one_sample_is_a_time_of = time_axis(2);
22
[tmp, start_time_index] = min(abs(0-time_axis));
23
[tmp, stop20_time_index] = min(abs(0.020-time_axis));
24
number_of_samples20ms = stop20_time_index - start_time_index;
25
26
[tmp, stop10_time_index] = min(abs(0.010-time_axis));
27
number_of_samples10ms = stop10_time_index - start_time_index;
28
every_10ms = 1:number_of_samples10ms:size(IFRAN_pattern,2)-number_of_samples20ms;
29
30
hamm_window = hamming(11);
31
halfHamming = (length(hamm_window)-1)/2;
32
33
% window normalization
34
35
norm = conv(ones(1,number_of_samples20ms),hamm_window);
36
norm = norm(5+1:end-5)';
37
win_size = number_of_samples20ms;
38
half_win_size = floor(win_size/2);
39
hop_size = number_of_samples10ms;
40
41
%parameters of the autocorrelation
42
params.acfTau=0.1;
43
params.lags=[0:1/sfreq:0.02-1/sfreq];
44
sampledacf = runningACF(IFRAN_pattern,sfreq,params);
45
sampledacf(sampledacf<0)=0;
46
sampledacf = sqrt(sampledacf);
47
48
49
%pre-allocation due to speed
50
%Acorr = zeros(size(IFRAN_pattern,1),size(every_3ms,2),number_of_samples10ms*2+1);
51
%RAcorr = zeros(size(IFRAN_pattern,1),size(every_3ms,2),number_of_samples10ms*2+1);
52
%SRAcorr = zeros(size(IFRAN_pattern,1),size(every_3ms,2),number_of_samples10ms*2+1-10);
53
IPIhisttime = zeros(size(IFRAN_pattern,1),size(every_10ms,2),3);
54
IPIhistweight = zeros(size(IFRAN_pattern,1),size(every_10ms,2),3);  %maximum 3 peaks from the SRA
55
iih = zeros(half_win_size,size(sampledacf,1));
56
57
58
59
60
61
for iCounter = 1:size(sampledacf,2) %each channel
62
    fprintf('Channel No. %i\n',iCounter);
63
    %time_counter = 1;
64
    %for jCounter = every_3ms %every 3ms time segment
65
66
    for frame=1:size(sampledacf,1)
67
68
        %%debug
69
        %if iCounter == 130
70
        %    disp('here');
71
        %end
72
73
74
        sra = conv(squeeze(sampledacf(frame,iCounter,:)),hamm_window);
75
        sra = sra(halfHamming+1:end-halfHamming)./norm;
76
        df = [0 ; diff(sra)];
77
        idx = find((df(1:end-1)>=0)&(df(2:end)<0));
78
        % interpolate
79
        a=df(idx);
80
        b=df(idx+1);
81
        idx = (idx-1+a./(a-b));
82
        % get rid of a zero peak, if it exists
83
        idx = idx(idx>1);
84
        %include the zeroth peak
85
        idx = [1 idx']';
86
        % peak values corresponding to these intervals
87
        amp = interp1(1:length(sra),sra,idx,'linear');
88
        % if required, remove peaks that lie below the mean sra
89
        % note that we disregard the value at zero delay
90
        %if (params.removePeaksBelowMean)
91
        valid = find(amp>1.2*mean(sra(1:floor(length(sra)/2))));
92
        %valid = find(amp>mean(sra));
93
        %just take the mean of the first half of the sra as a comparison
94
        idx = idx(valid);
95
        amp = amp(valid);
96
        %end
97
        % only use the first four peaks (three intervals)
98
        idx = idx(1:min(4,length(idx)));
99
        % find the intervals
100
        interval = diff(idx);
101
        % now histogram the intervals
102
        if (~isempty(interval))
103
            for k=1:length(interval)
104
                if interval(k)<=half_win_size
105
                    iih(round(interval(k)),frame) = iih(round(interval(k)),frame)+amp(k);
106
                    IPIhisttime(iCounter,frame,k) = interval(k)/sfreq;
107
                    IPIhistweight(iCounter,frame,k) = amp(k);
108
                end
109
            end
110
        end
111
112
    end
113
114
115
116
117
    %% end Guy's code
118
119
120
    %         %take the autocorrelation (ACF) of a 10ms-segment of each channel
121
    %         Acorr(iCounter,time_counter,:) = xcorr(IFRAN_pattern(iCounter,jCounter:number_of_samples10ms+jCounter),'biased'); %biased scales the ACF by the reciprocal of the length of the segment
122
    %         %root calculation
123
    %         RAcorr(iCounter,time_counter,:) = sqrt(abs(Acorr(iCounter,time_counter,:)));
124
    %
125
    %         %smoothing using the 11-point hamming window
126
    %         for kCounter = 6:size(RAcorr(iCounter,time_counter,:),3)-5 %start with 6 and end with 5 samples
127
    %             %less the length of time_axis not to get in conflict with the length of
128
    %             %the hamm_window
129
    %             SRAcorr(iCounter,time_counter,kCounter-5) = ...
130
    %                 squeeze(RAcorr(iCounter,time_counter,(kCounter-5):(kCounter+5)))'*hamm_window./sum(hamm_window);
131
    %         end
132
    %
133
    %         %mean value of actual SRA
134
    %         SRA_mean = mean(SRAcorr(iCounter,time_counter,:));
135
    %
136
    %         %find signed zero-crossings of the first derivative (=difference)
137
    %         z_crossings_indices = find(diff(sign(diff(squeeze(SRAcorr(iCounter,time_counter,:))))) < 0)+1; %+1 is necessary, because diff shortens vector by 1
138
    %         middle_index = ceil(size(SRAcorr(iCounter,time_counter,:),3)/2);
139
    %
140
    %         validCounter = 1;
141
    %         valid_z_crossings_indices = [];
142
    %         %find valid zero-crossings (peak higher than meanvalue and within first 5 ms of SRA)
143
    %         for lCounter = 1:length(z_crossings_indices)
144
    %             if (SRAcorr(iCounter,time_counter,z_crossings_indices(lCounter)) > SRA_mean) && ...
145
    %                     (abs(z_crossings_indices(lCounter)-middle_index) < round(number_of_samples10ms/2));
146
    %                 valid_z_crossings_indices(validCounter) = z_crossings_indices(lCounter);
147
    %                 validCounter = validCounter+1;
148
    %             end
149
    %         end
150
    %
151
    %         %find main peak in the ACF
152
    %         [tmp,index_of_z_crossings_main_index] = min(abs(middle_index-valid_z_crossings_indices));
153
    %         if ~tmp == 0
154
    %             disp('middle peak not appropriately found');
155
    %         end
156
    %
157
    %         %%% for debugging
158
    % %         if iCounter == 130
159
    % %             disp('here');
160
    % %             figure, plot(squeeze(SRAcorr(iCounter,time_counter,:)));
161
    % %             hold on, plot([1 length(squeeze(SRAcorr(iCounter,time_counter,:)))],[SRA_mean SRA_mean],'r-');
162
    % %         end
163
    %         %%%
164
    %
165
    %         %generate IPI-histogram: take the first 3 intervals of SRAcorr
166
    %         %(positive delay) in the first 5 ms
167
    %         histcounter = 1;
168
    %         for lCounter = index_of_z_crossings_main_index+1:min([length(valid_z_crossings_indices(index_of_z_crossings_main_index+1:end)) 3])+index_of_z_crossings_main_index
169
    %             sampledifference = abs(valid_z_crossings_indices(lCounter)-valid_z_crossings_indices(lCounter-1));
170
    %             %the difference between two adjacent peaks in the SRA is taken
171
    %             %as IPI estimate
172
    %             IPIhisttime(iCounter,time_counter,histcounter) = sampledifference*one_sample_is_a_time_of;
173
    %             %the amplitude of the SRA at the start of the SRA interval is
174
    %             %taken as the IPIweight
175
    %             IPIhistweight(iCounter,time_counter,histcounter) = SRAcorr(iCounter,time_counter,valid_z_crossings_indices(lCounter-1));
176
    %             histcounter = histcounter + 1;
177
    %         end
178
179
    %time_counter = time_counter+1;
180
end