tomwalters@0
|
1 % method of class @frame
|
tomwalters@0
|
2 %
|
tomwalters@0
|
3 % INPUT VALUES:
|
tomwalters@0
|
4 %
|
tomwalters@0
|
5 % RETURN VALUE:
|
tomwalters@0
|
6 %
|
tomwalters@0
|
7 %
|
tomwalters@0
|
8 % (c) 2003, University of Cambridge, Medical Research Council
|
tomwalters@0
|
9 % Stefan Bleeck (stefan@bleeck.de)
|
tomwalters@0
|
10 % http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual
|
tomwalters@0
|
11 % $Date: 2003/03/13 14:48:37 $
|
tomwalters@0
|
12 % $Revision: 1.5 $
|
tomwalters@0
|
13
|
tomwalters@0
|
14 function nap=phasealign(nap,options)
|
tomwalters@0
|
15
|
tomwalters@0
|
16 if nargin < 2
|
tomwalters@0
|
17 options=[];
|
tomwalters@0
|
18 end
|
tomwalters@0
|
19
|
tomwalters@0
|
20
|
tomwalters@0
|
21 %'off','maximum_envelope','nr_cycles','envelope_finestructure'
|
tomwalters@0
|
22
|
tomwalters@0
|
23 if ~isfield(options,'do_phase_alignment')%
|
tomwalters@0
|
24 options.do_phase_alignment='nr_cycles';
|
tomwalters@0
|
25 end
|
tomwalters@0
|
26
|
tomwalters@0
|
27 if ~isfield(options,'phase_alignment_nr_cycles')
|
tomwalters@0
|
28 options.phase_alignment_nr_cycles=3;
|
tomwalters@0
|
29 end
|
tomwalters@0
|
30
|
tomwalters@0
|
31
|
tomwalters@0
|
32
|
tomwalters@0
|
33 % values needed by all functions
|
tomwalters@0
|
34 vals=getvalues(nap);
|
tomwalters@0
|
35 new_vals=zeros(size(vals));
|
tomwalters@0
|
36 nr_chan=size(vals,1);
|
tomwalters@0
|
37 nr_dots=size(vals,2);
|
tomwalters@0
|
38 sr=getsr(nap);
|
tomwalters@0
|
39 cfs=getcf(nap);
|
tomwalters@0
|
40
|
tomwalters@0
|
41
|
tomwalters@0
|
42 if strcmp(options.do_phase_alignment,'nr_cycles')
|
tomwalters@0
|
43 for ii=1:nr_chan
|
tomwalters@0
|
44 shift=options.phase_alignment_nr_cycles/cfs(ii);
|
tomwalters@0
|
45 intshift=round(shift*sr);
|
tomwalters@0
|
46 dots=vals(ii,:);
|
tomwalters@0
|
47 ndots=[dots(intshift:end) zeros(intshift-1,1)'];
|
tomwalters@0
|
48 % vals(ii,:)=ndots/log(cfs(ii));
|
tomwalters@0
|
49 vals(ii,:)=ndots;
|
tomwalters@0
|
50 end
|
tomwalters@0
|
51 end
|
tomwalters@0
|
52
|
tomwalters@0
|
53
|
tomwalters@0
|
54 if strcmp(options.do_phase_alignment,'envelope_finestructure')
|
tomwalters@0
|
55 % phase alignment according to Holdswoth 1988
|
tomwalters@0
|
56 EarQ = 9.26449; % Glasberg and Moore Parameters
|
tomwalters@0
|
57 minBW = 24.7;
|
tomwalters@0
|
58 order = 4;
|
tomwalters@0
|
59 ERB = ((cfs/EarQ).^order + minBW^order).^(1/order);
|
tomwalters@0
|
60 b=1.019.*ERB;
|
tomwalters@0
|
61 B=1.019*2*pi.*ERB;
|
tomwalters@0
|
62 envelopecomptime=(order-1)./B;
|
tomwalters@0
|
63 phasealign=-2*pi.*cfs.*envelopecomptime;
|
tomwalters@0
|
64 phasealign=mod(phasealign,2*pi);
|
tomwalters@0
|
65 phasealign=phasealign./(2*pi.*cfs);
|
tomwalters@0
|
66 % first align to the envelope
|
tomwalters@0
|
67 % introduce phase shift in each channel
|
tomwalters@0
|
68 for ii=1:nr_chan
|
tomwalters@0
|
69 shift=envelopecomptime(ii);
|
tomwalters@0
|
70 intshift=round(shift*sr);
|
tomwalters@0
|
71 dots=vals(ii,:);
|
tomwalters@0
|
72 ndots=[dots(intshift:end) zeros(intshift-1,1)'];
|
tomwalters@0
|
73 % vals(ii,:)=ndots/log(cfs(ii));
|
tomwalters@0
|
74 vals(ii,:)=ndots;
|
tomwalters@0
|
75 end
|
tomwalters@0
|
76 % then align to the fine structure
|
tomwalters@0
|
77 for ii=1:nr_chan
|
tomwalters@0
|
78 shift=phasealign(ii);
|
tomwalters@0
|
79 intshift=round(shift*sr);
|
tomwalters@0
|
80 dots=vals(ii,:);
|
tomwalters@0
|
81 ndots=[dots(intshift:end) zeros(intshift-1,1)'];
|
tomwalters@0
|
82 vals(ii,:)=ndots;
|
tomwalters@0
|
83 end
|
tomwalters@0
|
84 end
|
tomwalters@0
|
85
|
tomwalters@0
|
86
|
tomwalters@0
|
87 if strcmp(options.do_phase_alignment,'maximum_envelope')
|
tomwalters@0
|
88 % phase alignment according to Holdswoth 1988 without fine structure
|
tomwalters@0
|
89 EarQ = 9.26449; % Glasberg and Moore Parameters
|
tomwalters@0
|
90 minBW = 24.7;
|
tomwalters@0
|
91 order = 4;
|
tomwalters@0
|
92 ERB = ((cfs/EarQ).^order + minBW^order).^(1/order);
|
tomwalters@0
|
93 b=1.019.*ERB;
|
tomwalters@0
|
94 B=1.019*2*pi.*ERB;
|
tomwalters@0
|
95 envelopecomptime=(order-1)./B;
|
tomwalters@0
|
96 phasealign=-2*pi.*cfs.*envelopecomptime;
|
tomwalters@0
|
97 phasealign=mod(phasealign,2*pi);
|
tomwalters@0
|
98 phasealign=phasealign./(2*pi.*cfs);
|
tomwalters@0
|
99
|
tomwalters@0
|
100 % first align to the envelope
|
tomwalters@0
|
101 % introduce phase shift in each channel
|
tomwalters@0
|
102 for ii=1:nr_chan
|
tomwalters@0
|
103 shift=envelopecomptime(ii);
|
tomwalters@0
|
104 intshift=round(shift*sr);
|
tomwalters@0
|
105 dots=vals(ii,:);
|
tomwalters@0
|
106 ndots=[dots(intshift:end) zeros(intshift-1,1)'];
|
tomwalters@0
|
107 % vals(ii,:)=ndots/log(cfs(ii));
|
tomwalters@0
|
108 vals(ii,:)=ndots;
|
tomwalters@0
|
109 end
|
tomwalters@0
|
110 end
|
tomwalters@0
|
111
|
tomwalters@0
|
112
|
tomwalters@0
|
113 if strcmp(options.do_phase_alignment,'nr_cycles_freq')
|
tomwalters@0
|
114 phase_alignment_nr_cycles=0.6796.*log(cfs)-1.3836;
|
tomwalters@0
|
115
|
tomwalters@0
|
116 for ii=1:nr_chan
|
tomwalters@0
|
117 shift=phase_alignment_nr_cycles(ii)./cfs(ii);
|
tomwalters@0
|
118 intshift=round(shift*sr);
|
tomwalters@0
|
119 dots=vals(ii,:);
|
tomwalters@0
|
120 ndots=[dots(intshift:end) zeros(intshift-1,1)'];
|
tomwalters@0
|
121 % vals(ii,:)=ndots/log(cfs(ii));
|
tomwalters@0
|
122 vals(ii,:)=ndots;
|
tomwalters@0
|
123 end
|
tomwalters@0
|
124 end
|
tomwalters@0
|
125
|
tomwalters@0
|
126
|
tomwalters@0
|
127
|
tomwalters@0
|
128
|
tomwalters@0
|
129
|
tomwalters@0
|
130 nap=setvalues(nap,vals); |