0001 function flm_rec = s2let_transform_curvelet_synthesis_cur2lm(f_cur, f_scal, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 len = size(f_cur);
0041 temp = f_cur{len};
0042 sz = size(temp);
0043 Lguessed = sz(2);
0044
0045 p = inputParser;
0046 p.addRequired('f_cur');
0047 p.addRequired('f_scal', @isnumeric);
0048 p.addParamValue('B', 2, @isnumeric);
0049 p.addParamValue('L', Lguessed, @isnumeric);
0050 p.addParamValue('J_min', 0, @isnumeric);
0051 p.addParamValue('Spin', 0, @isnumeric);
0052 p.addParamValue('Upsample', false, @islogical);
0053 p.addParamValue('Reality', false, @islogical);
0054 p.addParamValue('SpinLowered', false, @islogical);
0055 p.addParamValue('SpinLoweredFrom', 0, @isnumeric);
0056 p.addParamValue('Sampling', 'MW', @ischar);
0057 p.parse(f_cur, f_scal, varargin{:});
0058 args = p.Results;
0059
0060 J = s2let_jmax(args.L, args.B);
0061
0062
0063
0064
0065
0066 [cur_lm scal_l] = s2let_curvelet_tiling(args.B, args.L, args.J_min,...
0067 'Spin', args.Spin,...
0068 'SpinLowered', args.SpinLowered, ...
0069 'SpinLoweredFrom', args.SpinLoweredFrom);
0070
0071
0072
0073
0074
0075 if (args.Upsample == 0)
0076 band_limit = min([ s2let_bandlimit(args.J_min-1,args.J_min,args.B,args.L) args.L ]);
0077 else
0078 band_limit = args.L ;
0079 end
0080 f_scal_lm_syn = ssht_forward(f_scal, band_limit, ...
0081 'Method', args.Sampling,...
0082 'Spin', 0, ...
0083 'Reality', args.Reality);
0084
0085
0086 for j = args.J_min:J,
0087 band_limit = min([ s2let_bandlimit(j,args.J_min,args.B,args.L) args.L ]);
0088
0089 Nj = band_limit;
0090 if (args.Upsample == 0)
0091 f_cur_lmn_syn{j-args.J_min+1} = so3_forward_direct(f_cur{j-args.J_min+1} , band_limit, Nj, ...
0092 'Reality', args.Reality, 'Sampling', args.Sampling);
0093 else
0094 f_cur_lmn_syn{j-args.J_min+1} = so3_forward_direct(f_cur{j-args.J_min+1} , args.L, Nj, ...
0095 'Reality', args.Reality, 'Sampling', args.Sampling);
0096 end
0097 end
0098
0099
0100
0101
0102
0103
0104
0105
0106 alpha = pi ;
0107 gamma = 0 ;
0108
0109 for j = args.J_min:J,
0110 band_limit = min([ s2let_bandlimit(j,args.J_min,args.B,args.L) args.L ]);
0111 Nj = band_limit;
0112
0113
0114
0115
0116
0117
0118 if (args.Upsample ~= 0)
0119 beta = pi-acos(-args.Spin/args.B^j);
0120 d = zeros(args.L, 2*args.L-1, 2*args.L-1);
0121 d(1,:,:) = ssht_dl(squeeze(d(1,:,:)), args.L, 0, beta);
0122 for el = 1:args.L-1
0123 d(el+1,:,:) = ssht_dl(squeeze(d(el,:,:)), args.L, el, beta);
0124 end
0125 else
0126 beta = pi-acos(-args.Spin/args.B^j);
0127 d = zeros(band_limit, 2*band_limit-1, 2*band_limit-1);
0128 d(1,:,:) = ssht_dl(squeeze(d(1,:,:)), band_limit, 0, beta);
0129 for el = 1:band_limit-1
0130 d(el+1,:,:) = ssht_dl(squeeze(d(el,:,:)), band_limit, el, beta);
0131 end
0132 end
0133
0134 if (args.Reality == 0)
0135 if (args.Upsample ~= 0)
0136 f_cur_lmn_syn_rotated{j-args.J_min+1} = zeros((2*Nj-1)*args.L^2,1);
0137 else
0138 f_cur_lmn_syn_rotated{j-args.J_min+1} = zeros((2*Nj-1)*band_limit^2,1);
0139 end
0140 for el = abs(args.Spin):(band_limit-1)
0141 for m = -el:el
0142 if (args.Upsample == 0)
0143 ind_lml = so3_elmn2ind(el,m,el,band_limit,Nj);
0144 ind_lmnl = so3_elmn2ind(el,m,-el,band_limit,Nj);
0145 else
0146 ind_lml = so3_elmn2ind(el,m,el,args.L,Nj);
0147 ind_lmnl = so3_elmn2ind(el,m,-el,args.L,Nj);
0148 end
0149 en_max = min(el, Nj-1);
0150 for en = -en_max:en_max
0151
0152 if (args.Upsample ~= 0)
0153 Dlln = exp(-1i*el*alpha) * d(el+1,el+args.L,en+args.L) * exp(-1i*en*gamma);
0154 Dl_nl_n = exp(-1i*-el*alpha) * d(el+1,-el+args.L,en+args.L) * exp(-1i*en*gamma);
0155 ind_lmn = so3_elmn2ind(el,m,en,args.L,Nj);
0156 else
0157 Dlln = exp(-1i*el*alpha) * d(el+1,el+band_limit,en+band_limit) * exp(-1i*en*gamma);
0158 Dl_nl_n = exp(-1i*-el*alpha) * d(el+1,-el+band_limit,en+band_limit) * exp(-1i*en*gamma);
0159 ind_lmn = so3_elmn2ind(el,m,en,band_limit,Nj);
0160 end
0161 f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lml)= f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lml)+ ...
0162 conj(Dlln) * f_cur_lmn_syn{j-args.J_min+1}(ind_lmn);
0163 f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lmnl)= f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lmnl) + ...
0164 conj(Dl_nl_n) * f_cur_lmn_syn{j-args.J_min+1}(ind_lmn);
0165 end
0166 end
0167 end
0168 else
0169 if (args.Upsample ~= 0)
0170 f_cur_lmn_syn_rotated{j-args.J_min+1} = zeros(Nj*args.L^2,1);
0171 else
0172 f_cur_lmn_syn_rotated{j-args.J_min+1} = zeros(Nj*band_limit^2,1);
0173 end
0174 for el = 0:(band_limit-1)
0175 for m = -el:el
0176
0177 if (args.Upsample == 0)
0178 ind_lml = so3_elmn2ind(el,m,el,band_limit,Nj, 'Reality', args.Reality);
0179 ind_lmnzero = so3_elmn2ind(el,m,0,band_limit,Nj, 'Reality', args.Reality);
0180 Dl_l_nzero = exp(-1i*el*alpha) * d(el+1,el+band_limit,0+band_limit) * exp(-1i*0*gamma);
0181 else
0182 ind_lml = so3_elmn2ind(el,m,el,args.L,Nj, 'Reality', args.Reality);
0183 ind_lmnzero = so3_elmn2ind(el,m,0,args.L,Nj, 'Reality', args.Reality);
0184 Dl_l_nzero = exp(-1i*el*alpha) * d(el+1,el+args.L,0+args.L) * exp(-1i*0*gamma);
0185 end
0186 f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lml)= conj(Dl_l_nzero)*f_cur_lmn_syn{j-args.J_min+1}(ind_lmnzero);
0187
0188 en_max = min(el, Nj-1);
0189 for en = 1:en_max
0190 if (args.Upsample ~= 0)
0191 Dl_l_n = exp(-1i*el*alpha) * d(el+1,el+args.L,en+args.L) * exp(-1i*en*gamma);
0192 Dl_l_nn = exp(-1i*el*alpha) * d(el+1,el+args.L,-en+args.L) * exp(-1i*-en*gamma);
0193 ind_lmn = so3_elmn2ind(el,m,en,args.L,Nj, 'Reality', args.Reality);
0194 ind_l_nm_n = so3_elmn2ind(el,-m,en,args.L,Nj, 'Reality', args.Reality);
0195 else
0196 Dl_l_n = exp(-1i*el*alpha) * d(el+1,el+band_limit,en+band_limit) * exp(-1i*en*gamma);
0197 Dl_l_nn = exp(-1i*el*alpha) * d(el+1,el+band_limit,-en+band_limit) * exp(-1i*-en*gamma);
0198 ind_lmn = so3_elmn2ind(el,m,en,band_limit,Nj, 'Reality', args.Reality);
0199 ind_l_nm_n = so3_elmn2ind(el,-m,en,band_limit,Nj, 'Reality', args.Reality);
0200 end
0201 if (mod((m+en),2) == 1)
0202 sign = -1;
0203 else
0204 sign = 1;
0205 end
0206 f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lml)= f_cur_lmn_syn_rotated{j-args.J_min+1}(ind_lml)+ ...
0207 conj(Dl_l_n) * f_cur_lmn_syn{j-args.J_min+1}(ind_lmn)+ ...
0208 sign*conj(Dl_l_nn)*conj(f_cur_lmn_syn{j-args.J_min+1}(ind_l_nm_n));
0209 end
0210 end
0211 end
0212 end
0213 end
0214
0215
0216 flm_rec = s2let_transform_curvelet_synthesis_lmn2lm(f_cur_lmn_syn_rotated, f_scal_lm_syn, cur_lm, scal_l,...
0217 'B', args.B, 'L', args.L, ...
0218 'Spin', args.Spin, ...
0219 'J_min', args.J_min, ...
0220 'Upsample', args.Upsample,...
0221 'Reality', args.Reality,...
0222 'SpinLowered', args.SpinLowered, ...
0223 'SpinLoweredFrom', args.SpinLoweredFrom,...
0224 'Sampling', args.Sampling );
0225
0226 cur_lm = 0;
0227 scal_l = 0;
0228 f_cur_lmn_syn =0;
0229 f_scal_lm_syn =0;
0230 f_cur_lmn_syn_rotated =0;
0231 end