tomwalters@0: % method of class @frame tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % tomwalters@0: % tomwalters@0: % (c) 2003, University of Cambridge, Medical Research Council tomwalters@0: % Stefan Bleeck (stefan@bleeck.de) tomwalters@0: % http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual tomwalters@0: % $Date: 2003/03/13 14:48:37 $ tomwalters@0: % $Revision: 1.5 $ tomwalters@0: tomwalters@0: function nap=phasealign(nap,options) tomwalters@0: tomwalters@0: if nargin < 2 tomwalters@0: options=[]; tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: %'off','maximum_envelope','nr_cycles','envelope_finestructure' tomwalters@0: tomwalters@0: if ~isfield(options,'do_phase_alignment')% tomwalters@0: options.do_phase_alignment='nr_cycles'; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(options,'phase_alignment_nr_cycles') tomwalters@0: options.phase_alignment_nr_cycles=3; tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: % values needed by all functions tomwalters@0: vals=getvalues(nap); tomwalters@0: new_vals=zeros(size(vals)); tomwalters@0: nr_chan=size(vals,1); tomwalters@0: nr_dots=size(vals,2); tomwalters@0: sr=getsr(nap); tomwalters@0: cfs=getcf(nap); tomwalters@0: tomwalters@0: tomwalters@0: if strcmp(options.do_phase_alignment,'nr_cycles') tomwalters@0: for ii=1:nr_chan tomwalters@0: shift=options.phase_alignment_nr_cycles/cfs(ii); tomwalters@0: intshift=round(shift*sr); tomwalters@0: dots=vals(ii,:); tomwalters@0: ndots=[dots(intshift:end) zeros(intshift-1,1)']; tomwalters@0: % vals(ii,:)=ndots/log(cfs(ii)); tomwalters@0: vals(ii,:)=ndots; tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: if strcmp(options.do_phase_alignment,'envelope_finestructure') tomwalters@0: % phase alignment according to Holdswoth 1988 tomwalters@0: EarQ = 9.26449; % Glasberg and Moore Parameters tomwalters@0: minBW = 24.7; tomwalters@0: order = 4; tomwalters@0: ERB = ((cfs/EarQ).^order + minBW^order).^(1/order); tomwalters@0: b=1.019.*ERB; tomwalters@0: B=1.019*2*pi.*ERB; tomwalters@0: envelopecomptime=(order-1)./B; tomwalters@0: phasealign=-2*pi.*cfs.*envelopecomptime; tomwalters@0: phasealign=mod(phasealign,2*pi); tomwalters@0: phasealign=phasealign./(2*pi.*cfs); tomwalters@0: % first align to the envelope tomwalters@0: % introduce phase shift in each channel tomwalters@0: for ii=1:nr_chan tomwalters@0: shift=envelopecomptime(ii); tomwalters@0: intshift=round(shift*sr); tomwalters@0: dots=vals(ii,:); tomwalters@0: ndots=[dots(intshift:end) zeros(intshift-1,1)']; tomwalters@0: % vals(ii,:)=ndots/log(cfs(ii)); tomwalters@0: vals(ii,:)=ndots; tomwalters@0: end tomwalters@0: % then align to the fine structure tomwalters@0: for ii=1:nr_chan tomwalters@0: shift=phasealign(ii); tomwalters@0: intshift=round(shift*sr); tomwalters@0: dots=vals(ii,:); tomwalters@0: ndots=[dots(intshift:end) zeros(intshift-1,1)']; tomwalters@0: vals(ii,:)=ndots; tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: if strcmp(options.do_phase_alignment,'maximum_envelope') tomwalters@0: % phase alignment according to Holdswoth 1988 without fine structure tomwalters@0: EarQ = 9.26449; % Glasberg and Moore Parameters tomwalters@0: minBW = 24.7; tomwalters@0: order = 4; tomwalters@0: ERB = ((cfs/EarQ).^order + minBW^order).^(1/order); tomwalters@0: b=1.019.*ERB; tomwalters@0: B=1.019*2*pi.*ERB; tomwalters@0: envelopecomptime=(order-1)./B; tomwalters@0: phasealign=-2*pi.*cfs.*envelopecomptime; tomwalters@0: phasealign=mod(phasealign,2*pi); tomwalters@0: phasealign=phasealign./(2*pi.*cfs); tomwalters@0: tomwalters@0: % first align to the envelope tomwalters@0: % introduce phase shift in each channel tomwalters@0: for ii=1:nr_chan tomwalters@0: shift=envelopecomptime(ii); tomwalters@0: intshift=round(shift*sr); tomwalters@0: dots=vals(ii,:); tomwalters@0: ndots=[dots(intshift:end) zeros(intshift-1,1)']; tomwalters@0: % vals(ii,:)=ndots/log(cfs(ii)); tomwalters@0: vals(ii,:)=ndots; tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: if strcmp(options.do_phase_alignment,'nr_cycles_freq') tomwalters@0: phase_alignment_nr_cycles=0.6796.*log(cfs)-1.3836; tomwalters@0: tomwalters@0: for ii=1:nr_chan tomwalters@0: shift=phase_alignment_nr_cycles(ii)./cfs(ii); tomwalters@0: intshift=round(shift*sr); tomwalters@0: dots=vals(ii,:); tomwalters@0: ndots=[dots(intshift:end) zeros(intshift-1,1)']; tomwalters@0: % vals(ii,:)=ndots/log(cfs(ii)); tomwalters@0: vals(ii,:)=ndots; tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: nap=setvalues(nap,vals);