/
sdwtarget.m
133 lines (116 loc) · 3.63 KB
/
sdwtarget.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
function varargout=sdwtarget(co,TH,L,m,degres,SNm)
% [r,lon,lat,N,Nm,V,C]=SDWTARGET(co,TH,L,m,degres,SNm)
%
% Targets a region with a set of SINGLE-ORDER Slepian tapers
%
% INPUT
%
% co [lon lat] coordinates of the center [degrees]
% TH Radius of the window [degrees]
% L Spherical-harmonic bandwidth of the window
% m Angular order of the window, -L<=m<=L
% degres The degree resolution of the output field [default 1]
% SNm The number of tapers you require [defaulted]
%
% OUTPUT:
%
% r A spatial field with the taper right where you want it
% in a matrix where the third dimension is the taper number
% lon The longitudes at which r is evaluated, in degrees
% lat The latitudes at which r is evaluated, in degrees
% N The full Shannon number for this problem
% Nm The partial Shannon number for this problem
% V The calculated eigenvalues belonging to this set of tapers
% C The spherical harmonic coefficients of the polar windows
%
% EXAMPLE:
%
% sdwtarget('demo1')
%
% SEE ALSO:
%
% PTOSLEP, PLM2ROT
%
% Last modified by fjsimons-at-alum.mit.edu, 11/19/2010
if ~isstr(co)
defval('co',[0 0])
defval('TH',20)
defval('L',18)
defval('m',0)
defval('degres',1)
if m>L
error('Order cannot exceed degree')
end
% Calculate the taper coefficients centered on the pole
[E,Vg,th,C,T,V]=grunbaum(TH,L,m,0);
% Calculate the full Shannon number
N=(L+1)^2*(1-cos(TH/180*pi))/2;
% Calculate the asymptotic partial Shannon number
[Nm,Nsum]=nsubm(N,L,1,L);
% Supply a default number of required tapers
defval('SNm',round(Nm(abs(m)+1)))
% This is for the output only
Nm=Nm(abs(m)+1);
% Make a blank array of indices and coefficients
[em,el,mzero]=addmon(L);
Cb=[el em repmat(0,length(em),2)];
if SNm>0
% Make a blank window array
r=repmat(NaN,[180/degres+1 360/degres+1 SNm]);
% Find the appropriate rotation angles, see PLM2ROT
alpa=0; % Around z axis
% sign flip 03/11/2010
bita=co(2)-90; % To a desired colatitude
% sign flip 03/11/2010
gama=-co(1); % To a desired longitude
% which is identical to bita=90-co(2) and gama=180-co(1)
% Do the following for every taper
for index=1:SNm
% Put the zonal coefficients in the right place
Cb(mzero(abs(m)+1:end)+abs(m),3+(m<0))=C(:,index);
% Rotate the tapers to a position on the sphere
Cr=plm2rot(Cb,alpa,bita,gama);
% Calculate the spatial functions
[r(:,:,index),lon,lat]=plm2xyz(Cr,degres);
% Adjust the sign
if max(max(abs(r(:,:,index))))==abs(min(min(r(:,:,index))))
r(:,:,index)=-r(:,:,index);
end
end
else
warning('You are getting nothing because your Shannon number is too low')
[r,lon,lat]=deal([]);
end
% Output
varn={r,lon,lat,N,Nm,V,C};
varargout=varn(1:nargout);
elseif strcmp(co,'demo1')
% Specify the centers
col=round(rand*180);
lon=round(rand*360);
% Specify the other parameters
TH=20;
L=round(36*rand(1));
m=round(L*rand(1));
r=sdwtarget([lon 90-col],20,L,m,1,4);
% Calculate window location
[lon2,lat2]=caploc([lon 90-col],TH);
clf
[ah,ha,H]=krijetem(subnum(2,2));
for index=1:4
axes(ah(index))
imagef([],[],r(:,:,index)); axis image
set(gca,'xtick',[0 lon 360],'xtickl',[0 lon 360])
set(gca,'ytick',[-90 90-col 90],'ytickl',[-90 90-col 90])
hold on
plot(lon2,lat2,'k-')
end
movev(ah(1:2),-0.025)
longticks(ah)
set(ah,'xgrid','on','ygrid','on')
serre(H',[],'down')
supertit(ah(1:2),sprintf('L = %i ; m = %i ; lon= %i; lat= %i',...
L,m,lon,90-col));
fig2print(gcf,'landscape')
figdisp
end