uw_stat_costs.m
来自「StaMps最新测试版」· M 代码 · 共 246 行
M
246 行
function []=uw_stat_costs(unwrap_method,subset_ifg_index);%UW_STAT_COSTS Find unwrapped solutions using MAP cost functions%% Andy Hooper May 2007%% ======================================================================% 03/2008 AH: 2D unwrapping option added% ======================================================================ticif nargin<1 unwrap_method='3D';endcostscale=100;nshortcycle=200;maxshort=32000;fprintf('Unwrapping in space...\n')uw=load('uw_grid');ui=load('uw_interp');ut=load('uw_space_time');if nargin<2 subset_ifg_index=[1:size(uw.ph,2)];end[nrow,ncol]=size(uw.nzix);[y,x]=find(uw.nzix);nzix=find(uw.nzix);z=[1:uw.n_ps]; colix=ui.colix;rowix=ui.rowix;Z=ui.Z;grid_edges=[colix(abs(colix)>0);rowix(abs(rowix)>0)];n_edges=hist(abs(grid_edges),[1:ui.n_edge])';if strcmpi(unwrap_method,'2D') sigsq_defo=0; dph_smooth=zeros(size(ut.dph_space));%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% n_win=32; n_fft=ceil(n_win*1.25); clap_alpha=1; clap_beta=0.3; clap_low_pass_wavelength=800; freq0=1/clap_low_pass_wavelength; freq_i=-(n_fft)/uw.pix_size/n_fft/2:1/uw.pix_size/n_fft:(n_fft-2)/uw.pix_size/n_fft/2; butter_i=1./(1+(freq_i/freq0).^(2*5)); low_pass=butter_i'*butter_i; low_pass=fftshift(low_pass); i1=zeros(uw.n_ps,1); i2=i1; j1=i1; j2=i1; ps_bit_i=i1; ps_bit_j=i1; [ps_i,ps_j]=find(uw.nzix); % coords of non-zero grid phase values for i=1:uw.n_ps i_min=max(ps_i(i)-n_win/2+1,1); i_max=min(ps_i(i)+n_win/2,uw.n_i); j_min=max(ps_j(i)-n_win/2+1,1); j_max=min(ps_j(i)+n_win/2,uw.n_j); i1(i)=i_min; i2(i)=i_max; j1(i)=j_min; j2(i)=j_max; ps_bit_i(i)=ps_i(i)-i_min+1; ps_bit_j(i)=ps_j(i)-j_min+1; end ifgw_filt=zeros([nrow,ncol,uw.n_ifg],'single'); ph_var=zeros(uw.n_ps,uw.n_ifg); ifgw=zeros(nrow,ncol,'single'); x=[0:n_win/2-1]; [X,Y]=meshgrid(x,x); X=X+Y; weight_func=[X,fliplr(X)]; weight_func=[weight_func;flipud(weight_func)]; % pyramidal weighting func hw=floor(n_win/2)+1; % half window plus 1 sa=1; % discontinuity search area in pixels either side for i_ifg=1:uw.n_ifg ifgw(uw.nzix)=uw.ph(:,i_ifg); for i=1:uw.n_ps ph_fft=zeros(n_fft,'single'); ph_bit=ifgw(i1(i):i2(i),j1(i):j2(i)); ph_fft(1:i2(i)-i1(i)+1,1:j2(i)-j1(i)+1)=ph_bit; nz_ix=ph_fft~=0; nz_bit_ix=ph_bit~=0; n_nz=sum(nz_ix(:)); if n_nz<=7 ph_var(i,i_ifg)=nan; else ph_filt=clap_filt_patch(ph_fft,clap_alpha,clap_beta,low_pass); ph_filt_bit=ph_filt(1:i2(i)-i1(i)+1,1:j2(i)-j1(i)+1); wf=weight_func(hw-ps_bit_i(i):i2(i)-i1(i)+hw-ps_bit_i(i),hw-ps_bit_j(i):j2(i)-j1(i)+hw-ps_bit_j(i)); % in case window not full size ph_var(i,i_ifg)=sum(angle(ph_filt(nz_ix).*conj(ph_fft(nz_ix))).^2.*wf(nz_bit_ix))/sum(wf(nz_bit_ix))*n_nz/(n_nz-7); % assume 21 degrees of freedom ifgw_filt(i1(i):i2(i),j1(i):j2(i),i_ifg)=ifgw_filt(i1(i):i2(i),j1(i):j2(i),i_ifg)+ph_filt_bit.*wf; end end ifgw_hp=angle(ifgw.*conj(ifgw_filt(:,:,i_ifg))); ifgw_hp_nz=ifgw_hp(uw.nzix); ifgw_hp=reshape(ifgw_hp_nz(Z,i_ifg),nrow,ncol); ifgw_hp(ifgw_hp>0)=1; ifgw_hp(ifgw_hp<0)=-1; col_disc=edge(angle(ifgw_hp),'sobel',0.8,'vertical'); col_disc(:,1:end-1)=col_disc(:,2:end); row_disc=edge(angle(ifgw_hp),'sobel',0.8,'horizontal'); row_disc(1:end-1,:)=row_disc(2:end,:); poss_disc=edge(angle(ifgw_hp),'canny',[0.2],0.4); fprintf('Stats for IFG %d of %d estimated\n',i_ifg,uw.n_ifg) end sigsq_noise=zeros(ui.n_edge,uw.n_ifg); ps_ij=[ps_i,ps_j]; for i=1:ui.n_edge ij1=ps_ij(ui.edges(i,2),:); ij2=ps_ij(ui.edges(i,3),:); i1=min([ij1(1),ij2(1)]); i2=max([ij1(1),ij2(1)]); j1=min([ij1(2),ij2(2)]); j2=max([ij1(2),ij2(2)]); ph_int_i=squeeze(sum(angle(ifgw_filt(i1+1:i2,j1,:).*conj(ifgw_filt(i1:i2-1,j1,:))),1)); ph_int_j=squeeze(sum(angle(ifgw_filt(i2,j1+1:j2,:).*conj(ifgw_filt(i2,j1:j2-1,:))),2)); if ij1(1)<ij2(1) ph_int=ph_int_i; else ph_int=-ph_int_i; end if ij1(2)<ij2(2) dph_smooth(i,:)=(ph_int+ph_int_j).'; else dph_smooth(i,:)=(ph_int-ph_int_j).'; end sigsq_noise(i,:)=(ph_var(ui.edges(i,2),:)+ph_var(ui.edges(i,3),:)/4/pi/pi); if round(i/100000)==i/100000 | i==ui.n_edge fprintf('Stats for %d of %d edges estimated\n',i,ui.n_edge) end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%else % 3D sigsq_noise=(std(ut.dph_noise,0,2)/2/pi).^2; sigsq_defo=(std(ut.dph_space_uw-ut.dph_noise,0,2)/2/pi).^2; dph_smooth=ut.dph_space_uw-ut.dph_noise; nostats_ix=find(isnan(sigsq_noise))'; %noise set to nans in uw_sb_unwrap_time for i=nostats_ix rowix(abs(rowix)==i)=nan; colix(abs(colix)==i)=nan; end sigsq=int16(round(((sigsq_noise+sigsq_defo)*nshortcycle^2)/costscale.*n_edges)); % weight by number of occurences sigsq(sigsq<1)=1; % zero causes snaphu to crash rowcost=zeros((nrow-1),ncol*4,'int16'); colcost=zeros((nrow),(ncol-1)*4,'int16'); nzrowix=abs(rowix)>0; % 0 = same node, NaN = no stats stdgrid=ones(size(rowix),'int16'); stdgrid(nzrowix)= sigsq(abs(rowix(nzrowix))); rowcost(:,2:4:end)= stdgrid; % sigsq nzcolix=abs(colix)>0; stdgrid=ones(size(colix),'int16'); stdgrid(nzcolix)= sigsq(abs(colix(nzcolix))); colcost(:,2:4:end)= stdgrid; % sigsq rowcost(:,3:4:end)= maxshort;% dzmax - value at which cost soars proportional to square of value exceeding dzmax colcost(:,3:4:end)= maxshort; % dzmax stats_ix=~isnan(rowix); rowcost(:,4:4:end)= int16(stats_ix)*(-1-maxshort)+1; % laycost, -32000 signifies no cost shelf stats_ix=~isnan(colix); colcost(:,4:4:end)= int16(stats_ix)*(-1-maxshort)+1;endph_uw=zeros(uw.n_ps,uw.n_ifg,'single');ifguw=zeros(nrow,ncol);for i1=subset_ifg_index fprintf('\nProcessing IFG %d of %d\n',i1,length(subset_ifg_index)); if strcmpi(unwrap_method,'2D') nostats_ix=find(isnan(sigsq_noise(:,i1)))'; %noise set to nans in uw_sb_unwrap_time for i=nostats_ix rowix(abs(rowix)==i)=nan; colix(abs(colix)==i)=nan; end sigsq=((sigsq_noise(:,i1))*nshortcycle^2)/costscale; % don't weight by number of occurences sigsq=int16(round(sigsq)); rowcost=zeros((nrow-1),ncol*4,'int16'); colcost=zeros((nrow),(ncol-1)*4,'int16'); nzrowix=abs(rowix)>0; % 0 = same node, NaN = no stats w_disc=0.5; stdgrid=ones(size(rowix),'int16'); stdgrid(nzrowix)= sigsq(abs(rowix(nzrowix))); stdgrid=stdgrid+int16(row_disc(1:end-1,:)*nshortcycle^2*w_disc/costscale); rowcost(:,2:4:end)= stdgrid; % sigsq nzcolix=abs(colix)>0; stdgrid=ones(size(colix),'int16'); stdgrid(nzcolix)= sigsq(abs(colix(nzcolix))); stdgrid=stdgrid+int16(col_disc(:,1:end-1)*nshortcycle^2*w_disc/costscale); colcost(:,2:4:end)= stdgrid; % sigsq rowcost(:,3:4:end)= maxshort;% dzmax - value at which cost soars proportional to square of value exceeding dzmax colcost(:,3:4:end)= maxshort; % dzmax stats_ix=~isnan(rowix); rowcost(:,4:4:end)= int16(stats_ix)*(-1-maxshort)+1; % laycost, -32000 signifies no cost shelf stats_ix=~isnan(colix); colcost(:,4:4:end)= int16(stats_ix)*(-1-maxshort)+1; end offset_cycle=(angle(ut.dph_space(:,i1))-dph_smooth(:,i1))/2/pi; offgrid=zeros(size(rowix),'int16'); offgrid(nzrowix)=round(offset_cycle(abs(rowix(nzrowix))).*sign(rowix(nzrowix))*nshortcycle); rowcost(:,1:4:end)= -offgrid; % offset offgrid=zeros(size(colix),'int16'); offgrid(nzcolix)=round(offset_cycle(abs(colix(nzcolix))).*sign(colix(nzcolix))*nshortcycle); colcost(:,1:4:end)= offgrid; % offset fid=fopen('snaphu.costinfile','w'); fwrite(fid,rowcost','int16'); fwrite(fid,colcost','int16'); fclose(fid); ifgw=reshape(uw.ph(Z,i1),nrow,ncol); writecpx('snaphu.in',ifgw) cmdstr=['!snaphu -d -f $STAMPS/snaphu.conf ',num2str(ncol),' >> snaphu.log']; eval(cmdstr) fid=fopen('snaphu.out'); ifguw=fread(fid,[ncol,inf],'float'); fclose(fid); ifguw=ifguw'; ph_uw(:,i1)=ifguw(uw.nzix);endsave('uw_phaseuw','ph_uw')
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?