-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathavgspec.m
52 lines (34 loc) · 1.04 KB
/
avgspec.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%--------------------------------------------------------------------
% Average Multitaper spectrum, with eigenvalue weights
%--------------------------------------------------------------------
function [spec,se,wt] = avgspec(nfft,nf,kspec,lambda,yk,sk);
%
% Function to calculate the adaptive multitaper spectrum, using
% only the eigenvalues of the DPSS
%
% Initialize some variables
df = 1./(nfft-1); % Assume unit sampling
if (nfft == nf) % Complex multitaper
varsk = sum(sk,1)*df;
else
varsk = (sk(1,:) + sk(nf,:) + 2.*sum(sk(2:nf-1,:),1) ) * df;
end
dvar = sum(varsk)/(kspec);
evalu = lambda;
evalu1 = 1.-lambda;
bk = dvar * evalu1;
sqev = sqrt(evalu);
% Iterative procedure
for k = 1:kspec
wt(k) = lambda(k);
wt(k) = min(wt(k),1.0);
skw(:,k) = wt(k).^2 .* sk(:,k);
end
sbar = sum(skw,2) ./ sum(wt.^2);
spec = sbar;
for i = 1:nf
wt_dofs(i,:) = wt(:)./sqrt(sum(wt(:).^2)/kspec);
end
wt_dofs = min(wt_dofs,1.0);
se = 2.0 * sum(wt_dofs.^2, 2);
return