CoolFace
Datasetpublic

sngram/nisar-space-elint-2026

NISAR RSLC Complex I/Q Signal Dataset This dataset is made from publicly available NISAR RSLC data. I created it as a small machine-learning dataset for working with complex radar signals. The original NISAR data is much larger, so this repository contains smaller 512-sample windows extracted from the original RSLC data. The goal is to make the data easier to experiment with without having to download and process a full NISAR product every time. What is in the… See the full description on the dataset page: https://huggingface.co/datasets/sngram/nisar-space-elint-2026.

sourceHugging Facecc-by-4.0updated 1mo agoView on Hugging Face
1likes69downloads
Dataset Card

NISAR RSLC Complex I/Q Signal Dataset

This dataset is made from publicly available NISAR RSLC data.

I created it as a small machine-learning dataset for working with complex radar signals. The original NISAR data is much larger, so this repository contains smaller 512-sample windows extracted from the original RSLC data.

The goal is to make the data easier to experiment with without having to download and process a full NISAR product every time.

What is in the dataset?

There are 30,000 signal windows.

Each sample contains:

text
[4, 512]

The four channels are:

text
Channel 0 → I
Channel 1 → Q
Channel 2 → Amplitude
Channel 3 → Phase

Amplitude and phase are calculated from the original complex I/Q values:

text
amplitude = sqrt(I² + Q²)
phase = atan2(Q, I)

The dataset contains both:

  • —HH — co-polarized
  • —HV — cross-polarized

signals.

Where does the data come from?

The source is the NISAR Level-1 RSLC product.

The processing script searches NASA Earthdata for:

text
NISAR_L1_RSLC_PROVISIONAL_V1

and reads the RSLC data from:

text
science/LSAR/RSLC/swaths/frequencyA/HH
science/LSAR/RSLC/swaths/frequencyA/HV

The original NISAR files are much larger than the files in this repository. I select a number of azimuth lines and take 512-sample windows from them.

This repository therefore contains processed samples derived from NISAR RSLC data, not the original NISAR files.

Labels

One important thing to know:

The labels are not official NISAR labels.

I created them from the average power of each signal window.

For HH:

text
power > -10 dB          → class 0
-22 dB < power ≤ -10 dB → class 1
power ≤ -22 dB          → class 2

For HV:

text
power > -20 dB → class 3
power ≤ -20 dB → class 4

The class names are:

text
0 → NISAR_LBand_MainLobe_HighPwr
1 → NISAR_LBand_SideLobe_Multipath
2 → NISAR_Thermal_Noise_Floor
3 → NISAR_CrossPol_HV_Volumetric
4 → NISAR_Diffuse_Surface_Scatter

These names are descriptive names for the experiment. They should not be treated as official NISAR science classifications.

In particular, the dataset should not be used to claim that NISAR officially labels individual radar returns as "main lobe", "multipath", "thermal noise", etc.

Dataset columns

Each row contains:

text
class_id
class_name
polarization
power_db
azimuth_line
signal_tensor

signal_tensor is stored as a flattened list.

You can turn it back into [4, 512] with:

python
import numpy as np

x = np.array(row["signal_tensor"], dtype=np.float32)
x = x.reshape(4, 512)

Train / validation / test

The current dataset is split into:

text
Train       70%
Validation  15%
Test        15%

The split is stratified by class_id.

One limitation of this version is that the split happens at the window level. Multiple windows from the same azimuth line can therefore end up in different splits.

Because of that, this version should not be treated as a strict test of how well a model generalizes to completely unseen NISAR acquisitions or scenes.

A future version can use a group-based split by acquisition or azimuth line.

Important note about power_db

power_db was also used to create the labels.

That means a model should not use power_db as an input feature when testing whether it can learn the signal itself. Doing that would make the task trivial because the labels are directly based on power.

For a signal-classification experiment, use the [4, 512] signal tensor as the input and treat class_id as the target.

Reproducing the dataset

The extraction code is available in:

text
scripts/dataset.py

The script shows the main steps used to create this dataset:

text
NASA Earthdata
     ↓
NISAR RSLC
     ↓
HH / HV complex data
     ↓
512-sample windows
     ↓
I / Q / amplitude / phase
     ↓
power calculation
     ↓
heuristic labels
     ↓
Parquet

You will need a NASA Earthdata account to access the source data.

🚀 Usage with Hugging Face datasets & Pandas:

python
import pandas as pd
import numpy as np

# Stream or read directly
df = pd.read_parquet("https://huggingface.co/datasets/sandi99/nisar-space-elint-2026/resolve/main/train.parquet")
print(df.head())

# Reconstruct 4-channel tensor
tensor = np.array(df.iloc[0]["signal_tensor"], dtype=np.float32).reshape(4, 512)

Why I made this

I wanted a reasonably small dataset that could be used for experimenting with radar I/Q data and machine-learning models without requiring everyone to download the full NISAR products.

This is an experimental dataset, not an official NASA/ISRO dataset and not an official NISAR benchmark.

Source

The original data comes from NASA's Earthdata archive and the NISAR mission.

Please check the original NISAR data documentation and the applicable NASA/ASF data terms before using the source data for a project.

License

This repository contains processed data derived from NISAR source data.

The repository metadata currently uses:

text
CC BY 4.0

Please check the licensing and usage terms of the original NISAR data before redistributing or using the data commercially.

Disclaimer

This dataset was created for research and experimentation.

The processing, labels, class names and train/test split are my own and are not official NISAR products or classifications.

If you find an issue with the extraction or have a better way to prepare the data, feel free to open an issue or pull request.