ps_scn_filt.m

来自「StaMps最新测试版」· M 代码 · 共 195 行

M
195
字号
function []=ps_scn_filt()%PS_SCN_FILT estimate spatially correlated noise in unwrapped phase%%   Andy Hooper, June 2006%%   =======================================================================%   11/2006 AH: Error corrected that was leaving master in temporal smoothing%   04/2007 AH: Added 64-bit machine compatibility%   05/2007 AH: Spatially correlated look angle error added  %   =======================================================================fprintf('Estimating other spatially-correlated noise...\n')pix_size=getparm('unwrap_grid_size',1);time_win=getparm('scn_time_win',1);deramp_ifg=getparm('scn_deramp_ifg',1);scn_wavelength=getparm('scn_wavelength',1);unwrap_ifg_index=getparm('unwrap_ifg_index',1);small_baseline_flag=getparm('small_baseline_flag',1);load psverpsname=['ps',num2str(psver)];phuwname=['phuw',num2str(psver)];sclaname=['scla',num2str(psver)];apsname=['aps',num2str(psver)];scnname=['scn',num2str(psver)]; % spatially-correlated noiseps=load(psname);uw=load(phuwname);%aps=load(apsname);if strcmpi(small_baseline_flag,'y')    unwrap_ifg_index=[1:ps.n_image];elseif strcmp(unwrap_ifg_index,'all')    unwrap_ifg_index=[1:ps.n_ifg];endday=ps.day(unwrap_ifg_index);master_ix=sum(ps.master_day>day)+1;n_ifg=length(unwrap_ifg_index);n_ps=ps.n_ps;ph_all=single(uw.ph_uw(:,unwrap_ifg_index));if exist([sclaname,'.mat'],'file')    scla=load(sclaname);    ph_all=ph_all-single(scla.ph_scla(:,unwrap_ifg_index));    ph_all=ph_all-repmat(single(scla.C_ps_uw),1,length(unwrap_ifg_index));end%ph_all=ph_all-aps.ph_aps_slave(:,unwrap_ifg_index);ph_all(isnan(ph_all))=0;  disp(sprintf('   Number of points per ifg: %d',n_ps))nodename=['scnfilt.1.node'];fid=fopen(nodename,'w');fprintf(fid,'%d 2 0 0\n',n_ps);for i=1:n_ps    fprintf(fid,'%d %f %f\n',i,ps.xy(i,2),ps.xy(i,3));endfclose(fid);!triangle -e scnfilt.1.nodefid=fopen('scnfilt.2.edge','r');header=str2num(fgetl(fid));N=header(1);edges_nz=zeros(N,4);for i=1:N    edges_nz(i,:)=str2num(fgetl(fid));endfclose(fid);%%% deramp end ifgs (unlike aps, orbit errors not so random and end%%% orbit errors can pass through the low-pass filterderamp_ifg=intersect(deramp_ifg,unwrap_ifg_index);deramp_ix=zeros(size(deramp_ifg));ph_ramp=zeros(n_ps,length(deramp_ifg));if ~isempty(deramp_ifg)    fprintf('   deramping selected ifgs...\n')    G=double([ones(n_ps,1),ps.xy(:,2),ps.xy(:,3)]);    %G=double([ones(n_ps,1),ps.xy(:,2)]); % range only    for i=1:length(deramp_ifg)        i3=find(unwrap_ifg_index==deramp_ifg(i))        deramp_ix(i)=i3;        d=(ph_all(:,i3));        m=G\double(d(:));        ph_this_ramp=G*m;        ph_all(:,i3)=ph_all(:,i3)-ph_this_ramp; % subtract ramp        ph_ramp(:,i)=ph_this_ramp;    end    save(scnname,'ph_ramp')    end%%% smooth in time using gaussian moving window%ph_uw=ph_uw-repmat(ph_uw(:,master_ix),1,n_ifg);isnanix=isnan(uw.ph_uw);uw.ph_uw(isnanix)=0;dph=ph_all(edges_nz(:,3),:)-ph_all(edges_nz(:,2),:);dph_lpt=zeros(size(dph));n_edges=size(dph,1);fprintf('   low-pass filtering pixel-pairs in time...\n')for i1=1:n_ifg    time_diff_sq=(day(i1)-day)'.^2;    weight_factor=exp(-time_diff_sq/2/time_win^2);    weight_factor(master_ix)=0; % leave out master    weight_factor=weight_factor/sum(weight_factor);    dph_lpt(:,i1)=sum(dph.*repmat(weight_factor,n_edges,1),2);enddph_hpt=dph-dph_lpt;  % leaves master APS - slave APS - slave noise (+ residue master noise)ph_hpt=zeros(n_ps-1,n_ifg);ref_ix=1;A=sparse([[1:n_edges]';[1:n_edges]'],[edges_nz(:,2);edges_nz(:,3)],[-ones(n_edges,1);ones(n_edges,1)]);A=double(A(:,[1:ref_ix-1,ref_ix+1:n_ps]));fprintf('   solving for high-frequency (in time) pixel phase...\n')for i=1:n_ifg    ph_hpt(:,i)=A\double(dph_hpt(:,i));endph_hpt=[ph_hpt(1:ref_ix-1,:);zeros(1,n_ifg);ph_hpt(ref_ix:end,:)]; % add back ref pointph_hpt(:,deramp_ix)=ph_hpt(:,deramp_ix)+ph_ramp;ph_hpt=single(ph_hpt);sigma_sq_times_2=2*scn_wavelength.^2;ph_scn=nan(n_ps,n_ifg);patch_dist=scn_wavelength*4;patch_dist_sq=patch_dist*patch_dist;ix_range=ceil(n_ps/(max(ps.xy(:,3))-min(ps.xy(:,3)))*patch_dist*0.2);ix1=1;ix2=ix_range;ps.xy(:,1)=[1:n_ps]';fprintf('   low-pass filtering in space...\n')for i=1:n_ps    x_min=ps.xy(i,2)-patch_dist;    x_max=ps.xy(i,2)+patch_dist;    y_min=ps.xy(i,3)-patch_dist;    y_max=ps.xy(i,3)+patch_dist;    ix1=ix1+ix_range;    ix1(ix1>n_ps)=n_ps;    while ix1>1 & ps.xy(ix1-1,3)>=y_min        ix1=ix1-ix_range;    end    ix2=ix2-ix_range;    ix2(ix2<1)=1;        while ix2<n_ps & ps.xy(ix2+1,3)<=y_max        ix2=ix2+ix_range;    end    ix1(ix1<1)=1;    ix2(ix2>n_ps)=n_ps;    xy_near=ps.xy(ix1:ix2,:);    xy_near=xy_near(xy_near(:,2)>=x_min & xy_near(:,2)<=x_max & xy_near(:,3)>=y_min & xy_near(:,3)<=y_max,:);    dist_sq=(xy_near(:,2)-ps.xy(i,2)).^2+(xy_near(:,3)-ps.xy(i,3)).^2;    in_range_ix=dist_sq<patch_dist_sq; % exclude those out of range    xy_near=xy_near(in_range_ix);    dist_sq=dist_sq(in_range_ix);     weight_factor=exp(-dist_sq/sigma_sq_times_2);    weight_factor=weight_factor/sum(weight_factor); % normalize    ph_scn(i,:)=sum(ph_hpt(xy_near(:,1),:).*repmat(weight_factor,1,n_ifg),1);    if i/1000==floor(i/1000)        disp([num2str(i),' PS processed'])    end % end-ifend % i++ph_scn=ph_scn-repmat(ph_scn(1,:),n_ps,1); % re-ref to 1st PS%ph_scn_master=-ph_scn(:,master_ix); ph_scn_slave=zeros(size(uw.ph_uw));ph_scn_slave(:,unwrap_ifg_index)=ph_scn;%ph_scn_slave=ph_scn_slave-repmat(ph_scn_slave(:,master_ix),1,size(ph_scn_slave,2));ph_scn_slave(:,master_ix)=0;%save(scnname,'ph_scn_slave','ph_hpt','ph_ramp','ph_scn_master')    save(scnname,'ph_scn_slave','ph_hpt','ph_ramp')    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?