annotate aim-mat/tools/@frame/phasealign.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 74dedb26614d
children
rev   line source
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);