📄 ifdct_wrapping.m
字号:
% A(B) = C where B and C are vectors, if % some value x repeats in B, then the % last occurrence of x is the one % corresponding to the eventual assignment. end; % Regular wedges length_wedge = floor(4*M_vert) - floor(M_vert); Y = 1:length_wedge; first_row = floor(4*M_vert)+2-ceil((length_wedge+1)/2)+... mod(length_wedge+1,2)*(quadrant-2 == mod(quadrant-2,2)); for subl = 2:(nbangles_perquad-1); l = l+1; width_wedge = wedge_endpoints(subl+1) - wedge_endpoints(subl-1) + 1; slope_wedge = ((floor(4*M_horiz)+1) - wedge_endpoints(subl))/floor(4*M_vert); left_line = round(wedge_endpoints(subl-1) + slope_wedge*(Y - 1)); [wrapped_XX, wrapped_YY] = deal(zeros(length_wedge,width_wedge)); first_col = floor(4*M_horiz)+2-ceil((width_wedge+1)/2)+... mod(width_wedge+1,2)*(quadrant-3 == mod(quadrant-3,2)); for row = Y cols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge); new_row = 1 + mod(row - first_row, length_wedge); wrapped_XX(new_row,:) = XX(row,cols); wrapped_YY(new_row,:) = YY(row,cols); end; slope_wedge_left = ((floor(4*M_horiz)+1) - wedge_midpoints(subl-1))/floor(4*M_vert); mid_line_left = wedge_midpoints(subl-1) + slope_wedge_left*(wrapped_YY - 1); coord_left = 1/2 + floor(4*M_vert)/(wedge_endpoints(subl) - wedge_endpoints(subl-1)) * ... (wrapped_XX - mid_line_left)./(floor(4*M_vert)+1 - wrapped_YY); slope_wedge_right = ((floor(4*M_horiz)+1) - wedge_midpoints(subl))/floor(4*M_vert); mid_line_right = wedge_midpoints(subl) + slope_wedge_right*(wrapped_YY - 1); coord_right = 1/2 + floor(4*M_vert)/(wedge_endpoints(subl+1) - wedge_endpoints(subl)) * ... (wrapped_XX - mid_line_right)./(floor(4*M_vert)+1 - wrapped_YY); wl_left = fdct_wrapping_window(coord_left); [wl_right,wr_right] = fdct_wrapping_window(coord_right); switch is_real case 0 wrapped_data = fftshift(fft2(ifftshift(C{j}{l})))/sqrt(prod(size(C{j}{l}))); wrapped_data = rot90(wrapped_data,(quadrant-1)); case 1 x = C{j}{l} + sqrt(-1)*C{j}{l+nbangles(j)/2}; wrapped_data = fftshift(fft2(ifftshift(x)))/sqrt(prod(size(x)))/sqrt(2); wrapped_data = rot90(wrapped_data,(quadrant-1)); end; wrapped_data = wrapped_data .* (wl_left .* wr_right); % Unwrapping data for row = Y cols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge); new_row = 1 + mod(row - first_row, length_wedge); Xj(row,cols) = Xj(row,cols) + wrapped_data(new_row,:); end; end; % for subl % Right corner wedge l = l+1; width_wedge = 4*floor(4*M_horiz) + 3 - wedge_endpoints(end) - wedge_endpoints(end-1); slope_wedge = ((floor(4*M_horiz)+1) - wedge_endpoints(end))/floor(4*M_vert); left_line = round(wedge_endpoints(end-1) + slope_wedge*(Y_corner - 1)); [wrapped_XX, wrapped_YY] = deal(zeros(length_corner_wedge,width_wedge)); first_row = floor(4*M_vert)+2-ceil((length_corner_wedge+1)/2)+... mod(length_corner_wedge+1,2)*(quadrant-2 == mod(quadrant-2,2)); first_col = floor(4*M_horiz)+2-ceil((width_wedge+1)/2)+... mod(width_wedge+1,2)*(quadrant-3 == mod(quadrant-3,2)); for row = Y_corner cols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge); admissible_cols = round(1/2*(cols+2*floor(4*M_horiz)+1-abs(cols-(2*floor(4*M_horiz)+1)))); new_row = 1 + mod(row - first_row, length_corner_wedge); wrapped_XX(new_row,:) = XX(row,admissible_cols); wrapped_YY(new_row,:) = YY(row,admissible_cols); end; YY = Y_corner'*ones(1,width_wedge); slope_wedge_left = ((floor(4*M_horiz)+1) - wedge_midpoints(end))/floor(4*M_vert); mid_line_left = wedge_midpoints(end) + slope_wedge_left*(wrapped_YY - 1); coord_left = 1/2 + floor(4*M_vert)/(wedge_endpoints(end) - wedge_endpoints(end-1)) * ... (wrapped_XX - mid_line_left)./(floor(4*M_vert)+1 - wrapped_YY); C2 = -1/(2*(floor(4*M_horiz))/(wedge_endpoints(end) - 1) - 1 + 1/(2*(floor(4*M_vert))/(first_wedge_endpoint_vert - 1) - 1)); C1 = -C2 * (2*(floor(4*M_horiz))/(wedge_endpoints(end) - 1) - 1); wrapped_XX((wrapped_XX - 1)/floor(4*M_horiz) == (wrapped_YY-1)/floor(4*M_vert)) = ... wrapped_XX((wrapped_XX - 1)/floor(4*M_horiz) == (wrapped_YY-1)/floor(4*M_vert)) - 1; coord_corner = C1 + C2 * (2-((wrapped_XX - 1)/(floor(4*M_horiz)) + (wrapped_YY - 1)/(floor(4*M_vert)))) ./ ... ((wrapped_XX - 1)/(floor(4*M_horiz)) - (wrapped_YY - 1)/(floor(4*M_vert))); wl_left = fdct_wrapping_window(coord_left); [wl_right,wr_right] = fdct_wrapping_window(coord_corner); switch is_real case 0 wrapped_data = fftshift(fft2(ifftshift(C{j}{l})))/sqrt(prod(size(C{j}{l}))); wrapped_data = rot90(wrapped_data,(quadrant-1)); case 1 x = C{j}{l} + sqrt(-1)*C{j}{l+nbangles(j)/2}; wrapped_data = fftshift(fft2(ifftshift(x)))/sqrt(prod(size(x)))/sqrt(2); wrapped_data = rot90(wrapped_data,(quadrant-1)); end; wrapped_data = wrapped_data .* (wl_left .* wr_right); % Unwrapping data for row = Y_corner cols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge); admissible_cols = round(1/2*(cols+2*floor(4*M_horiz)+1-abs(cols-(2*floor(4*M_horiz)+1)))); new_row = 1 + mod(row - first_row, length_corner_wedge); Xj(row,fliplr(admissible_cols)) = Xj(row,fliplr(admissible_cols)) + wrapped_data(new_row,end:-1:1); % We use the following property: in an assignment % A(B) = C where B and C are vectors, if % some value x repeats in B, then the % last occurrence of x is the one % corresponding to the eventual assignment. end; Xj = rot90(Xj); end; % for quadrant Xj = Xj .* lowpass; Xj_index1 = ((-floor(2*M1)):floor(2*M1)) + floor(4*M1) + 1; Xj_index2 = ((-floor(2*M2)):floor(2*M2)) + floor(4*M2) + 1; Xj(Xj_index1, Xj_index2) = Xj(Xj_index1, Xj_index2) .* hipass; loc_1 = Xj_topleft_1 + (0:(2*floor(4*M1))); loc_2 = Xj_topleft_2 + (0:(2*floor(4*M2))); X(loc_1,loc_2) = X(loc_1,loc_2) + Xj; % Preparing for loop reentry or exit Xj_topleft_1 = Xj_topleft_1 + floor(4*M1) - floor(2*M1); Xj_topleft_2 = Xj_topleft_2 + floor(4*M2) - floor(2*M2); lowpass = lowpass_next; end; % for jif is_real Y = X; X = rot90(X,2); X = X + conj(Y);end % Coarsest wavelet levelM1 = M1/2;M2 = M2/2;Xj = fftshift(fft2(ifftshift(C{1}{1})))/sqrt(prod(size(C{1}{1})));loc_1 = Xj_topleft_1 + (0:(2*floor(4*M1)));loc_2 = Xj_topleft_2 + (0:(2*floor(4*M2)));X(loc_1,loc_2) = X(loc_1,loc_2) + Xj .* lowpass;% Finest levelM1 = N1/3;M2 = N2/3;if finest == 1, % Folding back onto N1-by-N2 matrix shift_1 = floor(2*M1)-floor(N1/2); shift_2 = floor(2*M2)-floor(N2/2); Y = X(:,(1:N2)+shift_2); Y(:,N2-shift_2+(1:shift_2)) = Y(:,N2-shift_2+(1:shift_2)) + X(:,1:shift_2); Y(:,1:shift_2) = Y(:,1:shift_2) + X(:,N2+shift_2+(1:shift_2)); X = Y((1:N1)+shift_1,:); X(N1-shift_1+(1:shift_1),:) = X(N1-shift_1+(1:shift_1),:) + Y(1:shift_1,:); X(1:shift_1,:) = X(1:shift_1,:) + Y(N1+shift_1+(1:shift_1),:); else % Extension to a N1-by-N2 matrix Y = fftshift(fft2(ifftshift(C{nbscales}{1})))/sqrt(prod(size(C{nbscales}{1}))); X_topleft_1 = ceil((N1+1)/2) - floor(M1); X_topleft_2 = ceil((N2+1)/2) - floor(M2); loc_1 = X_topleft_1 + (0:(2*floor(M1))); loc_2 = X_topleft_2 + (0:(2*floor(M2))); Y(loc_1,loc_2) = Y(loc_1,loc_2) .* hipass_finest + X; X = Y; end;x = fftshift(ifft2(ifftshift(X)))*sqrt(prod(size(X)));if is_real, x = real(x); end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -