Official implementation of the paper: "HYPERDOA: Robust and Efficient DoA Estimation using Hyperdimensional Computing" (link) - ICASSP 2026, Barcelona, Spain!
- [2026/04] Published version of HYPERDOA is available.
- [2025/10] HYPERDOA preprint is released.
- [2026/01] HYPERDOA is accepted at ICASSP 2026.
HYPERDOA is a lightweight, efficient implementation of HDC-based direction-of-arrival (DOA) estimation for uniform linear arrays.
# Clone the repository
git clone https://github.com/pwh9882/HYPERDOA.git
cd HYPERDOA
# Create virtual environment and install
uv venv
uv pip install -e .
# Or install with dev dependencies
uv pip install -e ".[dev]"git clone https://github.com/pwh9882/HYPERDOA.git
cd HYPERDOA
pip install -e .- Python >= 3.10
- PyTorch >= 2.0
- torch-hd >= 0.6.0
- numpy >= 1.24
- matplotlib >= 3.7
from hyperdoa import HDCAoAModel, DOAConfig, evaluate_hdc
import torch
# Configure system
config = DOAConfig(N=8, M=3, T=100, snr=-5)
# Load your dataset (list of (X, Y) tuples)
# X: Complex tensor (N, T) - sensor observations
# Y: Tensor (M,) - ground truth DOA in radians
train_data = torch.load("data/train_dataset.pt")
test_data = torch.load("data/test_dataset.pt")
# Train and evaluate
loss, model = evaluate_hdc(
train_data, test_data, config,
feature_type="lag", # or "spatial_smoothing"
return_model=True,
)
print(f"Test MSPE: {loss:.2f} dB")HYPERDOA uses datasets generated by SubspaceNet. The dataset format is directly compatible - no conversion needed.
Each dataset is a list of (X, Y) tuples:
| Field | Type | Shape | Description |
|---|---|---|---|
X |
torch.complex64 |
(N, T) |
Sensor observations |
Y |
torch.float64 |
(M,) |
Ground truth DOA in radians |
We provide a script that wraps SubspaceNet's data generation:
# Step 1: Clone SubspaceNet
git clone https://github.com/ShlezingerLab/SubspaceNet.git
# Step 2: Generate datasets with paper settings
uv run python scripts/generate_data.py \
--subspacenet-path ./SubspaceNet \
--output data/ \
--N 8 --M 3 --T 100 \
--snr -5 \
--train-samples 45000 \
--test-samples 2250The following parameters can be used as a starting point:
| Parameter | Value | Description |
|---|---|---|
N |
8 | Number of sensors |
M |
3 or 4 | Number of sources |
T |
100 | Number of snapshots |
SNR |
-5 to -1 dB or 1 to 5 dB | Signal-to-noise ratio (dB) |
signal_nature |
non-coherent / coherent | Signal correlation type |
train_samples |
45,000 | Training set size |
test_samples |
2,250 | Test set size |
You can also use SubspaceNet's own data generation:
# In SubspaceNet directory
import sys
sys.path.insert(0, '.')
from src.system_model import SystemModelParams
from src.data_handler import create_dataset
params = SystemModelParams()
params.N, params.M, params.T = 8, 3, 100
params.snr = -5
params.signal_nature = "non-coherent"
# Generate dataset
model_dataset, generic_dataset, samples_model = create_dataset(
system_model_params=params,
samples_size=45000,
model_type="RawX", # This gives us raw observations
save_datasets=False,
)
# generic_dataset is directly compatible with HYPERDOA!
# Save it:
import torch
torch.save(generic_dataset, "train_dataset.pt")| Feature Type | Description |
|---|---|
lag |
Mean spatial-lag autocorrelation |
spatial_smoothing |
Spatial smoothing covariance |
# Generate data first
uv run python scripts/generate_data.py --subspacenet-path ./SubspaceNet
# Basic training
uv run python examples/train_basic.py --data-dir data/Configuration dataclass for system parameters.
DOAConfig(
N=8, # Number of sensors
M=3, # Number of sources (3 or 4 in paper)
T=100, # Number of snapshots
snr=-5.0, # SNR in dB (-5 to -1 or 1 to 5 in paper)
signal_nature="non-coherent" # or "coherent"
)Main HDC model for DOA estimation.
model = HDCAoAModel(
N=8, M=3, T=100,
feature_type="lag",
n_dimensions=10000, # Hypervector dimensionality
min_angle=-90.0, # Minimum angle (degrees)
max_angle=90.0, # Maximum angle (degrees)
precision=0.1, # Angle resolution (degrees)
min_separation_deg=6.0, # Minimum peak separation
)
# Methods
model.train_from_dataloader(loader) # Train from DataLoader
model.fit(X, y) # Train from tensors
model.predict(X) # Predict angles (radians)
model.predict_multi(X, k=2) # Multi-source prediction
model.predict_logits(X) # Raw classification scores
model.compute_mspe_db(loader) # Compute MSPE (dB)Convenience function for training and evaluation.
loss, model = evaluate_hdc(
train_data, test_data, config,
feature_type="lag",
return_model=True,
verbose=True,
)If you find HYPERDOA useful in your research, please cite:
@INPROCEEDINGS{11464439,
author={Bhattacharjya, Rajat and Park, Woohyeok and Sarkar, Arnab and Oh, Hyunwoo and Imani, Mohsen and Dutt, Nikil},
booktitle={ICASSP 2026 - 2026 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
title={HYPERDOA: Robust and Efficient DoA Estimation Using Hyperdimensional Computing},
year={2026},
volume={},
number={},
pages={20841-20845},
keywords={Antennas;Antenna arrays;Antennas and propagation;Linear antenna arrays;Very large scale integration;Location awareness;Communication systems;Narrowband;Mobile communication;Protocols;DoA estimation;Hyperdimensional Computing;Vector Symbolic Architectures;Robustness;Energy Efficiency},
doi={10.1109/ICASSP55912.2026.11464439}}
- Data generation utilities based on SubspaceNet
- HDC encoding using torchhd
HYPERDOA is licensed under MIT License. For questions or issues, feel free to open an issue. Thank you for using HYPERDOA!