Interferometry Tutorial
Department of Geological Sciences
Cornell University

First written: January 18, 1998
Last Updated:

Direct questions or comments to Matt Patrick at mrp8@cornell.edu

This tutorial walks you through making a high resolution topographic map for the area around Mendoza, Argentina, using satellite radar interferometry. The two SAR images you will use were aquired on May 31 and June 1, 1996. The first scene is named 5833 and the second is 25506. Each scene is 4912 samples wide (range direction) by 26, 898 lines tall (azimuth direction).

A basic explanation is provided for each step. Clicking on the command will give a more thorough exlpanation. Problems may be encountered in your processing, and I have listed the ones which I ran into, along with their solution. Certain images are shown on this web site, and a full size view is available by clicking on the image. It should be noted that all images (except the finished product: resampled height map) are mirror images of the real surface.

Input files are colored in light blue. Output files are colored in red. Parameters are colored in green

There are four basic steps to producing a topographic map:

1) MSP Processing
2) ISP Processing
3) Phase Unwrapping
4) Height Map




MSP Processing

1) Make a directory with the orbit number as the name and move to that directory.

mkdir 5833
cd 5833

Find out if your scene was obtained with the ERS1 or ERS2 satellite. We will assume 5833 is ERS2 data. If ERS2, the following parameter files will be so named.

a) Copy the antenna pattern ERS2_antenna.gain from MSP/sensors to this directory.

cp $MSP_HOME/MSP/sensors/ERS2_antenna.gain

b) Also copy the appropriate raw data/sensor parameter file from the same directory.

cp $MSP_HOME/MSP/sensors/ERS2_ESA.par

c) Copy the MSP processing script to the current directory.

cp $MSP_HOME/MSP/sensors/ERS_PROC

2) Read the raw data from the 8mm Exabyte tape using the appropriate script.

ERS_ESA_RAW

Outputs:

  • 5833.ldr - leader file
  • 5833.vdf - volume directory file
  • 5833.nvdf - directory file

    3) Create the processing parameter file: p5833.slc.par

    ERS_proc_ESA 5833.ldr p5833.slc.par

    4) Run the missing line detector:

    ERS_fix ERS/ESRIN p5833.slc.par 1 5833.raw 5833.fix

    Turning cross correlation on or off can make a big difference. For us, the detector seemed to notice nonexistant missing lines when it was turned on, screwing up processing. Running it again with it off, everything went fine.

    Output: 5833.fix

    Make sure to copy the output of ERS_fix, including the listing of missing lines if there are any, to a text file for future use.

    5) Run main MSP processor:

    ERS_PROC

    The first input is the ERS2_ESA.par file copied into your directory in step 1. The range looks and azimuth looks is where you will have to decide for the first time how you would like to process your data for the rest of the process. We chose looks of 1 and 5. That is, the process averages every 1 line along range (x) and averages every 5 lines along azimuth (y). For a full size image, the initial number of lines is range=4912 and azimuth=26898. With looks of 1 and 5, the resulting size is range=4912 and azimuth=5379.

    Outputs:
    5833.slc 5833.mli p5833.mli.par 5833.rc
    autof1.mli autof2.mli autof_5833.out az_5833.out
    azsp_5833.out mli_5833.out pre_5833.out rspec_IQ_5833.out
    auto.cc 5833.autof 5833.azsp 5833.rspec
    Possible problems with ERS_PROC and their solutions

    6) Run a first quality check on your MSP outputs to see if things went well.

    a) Make a raster file of 5833.mli and view the image. If there are any blurry swaths, then missing lines may present a problem. Check p.5833.mli.par to get the correct image size.

    b) Look at autof1.mli and autof2.mli

    dis2pwr autof1.mli autof2.mli 1024 1024 -fn variable

    You are looking at an arbitrary area chosen to do the autofocusing. The view of each scene should look similar.

    Check out our autof1.mli
    Check out our autof2.mli

    c) Look at auto.cc

    dispwr auto.cc 1024 -fn variable

    Brightness indicates areas of high correlation. Should look like a bullseye.

    Check out our auto.cc

    d) View 5833.autof using a graphing program

    xmgr File -> Read -> Sets -> 5833.autof

  • 5833.autof should look like a sharp spike. Check out our 5833.autof
  • Also view 5833.azsp: looks like fuzzy sine curve. Our 5833.azsp
  • Also view 5833.rspec: looks like batman head: fuzzy hill with two spikes on either side.
    Our 5833.rspec

    If your first quality check passes, you should go ahead with your ISP processing. If, when viewing your 5833.mli rasterfile, there is a blurry area, then ISP processing may have to be done on the part above and below it, separately.

    7) Do steps 1-6 for the other scene: 25506 in this example. Keep in mind that scene 25506 was aquired with the ERS1 satellite.




    ISP Processing

    1) Create the SLC parameter file: 5833.slc.par

    par_MSP ERS2_ESA.par p5833.slc.par 5833.slc.par

    2) Make the ISP directory: 5833_25506. Keep the .slc files in their parent directories to avoid moving gigabyte files around. Move the 5833.slc.par and 25506.slc.par files to this the ISP directory.

    3) Estimate initial offsets.

    init_offset 5833.slc 25506.slc 5833.slc.par 25506.slc.par 5833_25506.off 2 5
    init_offset 5833.slc 25506.slc 5833.slc.par 25506.slc.par 5833_25506.off 1 2
    init_offset 5833.slc 25506.slc 5833.slc.par 25506.slc.par 5833_25506.off 1 1

    This takes a small window (in the center of the image by default) and calculates an initial estimate of offset between the two scenes. One of the last output lines is the offset estimate. The offset estimate for range should be in the single digits.

    Output: 5833_25506.off The ISP parameter file

    Possible problems with init_offset and their solutions

    4) Create offset file:5833_25506.off

    This file is the interferogram parameter file, and will be added to in future steps.

    create_offset 5833.slc.par 25506.slc.par 5833_25506.off 1

    The “1” parameter at the end will determine which steps we will take next. If you type a 2, then the procedure is slightly different. Consult ISP User Guide.

    Controlling what areas you are processing is done in create_offset. If you have a missing line in the middle of your image, and want to process the top and bottom halves separately, then change the azimuth position in these lines:

    first azimuth position: 1
    last azimuth position: 13500 (or just before the first missing line. The starting position of your bottom scene would start just after the last missing line. The missing line positions can be found in the ERS_fix output.)

    5) Precision estimate of offsets

    offset_pwr 5833.slc 25506.slc 5833.slc.par 25506.slc.par 5833_25506.off 5833_25506.offsets 5833_25506.snr

    Number of valid offsets: should be in the 20’s and 30’s.
    Range, azimuth offsets: should be in the tens or high ones.

    Since you put a “1” as an input parameter in create_offset, you must use offset_pwr. If you put “2”, you would use offset_SLC

    Once the range, azimuth offsets start continuously showing up as 2 through 5, then you know you have a problem.

    Outputs:

  • 5833_25506.snr
  • 5833_25506.offs

    6) Determination of offset polynomials based on least squares error method

    offset_fit 5833_25506.offsets 5833_25506.snr 5833_25506.off 5833_25506.coffs 5833_25506.coffsets 1

    The input files are a bit tricky in this step, so be sure to get the suffixes correct.

    Minimum SNR threshold: 7

    Range and azimuth error thresholds: 3 times the standard deviation numbers in the above line.

    After typing these numbers in, the program shows the new standard deviation for range and azimuth fits. These values should be less than 0.5. If not, alter thresholds again.

    Outputs:

  • 5833_25506.coffs
  • 5833_25506.coffsets

    7) View initial correlation results.

    >ftp ice
    >put 5833_25506.coffsets
    >put 5833_25506.off
    >by

    >telnet ice
    >setenv DISPLAY owasco:0.0
    >.run /notsteer/alsdorf/idl/insar/offsetplot.pro
    >offsetplot, ‘5833_25506.coffsets’,’5833_25506.off’
    >exit

    The graphs are best looked at on paper. To print, type
    >lpr 5833_25506.off.ps
    on the ice command line.

    Compare your graphs to ours.

    The graph titled "Range offset" with axes range offset vs. azimuth line number should show a narrow horizontal band of dots going all the way to the last line of your data (28698). If it only goes part way, then correlation has not been accomplished all the way, and you must stop here and start over, making the correct adjustments to attain correlation. Making the interferogram will be impossible if you don't fix the problem. Our first runs had a loss of correlation at the 15000 line mark, and we remedied this by rerunning ERS_fix with the cross correlation off. The problem was fixed.

    The graph titled "Range offset" with axes range offset vs. range pixel number should be a smoothly descending band, with no jumps.

    If these graphs look like they should, go on to the next step.

    8) Resample second SLC to the geometry of the first SLC

    SLC_interp 25506.slc 5833.slc.par 25506.slc.par 5833_25506.off 25506.rslc 25506.rslc.par

    Takes an hour or so.

    Outputs:

  • 25506.rslc
  • 25506.rslc.par

    9) Make the interferogram

    SLC_intf 5833.slc 25506.rslc 5833.slc.par 25506.rslc.par 5833_25506.off 5833_25506.int 1 5

    Make sure you have at least two gigabytes on your disk before you run this. It takes about 3 hours.

    Output: 5833_25506.int

    This is a raster file of the interferogram. The fringes are so fine, they are almost impossible to see. This high fringe rate is not representative of the real surface, but is due to a phenomenon called the flat earth phase (described in step 11). The next few steps will subtract the effects of flat earth phase.

    10) Run the multi look program.

    multi_look 5833.slc 5833.slc.par 5833.mli 5833.mli.par 1 5
    multi_look 25506.slc 25506.slc.par 25506.rmli 25506.rmli.par 1 5

    Outputs:

  • 5833.mli the intensity (amplitude) image averaged according to rlks and azlks. Same as a .pwr file.
  • 25506.rmli the 25506 intensity image, registered to 5833.mli

    This is a raster file of the multi-look intensity image. You will use this image to pick ground control points (GCP's) in a later step.

    11) Calculate the baseline There are two programs which can calculate baseline, and they take very different approaches.

    The object of calculating baseline and the next step is to subtract flat earth phase. The flat earth phase results in more fringes than there should be, and is due to the inherent geometry of the satellites. That is, fringes are produced simply because of the baseline. Base_orbit (a) calculates the baseline from the satellite’s on board intruments. The results of the base_orbit calculations are used in ph_slope_base, which subtracts these baseline effects from the interferogram. Unfortunately, the satellite’s instruments are often incorrect, and ph_slope_base may not subtract the correct amount of flat earth phase if this is the case. The alternative is to use the interferogram to calculate the baseline. By measuring the fringe rate, base_est_fft (b) can calculate the flat earth phase. If you suspect that flat earth phase was not properly subtracted even with base_est_fft, try altering the baseline file yourself (c).

    In our initial flattened interferogram, we could tell that the flat earth phase had not properly been subtracted because there were areas which were known to be flat which had many fringes. Additionally, these fringes were very regular and straight. So we went ahead with base_est_fft.

    a) Calculate using state vectors.

    base_orbit 5833.slc.par 25506.rslc.par 5833_25506.base

    b) Calculate baseline from the interferogram.

    base_est_fft 5833_25506.int 5833.slc.par 5833_25506.off 5833_25506.base

    Use the initial interferogram as input.

    c) Alter baseline manually.

    Do this by making a copy of the baseline file,and changing the initial baseline (TCN) values. For each change, save the file and run ph_slope_base using this test baseline file. Make a raster file of the flattened interferogram and visually inspect it. If it is somewhat close to what you think it should look like, keep it, and use this flattened interferogram for the rest of processing.

    Output: 5833_25506.base

    12) Subtract the flat earth phase: make the flattened interferogram.

    ph_slope_base 5833_25506.int 5833.slc.par 5833_25506.off 5833_25506.base 5833_25506.flt

    This takes about 10 minutes. When done, make a raster file (rasmph) and visually inspect it to decide if baseline modification is necessary.

    Output: 5833_25506.flt

    13) Make the correlation map.

    cc_wave 5833_25506.flt 5833.mli 25506.rmli 5833_25506.cc 4912 5

    This maps the correlation across the scene. The color range is from blue to purple to yellow. Blue is the lowest, purple is medium, and yellow is highest correlation. You must use rascc to view the map.

    Output: 5833_25506.cc



    Phase Unwrapping

    1) Smooth the fringes

    adapt_filt 5833_25506.flt 5833_25506.sm 4912

    Output: 5833_25506.sm

    2) Mask low correlation areas.

    corr_flag 5833_25506.cc 5833_25506.flag 0.5

    Those areas of low correlation would screw up unwrapping, so these areas must be identified and “masked” during initial unwrapping. The unwrapping skips these areas. Later, these areas can be unwrapped using bridges.

    To explain the correlation threshold, I will tell you how my first experience with it went. On our first try, we used a correlation threshold of 0.5, and the fraction LSNR points was 0.49. This means that with that correlation threshold, half the scene is below that value and will be masked. That meant that our 0.5 was too high. Correlation is measured from 0 to 1.

    Then I deleted the 5833_25506.flag file. You must delete it if you want to run corr_flag again, as the flag file is not overwritten.

    Next, I reran corr_flag with a correlation threshold of 0.25. The fraction LSNR points was 0.05. That means that 5% of the image is below .25 - which is pretty good. For making a DEM, you want a LSNR below 10%. But not too low, or not enough will be masked and uwrapping could crash.

    Output: 5833_25506.flag

    3) Neutron stuff

    neutron 5833.mli 5833_25506.flag 4912 6

    That means a neutron is defined as an area that is 6 times the average intensity.

    4) Determine residues.

    residue 5833_25506.sm 5833_25506.flag 4912

    5) Connect residues through trees.

    tree_cc 5833_25506.flag 4912

    This can take a long time depending on the correlation of the image. Ours took 15 minutes.

    6) Unwrap phase

    grasses 5833_25506.sm 5833_25506.flag 5833_25506.unw 4912

    Unwrapping just takes the phase measurements, which are in units of 2pi, and adds them up from the start to determine the cumulative phase change across the scene.

    This takes about 20 minutes. It is the actual unwrapping. One of the output lines is Fraction of phase image unwrapped: ?. Ours was very high (.96) so that is good. You obviously want it as high as possible. If the number was low, you would have to do some bridging. Ours was high enough that I didn’t have to do bridging.

    Output: 5833_25506.unw

    7) Choose ground control points.

    Choosing GCP’s enables the computer to tilt the unwrapped interferogram to fit the rough surface defined by the gcp points. About 12 points are needed, spaced out across the scene. Many more than 12 points can cause the program to crash.

    gcp_ras 5833.mli.ras -1 > 5833_25506.gcp

    We use the 5833.mli raster file because it is the only scene which ca be used to find distinguishing characteristics. Use the center button to click on the point that you have identified. Then type in the elevation IN METERS in the input box. Elevation points do not have to be exact, just somewhere within the area of a thumb print.

    You have to input all the points in one session. Exiting and restarting gcp_ras will erase past work.

    We used two maps to identify elevation points. One was an Argentine 1:100,000 scale topo map. The other was an ONC chart.

    8) Calculate baseline from GCP’s.

    base_ls 5833_25506.unw 5833.slc.par 5833_25506.off 5833_25506.gcp 5833_25506.base 1 5 4

    The 5 is window size. The 4 is the number of variables: usually 3-5, 4 best.

    This program rewrites the baseline file for the last time and puts the precision baseline coordinates in.

    One the program runs, look around the first GCP listing for WARNING: GCP not unwrapped. This means you chose a GCP in a spot that was not unwrapped, so it can’t be used. Delete this GCP in jot and run base_ls again.

    The height error for the GCP points is listed and should not be any more than, say 40. If it is, delete it in jot. Remember that you still need about a dozen: you may have to go back and get more if you have a number of high error points.

    Mean square height error: last output line, want it around 10 - 20.

    9) Check result of improving baseline

    a) Copy the 5833_25506.base to test.base. In jot, alter the test.base by moving the precision baseline (estimated by GCP’s) to initial baseline line. Also move velocities. You end up moving 4 entries up.

    b) Now rerun ph_slope_base to see if GCP baseline makes the fringes look better. Ours did quite a bit. Rerunning of ph_slope_base is just a test to see if our GCP baseline is worth using.

    ph_slope_base uses the initial baseline entries and ignore the precision baseline entries.




    Height Map

    1) Make the height map.

    hgt_map 5833_25506.unw 5833_25506.flag 5833.slc.par 5833_25506.off 5833_25506.base 5833_25506.hgt 5833_25506.gr

    This reads the precision baseline, so no copying is necessary. This goes for about 5 minutes, and a view of the raster file is recommended.

    Outputs:

  • 5833_25506.hgt
  • 5833_25506.gr

    rashgt to view raster

    2) Convert to orthonormal coordinates.

    res_map 5833_25506.hgt 5833_25506.gr 5833.mli 5833.slc.par 5833_25506.off 5833_25506.rhgt 5833.rmli 5833_25506.slope

    The areas on the edges of the scene will be altered due to their angle and distance from the satellite. This step will in a sense warp the height map to represent the real surface. It takes a few hours.

    Outputs:
  • 5833_25506.rhgt
  • 5833.rmli
  • 5833_25506.slope

    This is the finished product. The fringes represent the contours of a conventional topographic map. Notice how the image has been flipped to its real orientation.