vec_coherence.m
author A.M. Thurnherr <athurnherr@yahoo.com>
Thu, 21 Nov 2013 11:23:53 +0000
changeset 9 79a432124b57
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
%======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
%                    V E C _ C O H E R E N C E . M 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
%                    doc: Wed Aug  8 09:01:59 2012
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
%                    dlm: Wed Aug  8 10:19:53 2012
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
%                    (c) 2012 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
%                    uE-Info: 58 27 NIL 0 0 72 10 2 4 NIL ofnI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
%======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
% calculate coherence between two 2-D vector time-series or profiles
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
%	- time or space is coded in 1st vector dimension
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
%	- code based on [ladcp_cohere.m] by X. Liang
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
%	- XL had hard-coded nsegs=4
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
function coh = vec_coherence(v1,v2,nsegs,conf)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
valid = find(isfinite(v1(:,2)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
v1 = v1(find(isfinite(v1(:,2))),:);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
v2 = v2(find(isfinite(v2(:,2))),:);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
rez1 = median(diff(v1(:,1)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
rez2 = median(diff(v2(:,1)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
if (rez1 ~= rez2)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
	error('incompatible vector resolutions');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
end
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
first = max(min(v1(:,1)),min(v2(:,1)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
last  = min(max(v1(:,1)),max(v2(:,1)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
cv1 = v1(find(v1(:,1)>=first&v1(:,1)<=last),2) + sqrt(-1)*v1(find(v1(:,1)>=first&v1(:,1)<=last),3);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
cv2 = v2(find(v2(:,1)>=first&v2(:,1)<=last),2) + sqrt(-1)*v2(find(v2(:,1)>=first&v2(:,1)<=last),3);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
if (length(cv1) ~= length(cv2))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
	error('incompatible vectors');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
end
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
NFFT = floor(length(cv1)/nsegs) ;						% segment data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
freq = -1/(2*rez1):1/((NFFT-1)*rez1):1/(2*rez1);		% spectral frequencies
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
coh.conf = conf;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
coh.clim = sqrt(1-(1-conf)^(1/(nsegs-1)));				% Confidence limit (Data analysis methods in physical oceanography, p488)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
s1 = fftshift(fft(cv1,NFFT));							% power spectra
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
s2 = fftshift(fft(cv2,NFFT));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
s12 = conj(s1).*s2;  %Inner-cross spectrum				% cross spectra
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
s21 = fliplr(s1).*s2; %outer-cross spectrum
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
s11 = abs(s1).^2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
s22 = abs(s2).^2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
for i = 1:NFFT/nsegs									% frequency-average spectra
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
	as12(i) = mean(s12((i-1)*nsegs+1:i*nsegs));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
	as21(i) = mean(s21((i-1)*nsegs+1:i*nsegs));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
	as11(i) = mean(s11((i-1)*nsegs+1:i*nsegs));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
	as22(i) = mean(s22((i-1)*nsegs+1:i*nsegs));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
	coh.freq(i) = mean(freq((i-1)*nsegs+1:i*nsegs));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
end
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
coh.period = 1 ./ coh.freq;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
coh.mag   = sqrt(abs(as12).^2./(as11.*as22));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
coh.phase = atan2(-imag(as12),real(as12))*(180/pi);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
figure
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
subplot(211)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
plot(coh.freq,coh.mag)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
hold on
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
line([coh.freq(1) coh.freq(end)],[coh.clim coh.clim],'color','r')
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
xlim([coh.freq(1) coh.freq(end)])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
xlabel('Frequency/Wavenumber [cycles/unit]')
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
ylabel('Inner Rotary Coherence')
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
grid on
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
text(coh.freq(fix(0.8*length(coh.freq))), coh.clim+0.05, sprintf('%d%%',100*coh.conf));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
subplot(212)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
plot(coh.freq,coh.phase)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
xlim([coh.freq(1) coh.freq(end)])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
ylim([-180 180])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
xlabel('Frequency/Wavenumber [cycles/unit]')
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
ylabel('Phase angle [deg]')
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
grid on
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80