Open method · Extensible configuration

DeepTelecom Data Generation Method

The reference generator uses Sionna RT to model the scene's propagation channel. The UAV body and rotors are discretized as moving point scatterers; the channel is solved snapshot by snapshot and used to construct a monostatic echo approximation, producing tensors, spectrograms, and run metadata.

Python 3.11Sionna RT 2.0.1Configuration-drivenGPU generationApache-2.0 project code

01 · Model

From scene propagation to micro-Doppler samples

Model boundary

This is a Sionna RT-based point-scatterer monostatic echo approximation. It is neither a full-wave electromagnetic simulation with a physical UAV mesh and RCS nor measured data. Understanding that boundary is essential for using the results correctly.

01Class and trajectoryRead tilt, body speed, initial state, and Bézier control points.
02Moving point scatterersCompute positions and velocities for the body point, rotor centers, and radial blade points.
03Snapshot RTTreat each scatterer as a passive receiver probe and solve the one-way CIR from the base station.
04Echo and STFTSquare the complex channel as a two-way echo approximation, coherently combine weighted terms, and add AWGN.
05Sample outputSave NPZ arrays, a 512 × 512 PNG, and structured metadata.

The primary v1 configuration uses a 28 GHz carrier, a 20 kHz sampling rate, and 2,048 snapshots. The three full-model classes use one body point plus 24 radial blade points, while the isolated-blade baseline keeps one rotating blade-tip point. Ray tracing enables LoS and specular paths with a maximum depth of 2.

02 · Open-source scope

Scope of the public generator

The public repository's generator/ directory contains only reusable motion models, Sionna RT solving, STFT processing, metadata code, configuration, and smoke tests. Tens of gigabytes of outputs, run logs, legacy ID inventories, device scheduling state, and server-specific absolute paths do not belong in Git history.

generator/
├── config/etoile.yaml
├── src/
│   ├── build_rt_uav_stft_dataset.py
│   ├── motion_utils.py
│   ├── stft_utils.py
│   ├── metadata_utils.py
│   └── verify_uav_kinematics.py
├── scripts/
│   ├── setup_env.sh
│   ├── preflight.py
│   └── run_smoke_test.sh
├── requirements.txt
├── README.zh-CN.md
└── README.en.md

The Étoile scene references the Apache-2.0 assets bundled with Sionna RT 2.0.1 instead of recommitting 566 third-party scene files. Public metadata uses a logical scene ID rather than machine-specific absolute paths.

Browse the generator, configuration, and licensing notes

The repository's Apache-2.0 license covers the code and documentation we publish. The dataset payload remains governed by the terms stated on the dataset page.

Open generator/

03 · Run it

Start with an eight-snapshot smoke test

We recommend Linux, an NVIDIA GPU, working CUDA/OptiX support, and Python 3.11. A full sample performs ray tracing snapshot by snapshot and costs substantially more than ordinary NumPy data generation, so begin with the small smoke test.

Install pinned dependencies
git clone https://github.com/kygoyuan2004/DeepTelecom_Partial.git
cd DeepTelecom_Partial/generator
./scripts/setup_env.sh
DEEPTELECOM_PYTHON="$PWD/.conda-env/bin/python" ./scripts/preflight.py
Generate one small test sample
DEEPTELECOM_PYTHON="$PWD/.conda-env/bin/python" \
  ./scripts/run_smoke_test.sh

The smoke test writes to the Git-ignored local directory generator/run/smoke_test and uses eight snapshots plus a larger RT stride. It only checks dependencies, scene loading, solving, output, and the kinematics contract; its output must not be mixed into the formal dataset.

Generate one full sample from a class

Single-sample tutorial command
.conda-env/bin/python src/build_rt_uav_stft_dataset.py \
  --root outputs/demo \
  --config config/etoile.yaml \
  --classes pitch30_v10 \
  --start-index 0 --end-index 0 \
  --max-new-samples 1 --resume

04 · Extend the scatterer model

Add blade scatterers without editing Python

For the three full-model conditions, the scatterer count is:

Total = 1 body point + rotor count × blades per rotor × points per blade

The default is 1 + 4 × 2 × 3 = 25. Increasing points per blade from 3 to 5 produces 41 total scatterers.

Copy the complete configuration, then edit it
cp config/etoile.yaml config/my_dense_blades.yaml

# In config/my_dense_blades.yaml, keep:
# num_rotors: 4
# num_blades_per_rotor: 2
# and change points_per_blade: 3 to:
points_per_blade: 5
  • Points are spaced uniformly along each blade radius. Adding points increases the number of probes, ray-tracing cost, and NPZ size.
  • single_blade_v0 is a fixed, single-tip control class and is unaffected by points_per_blade.
  • The current generator supports quadrotor topology only; changing num_rotors by itself is rejected.
  • num_blades_per_rotor can change, but rigorous comparisons should also review scatterer-weight normalization so blade-count changes are not confounded with total echo-strength changes.

05 · Extend the trajectory

Linear motion or a four-control-point Bézier path

Linear trajectory

In linear mode, motion starts from the configured initial position and follows the simulation +x direction. Speed still comes from the class: v0 means 0 m/s, while v10 means 10 m/s.

Linear mode
body_trajectory_model: linear
body_position_x: 146.0
body_position_y: -52.0
body_position_z: 70.0

Custom single-segment cubic Bézier

Four 3D control points define the spatial curve. The generator first builds an arc-length lookup table and then samples the path at the class speed, keeping position and velocity direction consistent.

Control points as one-line JSON
body_trajectory_model: etoile_bezier
etoile_trajectory_speed_mode: class_speed
etoile_control_points_json: "[[146,-52,70],[154,-18,72],[178,14,68],[204,-8,70]]"
etoile_start_fraction_min: 0.00
etoile_start_fraction_max: 0.90
Arbitrary waypoint/CSV paths and multi-segment Bézier paths are not supported yet

A complex route requires coordinated changes to path construction, the path-attachment branch in generate_case(), and the full trajectory-metadata contract, plus tests for position continuity, velocity continuity, and path-length bounds. Replacing positions alone would leave velocities or labels inconsistent.

06 · Primary configuration

Key generation parameters for v1

SettingPrimary v1 valuePurpose
carrier_frequency_hz28e9Carrier used for ray tracing and Doppler calculations
sampling_rate_hz20,000Echo time-domain sampling rate
num_snapshots2,048RT/echo time points per sample
rotor_frequency_hz25 ± 10%Per-sample random perturbation of rotor frequency
blade_radius_m0.02 ± 10%Per-sample random perturbation of blade radius
noise_snr_min/max_db20 / 40AWGN SNR sampling range
stft_window_size48Hann-window length
stft_overlap3675% overlap
stft_nfft512STFT frequency grid
rt_max_depth2Maximum PathSolver propagation depth

07 · Reproducibility and limits

Reproducibility and implementation boundaries

  • Public configuration, random seeds, code version, and parameter paths are reproducible. Different GPUs, drivers, and underlying floating-point implementations are not guaranteed to produce byte-identical NPZ files.
  • The generator output is a research simulation approximation and should not be treated as measured ground truth from a physical aircraft.
  • After changing scatterers, blades, or trajectories, use a new experiment namespace and manifest; never write into the frozen v1.0.0 shards.
  • Absolute run directories, logs, and scheduling state are not scientific sample content. Remove them before release or replace them with logical identifiers.

This generator is curated and released by a project team at the College of Information Science and Electronic Engineering (ISEE), Zhejiang University. If you add a new trajectory backend, scatterer-weighting model, or scene adapter, we welcome discussion through a GitHub issue or pull request.