sar_bulk_mocomp#

Apply bulk motion compensation to complex SAR phase-history data in the FX domain. sar_bulk_mocomp is currently in the matx::experimental namespace because its API is subject to change.

The operator is lazy, allocation-free, and composable with other MatX expressions. The final two FX dimensions are interpreted as pulse and frequency sample, and any leading dimensions are batches:

fx:           [batch..., pulses, samples]
range_offset: [batch..., pulses]
result:       [batch..., pulses, samples]

For sample index \(n\), the frequency is

\[f_n = f_{\mathrm{ref}} + \left(n - \left\lfloor N/2 \right\rfloor\right)\Delta f,\]

where \(f_{\mathrm{ref}}\) is SarBulkMocompParams::phase_reference_frequency and \(\Delta f\) is SarBulkMocompParams::sample_frequency_spacing. For differential reference range \(\Delta R_p\), the applied correction is

\[\exp\left(-j\,\mathrm{sgn}\,\frac{4\pi}{c}\,f_n\,\Delta R_p\right).\]

The one-range overload assumes an initial reference range of zero. The two-range overload changes reference from initial_reference_range to target_reference_range and uses \(\Delta R_p = R_{\mathrm{target},p} - R_{\mathrm{initial},p}\).

Examples#

const experimental::SarBulkMocompParams params{
    .phase_reference_frequency = 9.6e9,
    .sample_frequency_spacing = 2.5e4,
    .sgn = sgn,
};

auto compensated =
    experimental::sar_bulk_mocomp(fx, range_to_mcp, params);
(output = compensated).run(exec);

Phase arithmetic follows the range-offset value type. Float ranges use single-precision frequency, phase, and trigonometric arithmetic; double ranges use double precision for phase construction and argument reduction. With CUDA, when double ranges are combined with cuda::std::complex<float> FX data, the bounded, reduced angle is converted to float for a fast single-precision sincospif evaluation. Double-complex FX data retains the full double-precision trigonometric path. The parameter frequencies are stored as double and narrowed for the single-precision range path. Other range types, including fltflt and half precision, are not currently supported. FX values must be cuda::std::complex<float> or cuda::std::complex<double>.

Host, CUDA, and CUDAJIT executors are supported. Distributed expressions and dynamic-rank inputs are not currently supported.

Added in version head.

template<typename FxOp, typename TargetRangeOp>
__MATX_INLINE__ auto matx::experimental::sar_bulk_mocomp(const FxOp &fx, const TargetRangeOp &target_reference_range, const SarBulkMocompParams &params)#

Apply bulk motion compensation to SAR phase-history data in the FX domain.

The final two dimensions of fx are interpreted as pulse and frequency sample. Every leading dimension is a batch dimension. The range offset must match all FX dimensions except the final frequency-sample dimension.

Sample floor(num_samples / 2) has frequency params.phase_reference_frequency. The operator applies exp(j * -sgn * 4*pi/c * frequency * target_reference_range) to every FX sample. Phase construction and reduction use the value type of target_reference_range, which must currently be float or double. On CUDA, double-range phase for complex<float> FX data uses a float trigonometric evaluation after double-precision argument reduction.

Template Parameters:
  • FxOp – FX tensor or operator type.

  • TargetRangeOp – Target-reference-range tensor or operator type.

Parameters:
  • fx – Complex FX-domain data with shape [batch…, pulses, samples].

  • target_reference_range – Target per-pulse reference range with shape [batch…, pulses].

  • params – Frequency grid and phase-sign parameters.

Returns:

A lazy, allocation-free motion-compensated operator.

template<typename FxOp, typename InitialRangeOp, typename TargetRangeOp>
__MATX_INLINE__ auto matx::experimental::sar_bulk_mocomp(const FxOp &fx, const InitialRangeOp &initial_reference_range, const TargetRangeOp &target_reference_range, const SarBulkMocompParams &params)#

Change the bulk motion-compensation reference of SAR FX data.

This overload can be used to effectively change the motion-compensation point. It applies compensation for target_reference_range minus initial_reference_range. Both range operators must have the same shape as all FX dimensions except its final frequency-sample dimension.

Template Parameters:
  • FxOp – FX tensor or operator type.

  • InitialRangeOp – Initial-reference-range tensor or operator type.

  • TargetRangeOp – Target-reference-range tensor or operator type.

Parameters:
  • fx – Complex FX-domain data with shape [batch…, pulses, samples].

  • initial_reference_range – Existing per-pulse reference range.

  • target_reference_range – Desired per-pulse reference range.

  • params – Frequency grid and phase-sign parameters.

Returns:

A lazy, allocation-free reference-change operator.

struct SarBulkMocompParams#

Parameters for bulk motion compensation of SAR FX data.

Public Members

double phase_reference_frequency#

Frequency represented by sample floor(num_samples / 2), in Hz.

double sample_frequency_spacing#

Frequency difference between adjacent samples, in Hz.

int sgn#

Phase-history sign convention. Must be +1 or -1.