synth
synth is a package to generate synthetic stacks of single-look complex (SLC) SAR data for InSAR time series analysis.
Realistic results are achieved by using the global seasonal coherence dataset to create realistic decorrelation, and by using the troposim package to generate tropospheric turbulence noise.
The overall workflow for generating a stack of SLCs is as follows:
- Choose an area of interest (AOI) and set the parameters for the noise sources
- Generate the "truth phase"/"propagation phase" sources, which may include deformation, tropospheric turbulence, and phase ramps
- Download the coherence and backscatter data to use for correlation models
- For each pixel, create a coherence matrix using the decorrelation model and the truth phase differences
- Generate correlated noise samples for this pixel and multiply by the average backscatter
The SLCs are saved in GeoTIFF format, one raster per requested date. The propagation phases are also saved as 3D data cubes in HDF5 files.
Note that the "truth" phase sources include tropospheric noise and phase ramps. One common use is to compare phase linking algorithms, which estimate a wrapped phase time series; in this case, the desired outputs include all "propagation phases".
Propagation phase sources
Tropospheric Turbulence
The tropospheric turbulence noise uses the troposim package (Staniewicz, 2024), which uses an isotropic representation of the power spectral density (PSD) (cite: Hanssen, 2001).
Phase ramp
To simulate longer-wavelength noise sources, we allow simple planar phase ramps to be added at each date. The maximum amplitude may be set, and the orientation of each date's phase ramp is randomized
Deformation sources
Currently, the following deformation sources are supported:
- Gaussian blob
- (to move from
troposim): Okada model - (to move from
troposim): Geertsma reservoir source model
Decorrelation Noise
At each pixel, we use some decorrelation model to create a coherence matrix $T$, where element $|T_{ij}| = \gamma \exp(-1j \phi)$ contains the coherence magnitude $\gamma$ and interferometric phase $\phi$.
To generate correlated random samples,
- Find $L$ such that $T = L L^H$ using the Cholesky factor1.
- Generate an instance $\mathbf{y}$ of Circular Complex Gaussian (CCG) noise.
- Multiply $\mathbf{z} = T \mathbf{y}$ to obtain the correlated sample.
- (optional) If we want the amplitudes to match real data, we can multiply $A \mathbf{z}$, where $A = \text{diag}(\mathbf{\boldsymbol{\sigma} })$.
Here, we use the coherence matrix, which is power-normalized. The relation to the sample covariance matrix covariance matrix $C$ is
$$ C = T \circ \boldsymbol{\sigma}\boldsymbol{\sigma}^{H} $$
where $\circ$ is the Hadamard product, and $\boldsymbol{\sigma}= [\sigma_{1}, \dots, \sigma_{N}]^{T}$ is the vector of SLC standard deviations: $\sigma_{k} = \sqrt{ \mathbf{E}[\mid x_{k}\mid^{2} ] }$ .
Making the decorrelation realistic
Choosing random decorrelation parameters for each pixel in space would not be conducive for running real workflows that rely on averaging pixels in space. Therefore, we use the global coherence dataset to estimate the decorrelation parameters for each pixel.
The coherence dataset, publicly available on AWS, contains seasonal coherence models and average backscatter. The model for coherence $\gamma$ was
$$ \gamma(t) = (1 - \rho_{\infty})\exp(-t / \tau) + \rho_{\infty} $$ where $\rho_{\infty}$ is the long-term coherence, $\tau$ is the decorrelation time, and $t$ is the time in days. The backscatter model $\sigma_0$ was also estimated for each season.
Using the decorrelation model parameters
Two example $\rho_{\infty}$ maps are shown below over the Central Valley in California. The first is for winter, and the second is for fall.
To create an exponentially decaying correlation matrix, we could attempt to blend all four seasons' model parameters; however, for the current version, we have simply chosen the minimum $\rho_{\infty}$ to use for the entire pixel's stack. For certain regions, even using the minimum $\rho$ did not produce very strong decorrelation noise. Therefore we also added an option to use, as the long-term coherence value
$$ \begin{cases} \rho^2 & \text{if } \rho > 0.2 \ \rho^4 & \text{otherwise} \end{cases} $$
This is a heuristic to shrink all long-term coherences toward zero, where the $\rho^{4}$ case is to add more noise in low-coherence regions to combat the upwardly biased coherence estimator2.
Modeling seasonal decorrelation
Since certain regions show large differences for $\rho_{\infty}$ we create a "seasonal" map for pixels which have a peak-to-peak change greater than some threshold (e.g. 0.5). For pixels with $\max_{k}(\rho^{k}{\infty}) - \min{k}(\rho_{\infty}^{k})>0.5$, we model decorrelation similar to (cite Even and Schulz, 2018). The correlation $\gamma$ for the interferogram formed using images from time $t_{m}$ and $t_{n}$ is
$$ \gamma(t_{m}, t_{n}) = \left( A + B\cos\left( \frac{2\pi t_{n}}{365} \right) \right) \left( A + B\cos\left( \frac{2\pi t_{m}}{365} \right) \right) $$
where $A, B$ are related to $\rho_{\infty}$ and $\rho_{0}$ (the initial correlation) by $\gamma_{0} = (A + B)^{2}$ and $\gamma_{min} \triangleq \rho_{\infty} = (A - B)^{2}$. We can solve for the $A, B$ parameters by inverting this relation: Since $\gamma_{0}=1$ in the (Kellndorfer, 2020) model, then $B = (1 - A)$, and thus
$$ \begin{gather} A = \frac{1}{2} (1 + \sqrt{ \rho_{\infty} }) \ B = \frac{1}{2} (1 - \sqrt{ \rho_{\infty} }) \end{gather} $$
-
Any factorization such that $\Sigma = L L^{T}$ would work. The
multivariate_normalfunction has three options: Cholesky, eigenvalue decomposition witheigh, and SVD. The Cholesky is the fastest, but least robust if your covariance matrix is near-singular. ↩ -
While it's true that the Kellndorfer paper says the bias is very low due to the number of looks they took, my initial Central Valely test had very few regions that looks like pure noise even after 1 year. ↩
Metadata
Release files for synth-insar 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| synth_insar-0.1.2.tar.gz | 15.0 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| synth_insar-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.3 MB
Release files / synth_insar-0.1.2.tar.gz
| Download URL | synth_insar-0.1.2.tar.gz |
|---|---|
| Size | 15.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7616dbcfe326a9b450bb7df27986fcd74eb96f74b4fe4a3db4c276d804920997
|
|
BLAKE2b-256 checksum How to use checksums |
e4a57a90df7dd5cbd3a92e8f491d76430c53bdcbdf85a83ba9482e4c948f48db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2025.
Transparency logRelease files / synth_insar-0.1.2-py3-none-any.whl
| Download URL | synth_insar-0.1.2-py3-none-any.whl |
|---|---|
| Size | 8.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dec9ec05a2e6f3bcf6f2ceda110e9a90a24abc868999c9ede84cd3ddbd6377db
|
|
BLAKE2b-256 checksum How to use checksums |
28c172accca42d42d05fc746f5f81be98a6be26032914274b72bb0ab659da1fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2025.
Transparency log