0001 function flm_rec= s2let_transform_curvelet_synthesis_lmn2lm(f_cur_lmn, f_scal_lm, cur_lm, scal_l, 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
0041
0042 sz = length(scal_l(:));
0043 Lguessed = sqrt(sz);
0044
0045 p = inputParser;
0046 p.addRequired('f_cur_lmn', @iscell);
0047 p.addRequired('f_scal_lm', @isnumeric);
0048 p.addRequired('cur_lm', @iscell);
0049 p.addRequired('scal_l', @isnumeric);
0050 p.addParamValue('B', 2, @isnumeric);
0051 p.addParamValue('L', Lguessed, @isnumeric);
0052 p.addParamValue('J_min', 0, @isnumeric);
0053 p.addParamValue('Spin', 0, @isnumeric);
0054 p.addParamValue('Upsample', false, @islogical);
0055 p.addParamValue('Sampling', 'MW', @ischar);
0056 p.addParamValue('Reality', false, @islogical);
0057 p.addParamValue('SpinLowered', false, @islogical);
0058 p.addParamValue('SpinLoweredFrom', 0, @isnumeric);
0059 p.parse(f_cur_lmn, f_scal_lm, cur_lm, scal_l, varargin{:});
0060 args = p.Results;
0061
0062 J = s2let_jmax(args.L, args.B);
0063
0064
0065
0066
0067
0068 flm_rec = zeros(args.L^2,1);
0069 for j = args.J_min:J,
0070 band_limit = min([ s2let_bandlimit(j,args.J_min,args.B,args.L) args.L ]);
0071
0072 Nj = band_limit;
0073 if (args.Reality == 0)
0074 for en = -Nj+1:Nj-1,
0075 for el = max(abs(args.Spin),abs(en)):band_limit-1,
0076 ind_ln = ssht_elm2ind(el, en);
0077 psi = (cur_lm{j-args.J_min+1}(ind_ln));
0078 for m = -el:el,
0079 ind_lm = ssht_elm2ind(el, m);
0080 if (args.Upsample ~= 0)
0081 ind_lmn = so3_elmn2ind(el,m,en,args.L,Nj);
0082 else
0083 ind_lmn = so3_elmn2ind(el,m,en,band_limit,Nj);
0084 end
0085 flm_rec(ind_lm)= flm_rec(ind_lm)+ f_cur_lmn{j-args.J_min+1}(ind_lmn)* psi;
0086 end
0087 end
0088 end
0089 else
0090 for el = 0:band_limit-1,
0091 for m = -el:el,
0092 ind_lm = ssht_elm2ind(el, m);
0093
0094 ind_lnzero = ssht_elm2ind(el, 0);
0095 if (args.Upsample ~= 0)
0096 ind_lmnzero = so3_elmn2ind(el,m,0,args.L,Nj,'Reality', args.Reality);
0097 else
0098 ind_lmnzero = so3_elmn2ind(el,m,0,band_limit,Nj,'Reality', args.Reality);
0099 end
0100 psizero= cur_lm{j-args.J_min+1}(ind_lnzero);
0101 flm_rec(ind_lm)= flm_rec(ind_lm)+ f_cur_lmn{j-args.J_min+1}(ind_lmnzero)* psizero;
0102
0103 if (args.Upsample ~= 0)
0104 ind_lml = so3_elmn2ind(el,m,el,args.L,Nj,'Reality', args.Reality);
0105 ind_l_nm_l = so3_elmn2ind(el,-m,el,args.L,Nj,'Reality', args.Reality);
0106 else
0107 ind_lml = so3_elmn2ind(el,m,el,band_limit,Nj,'Reality', args.Reality);
0108 ind_l_nm_l = so3_elmn2ind(el,-m,el,band_limit,Nj,'Reality', args.Reality);
0109 end
0110 if (mod((m+el),2) == 1)
0111 sign = -1;
0112 else
0113 sign = 1;
0114 end
0115 for en = 1:Nj-1,
0116 if (el >= en)
0117
0118 ind_ln = ssht_elm2ind(el, en);
0119 psi = cur_lm{j-args.J_min+1}(ind_ln);
0120 flm_rec(ind_lm)= flm_rec(ind_lm)+ f_cur_lmn{j-args.J_min+1}(ind_lml)* psi;
0121
0122
0123 ind_l_nn = ssht_elm2ind(el, -en);
0124 npsi = cur_lm{j-args.J_min+1}(ind_l_nn);
0125 flm_rec(ind_lm)= flm_rec(ind_lm)+ sign*conj(f_cur_lmn{j-args.J_min+1}(ind_l_nm_l))* npsi;
0126 end
0127 end
0128 end
0129 end
0130 end
0131 end
0132
0133
0134
0135
0136 if (args.Upsample == 0)
0137 band_limit = min([ s2let_bandlimit(args.J_min-1, args.J_min, args.B,args.L) args.L ]);
0138 else
0139 band_limit = args.L ;
0140 end
0141 lm_ind=0;
0142 if (args.Reality == 0)
0143 for el = abs(args.Spin): band_limit-1,
0144 phi = sqrt(4.*pi/(2.*el+1))*scal_l(el^2+el+1,1);
0145 for m = -el:el,
0146 lm_ind=ssht_elm2ind(el, m);
0147 flm_rec(lm_ind) = flm_rec(lm_ind)+ f_scal_lm(lm_ind)* phi;
0148 end
0149 end
0150 else
0151 for el = 0 :band_limit-1,
0152 phi = sqrt(4.*pi/(2.*el+1))*scal_l(el^2+el+1,1);
0153 for m = -el:el,
0154 lm_ind=ssht_elm2ind(el, m);
0155 flm_rec(lm_ind) = flm_rec(lm_ind)+ f_scal_lm(lm_ind)* phi;
0156 end
0157 end
0158 end
0159
0160 end
0161
0162
0163
0164
0165
0166