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 / track_formants_from_IPI_guy.m

History | View | Annotate | Download (7.38 KB)

1 38:c2204b18f4a2 rmeddis
function [iih,IPIhisttime,IPIhistweight]=track_formants_from_IPI_guy(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, stop10_time_index] = min(abs(0.01-time_axis));
24
number_of_samples10ms = stop10_time_index - start_time_index;
25
26
[tmp, stop3_time_index] = min(abs(0.003-time_axis));
27
number_of_samples3ms = stop3_time_index - start_time_index;
28
every_3ms = 1:number_of_samples3ms:size(IFRAN_pattern,2)-number_of_samples10ms;
29
30
hamm_window = hamming(11);
31
halfHamming = (length(hamm_window)-1)/2;
32
33
% window normalization
34
35
norm = conv(ones(1,floor(number_of_samples10ms/2)),hamm_window);
36
norm = norm(5+1:end-5)';
37
win_size = number_of_samples10ms;
38
half_win_size = floor(win_size/2);
39
hop_size = number_of_samples3ms;
40
41
42
%pre-allocation due to speed
43
%Acorr = zeros(size(IFRAN_pattern,1),size(every_3ms,2),number_of_samples10ms*2+1);
44
%RAcorr = zeros(size(IFRAN_pattern,1),size(every_3ms,2),number_of_samples10ms*2+1);
45
%SRAcorr = zeros(size(IFRAN_pattern,1),size(every_3ms,2),number_of_samples10ms*2+1-10);
46
IPIhisttime = zeros(size(IFRAN_pattern,1),size(every_3ms,2),3);
47
IPIhistweight = zeros(size(IFRAN_pattern,1),size(every_3ms,2),3);  %maximum 3 peaks from the SRA
48
iih = zeros(half_win_size,size(every_3ms,2)+1);
49
50
51
52
53
for iCounter = 1:size(IFRAN_pattern,1) %each channel
54
    fprintf('Channel No. %i\n',iCounter);
55
    %time_counter = 1;
56
    %for jCounter = every_3ms %every 3ms time segment
57
58
59
60
    %% Guy's code
61
    % enframe this signal
62
63
    frames = enframe(IFRAN_pattern(iCounter,:),win_size,hop_size);
64
65
    % compute the autocorrelation
66
67
    acf = real(ifft(abs(fft(frames,[],2)).^2,[],2));
68
    acf(acf<0)=0;
69
    acf = sqrt(acf(:,1:half_win_size));
70
71
    % smooth with hamming window and take the root
72
73
    for frame=1:size(acf,1)
74
75
        %%debug
76
        %if iCounter == 130
77
        %    disp('here');
78
        %end
79
80
81
        sra = conv(acf(frame,:),hamm_window);
82
        sra = sra(halfHamming+1:end-halfHamming)./norm';
83
        df = [0 ; diff(sra')];
84
        idx = find((df(1:end-1)>=0)&(df(2:end)<0));
85
        % interpolate
86
        a=df(idx);
87
        b=df(idx+1);
88
        idx = (idx-1+a./(a-b));
89
        % get rid of a zero peak, if it exists
90
        idx = idx(idx>1);
91
        % peak values corresponding to these intervals
92
        amp = interp1(1:length(sra),sra,idx,'linear');
93
        % if required, remove peaks that lie below the mean sra
94
        % note that we disregard the value at zero delay
95
        %if (params.removePeaksBelowMean)
96
        valid = find(amp>mean(sra(2:end)));
97
        idx = idx(valid);
98
        amp = amp(valid);
99
        %end
100
        % only use the first four peaks (three intervals)
101
        idx = idx(1:min(4,length(idx)));
102
        % find the intervals
103
        interval = diff(idx);
104
        % now histogram the intervals
105
        if (~isempty(interval))
106
            for k=1:length(interval),
107
                iih(round(interval(k)),frame) = iih(round(interval(k)),frame)+amp(k);
108
                IPIhisttime(iCounter,frame,k) = interval(k)/sfreq;
109
                IPIhistweight(iCounter,frame,k) = amp(k);
110
            end
111
        end
112
113
    end
114
115
116
117
118
    %% end Guy's code
119
120
121
    %         %take the autocorrelation (ACF) of a 10ms-segment of each channel
122
    %         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
123
    %         %root calculation
124
    %         RAcorr(iCounter,time_counter,:) = sqrt(abs(Acorr(iCounter,time_counter,:)));
125
    %
126
    %         %smoothing using the 11-point hamming window
127
    %         for kCounter = 6:size(RAcorr(iCounter,time_counter,:),3)-5 %start with 6 and end with 5 samples
128
    %             %less the length of time_axis not to get in conflict with the length of
129
    %             %the hamm_window
130
    %             SRAcorr(iCounter,time_counter,kCounter-5) = ...
131
    %                 squeeze(RAcorr(iCounter,time_counter,(kCounter-5):(kCounter+5)))'*hamm_window./sum(hamm_window);
132
    %         end
133
    %
134
    %         %mean value of actual SRA
135
    %         SRA_mean = mean(SRAcorr(iCounter,time_counter,:));
136
    %
137
    %         %find signed zero-crossings of the first derivative (=difference)
138
    %         z_crossings_indices = find(diff(sign(diff(squeeze(SRAcorr(iCounter,time_counter,:))))) < 0)+1; %+1 is necessary, because diff shortens vector by 1
139
    %         middle_index = ceil(size(SRAcorr(iCounter,time_counter,:),3)/2);
140
    %
141
    %         validCounter = 1;
142
    %         valid_z_crossings_indices = [];
143
    %         %find valid zero-crossings (peak higher than meanvalue and within first 5 ms of SRA)
144
    %         for lCounter = 1:length(z_crossings_indices)
145
    %             if (SRAcorr(iCounter,time_counter,z_crossings_indices(lCounter)) > SRA_mean) && ...
146
    %                     (abs(z_crossings_indices(lCounter)-middle_index) < round(number_of_samples10ms/2));
147
    %                 valid_z_crossings_indices(validCounter) = z_crossings_indices(lCounter);
148
    %                 validCounter = validCounter+1;
149
    %             end
150
    %         end
151
    %
152
    %         %find main peak in the ACF
153
    %         [tmp,index_of_z_crossings_main_index] = min(abs(middle_index-valid_z_crossings_indices));
154
    %         if ~tmp == 0
155
    %             disp('middle peak not appropriately found');
156
    %         end
157
    %
158
    %         %%% for debugging
159
    % %         if iCounter == 130
160
    % %             disp('here');
161
    % %             figure, plot(squeeze(SRAcorr(iCounter,time_counter,:)));
162
    % %             hold on, plot([1 length(squeeze(SRAcorr(iCounter,time_counter,:)))],[SRA_mean SRA_mean],'r-');
163
    % %         end
164
    %         %%%
165
    %
166
    %         %generate IPI-histogram: take the first 3 intervals of SRAcorr
167
    %         %(positive delay) in the first 5 ms
168
    %         histcounter = 1;
169
    %         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
170
    %             sampledifference = abs(valid_z_crossings_indices(lCounter)-valid_z_crossings_indices(lCounter-1));
171
    %             %the difference between two adjacent peaks in the SRA is taken
172
    %             %as IPI estimate
173
    %             IPIhisttime(iCounter,time_counter,histcounter) = sampledifference*one_sample_is_a_time_of;
174
    %             %the amplitude of the SRA at the start of the SRA interval is
175
    %             %taken as the IPIweight
176
    %             IPIhistweight(iCounter,time_counter,histcounter) = SRAcorr(iCounter,time_counter,valid_z_crossings_indices(lCounter-1));
177
    %             histcounter = histcounter + 1;
178
    %         end
179
180
    %time_counter = time_counter+1;
181
end