Problem with complex Range Doppler Terrain Correction


I am working on TerraSAR-X SAR SLC images, and I encountered a problem during my work. This is not a bug or a crucial issue, but I think it would be worth adding a Warning message about it. For my research, I have to use images terrain-corrected. When using Range Doppler Terrain Corrected in SNAP, one can choose to keep the complex data or not. The intensity value obtained for a pixel is not the same depending on if the complex data are kept or not, and it can be an important difference (more than 3dB). Is this value difference due to that an interpolation is realized on the real and imaginary parts if the complex data are kept and on the intensity if they are not?

I don’t have any opinion if one of the two values is more “physic” than the other, but I think it would be really important to add a Warning message about it to avoid false results. For example, if someone compares two acquisitions obtained at a different date, one terrain corrected with complex data and one without the complex data, the value difference between the two pixels is not only due to the acquisitions.

Here is the example for one images and a selected pixel :

Terrain Correction with complex :

Terrain Correction without complex :

The visual difference for the same area :

The corresponding histograms :

The scatter :

1 Like

@jun_lu Do you have an explanation?

We will look into the problem. A JIRA ticket ([SITBX-883] TC results are different for intensity and complex output - JIRA) has been created to track the issue. Thank you for reporting the problem

1 Like

One cannot apply standard interpolation operators on SLC since the data is not base-banded. You will need to account for carriers in azimuth and sometimes in range as well, to interpolate SLCs accurately. This is done correctly when generating coregistered SLCs but the generic interpolation approaches used in geocoding modules will not produce good results.


Dear @jun_lu,

I think I have found a clue to solve the problem. As I explained (you can see it using the Matlab code I did to see if I was right), the interpolation between the real and imaginary parts leads to a different intensity than the interpolation of the intensity part. The trend obtained with random values is similar to the one I had with my TerraSAR-X result. I understand that the terrain correction is not a simple interpolation, but I think that the principle is close. The new value obtained for a lat/long pixel is obtained using values from other pixels (selected by the resampling method and the resampling grid), and using the complex or intensity values leads to different results.

I am not a big java user, but if I understood your code correctly (, you realize the resampling (line 1570) over I (srcBand[0]) and Q (srcBand[1]) if outputComplex is true (line 603). Otherwise, you only do it on the intensity band (srcBand[0]). Therefore when the intensity is virtually calculated once the terrain correction is over, the result obtained is different from the one obtained resampling the intensity.

Does this information help you to solve this problem? The solution would be to resample over the two source bands (if available) and keep only the intensity if outputComplex is false. But again, I don’t know which one of these two results is the most “physical”.



figure ; imagesc(10*log10(intensityinterpolated),[-10 0]) ; colorbar ; colormap(gray(256)) ; title('Interpolated')
figure ; histogram(10*log10(intensityinterpolated)) ; title('Interpolated')

figure ; imagesc(10*log10(intensityinterpolatedcomplex),[-10 0]) ; colorbar ; colormap(gray(256)) ; title('Interpolated complex')
figure ; histogram(10*log10(intensityinterpolatedcomplex)) ; title('Interpolated complex')

figure ; scatter(10*log10(intensityinterpolatedcomplex),10*log10(intensityinterpolated),sz) ; xlabel('Interpolated complex') ; ylabel('Interpolated') ; title('scatter')

Dear @jun_lu

I think I can confirm my initial hypothesis as you obtain the same intensity values doing a terrain-correction with or without complex if you use Nearest Neighbour (therefore without any averaging on pixel values) as Image Resampling Method instead of Bilinear Interpolation. I hope it helps you with this problem correction.

Hi Paillou,
Thank you very much for your feed back and the analysis of the problem. You are right that the problem was caused by the different handling of the intensity and complex output. We have discussed the issue with ESA scientist. Once we reach a conclusion regarding the right way to handle the complex out, we will fix the code. We’ll keep you and other users update regarding the progress of the issue.



Based on the feedback of ESA scientists, the following changes have been made to the terrain correction operator:

  1. remove the option for complex output;
  2. if the input product is complex, convert it to intensity internally before applying interpolation.

If you want to use the phase for PolSAR, we suggest you get the covariance matrix first and then apply the terrain correction

Thanks for your feedback regarding this problem.

If I may suggest something, I think it would be good to change the default value for “Image Resampling Method” and to choose Nearest_Neighbour as for most of the other SNAP functions (or to add precision to the Nearest_Neighbour option to specify that it is the “physical” method).
In fact, by doing a bilinear interpolation, we change the pixel values even if the result obtained can be visually better. This modification of the values is very important when one wants to work with the phase.

Thanks for the tip on how to obtain the phase on a terrain-corrected image using the covariance matrix.