This repository contains partial source code for the results presented in the paper
accepted for presentation at the 26th IEEE Workshop on Signal Processing and Artificial Intelligence in Wireless Communications (SPAWC 2025) and available as a preprint on arXiv.
The presentation poster providing a visual overview of our work is also available for download.
Based on a Wi-Fi Channel State Information (CSI) dataset collected with ESPARGOS, we demonstrate that channel charting methods can be used for passive target localization. Algorithms and neural network architectures developed for channel charting with active mobile transmitters can be applied to a scenario with static transmitters and receivers and a mobile target. By leveraging the dimensionality reduction approach of channel charting and using a Siamese neural network trained in a self-supervised manner, we can more accurately localize the passive target without requiring labelled training data.
For our evaluations, we use the espargos-0007 CSI dataset, which was collected indoors with a distributed setup of four ESPARGOS Wi-Fi sensing antenna arrays.
The passive target is a robot wrapped in aluminium foil, or a human, which moves around in the measurement area while four static Wi-Fi transmitters constantly spam beacon frames.
As in conventional channel charting, we train a neural network to reconstruct a physically interpretable map of target positions from similarities in high-dimensional channel state information (CSI).
Our results indicate that passive channel charting (PCC) can outperform classical localization methods like triangulation in terms of localization accuracy. This comes at the cost of overfitting to a particular target type, which is an issue that channel charting with an active transmitter does not have.
The neural networks for fingerprinting and channel charting are trained on a training set with the robot as passive target.
| Reference Positions (Tachymeter) | Channel Chart Training |
|---|---|
![]() |
![]() |
Performance of the neural network-based approaches and classical triangulation were evaluated using a test set of previously unseen CSI.
| Reference Positions (Tachymeter) | Classical: Estimated Positions |
|---|---|
![]() |
![]() |
| Channel Chart | Fingerprinting: Estimated Positions |
|---|---|
![]() |
![]() |
| Reference Positions (Tachymeter) | Classical: Estimated Positions |
|---|---|
![]() |
![]() |
| Channel Chart | Fingerprinting: Estimated Positions |
|---|---|
![]() |
![]() |
| Method | Target | MAE | DRMS | CEP | R95 | KS | CT / TW |
|---|---|---|---|---|---|---|---|
| Classical AoA | Robot | 0.434 m | 0.694 m | 0.261 m | 1.368 m | 0.273 | 0.927/0.922 |
| Fingerprinting | Robot | 0.120 m | 0.145 m | 0.104 m | 0.268 m | 0.067 | 0.996/0.996 |
| Augmented PCC | Robot | 0.246 m | 0.295 m | 0.208 m | 0.581 m | 0.129 | 0.988/0.990 |
| Classical AoA | Human | 0.322 m | 0.499 m | 0.227 m | 0.775 m | 0.123 | 0.989/0.988 |
| Fingerprinting | Human | 0.465 m | 0.630 m | 0.308 m | 1.352 m | 0.206 | 0.966/0.978 |
| Augmented PCC | Human | 0.550 m | 0.724 m | 0.383 m | 1.565 m | 0.236 | 0.959/0.972 |
MAE = mean absolute error, DRMS = distance root mean squared, CEP = circular error probable, R95 = 95th error percentile, KS = Kruskal Stress, CT/TW = Continuity / Trustworthiness
Our code is based on Python, TensorFlow, NumPy, SciPy and Matplotlib. Source files are provided as Jupyter Notebooks, which can be opened directly here on GitHub or using, e.g., JupyterLab.
We run our Channel Charting experiments on a JupyterHub server with NVMe storage, AMD EPYC 7262 8-Core Processor, 32GB RAM, and a NVIDIA GeForce RTX 4080 GPU for accelerating TensorFlow. All indications of computation times are measured on this system.
The Jupyter Notebooks in this repository are numbered. You must execute them in the right order. You may choose to skip step 2 if you are not interested in the supervised training performance, but you must perform all other steps to learn a channel chart in step 6.
0_DownloadDataset.ipynb: Download the necessary parts of theespargos-0007dataset that we use for training and testing.1_ClutterChannels.ipynb: Estimate unwanted clutter in the CSI data using the CRAP algorithm and store the resulting clutter channels. These will be used in all subsequent notebooks to remove the clutter as a first CSI processing step.2_SupervisedBaseline.ipynb: Predict the position of the passive target using CSI fingerprinting with a neural network.3_AoA_Estimation.ipynb: Estimate the angle of arrival for each CSI cluster and each receiving antenna array using the unitary root MUSIC algorithm and store the results.4_Triangulation.ipynb: Predict the position of the passive target using classical triangulation of the AoA estimates for all antenna arrays. Also store the triangulation results for the next step.5_DissimilarityMatrix.ipynb: Compute the fused dissimilarity matrix (angle delay profile + timestamp-based) and its geodesic version. Scale the distances to meters using the triangulation estimates.6_ChannelCharting.ipynb: Train the neural network that implements the forward charting function (FCF), first with a loss function that uses the previously computed geodesic dissimilarity matrix. Training is based on a Siamese neural network. In order to obtain a channel chart in global coordinates without an additional transform, train an alternative augmented FCF that also incorporates the computed AoA estimates into the loss function.
@inproceedings{euchner2025passive,
title = {{Passive Channel Charting: Locating Passive Targets using Wi-Fi Channel State Information}},
author = {Euchner, Florian and Kellner, David and Stephan, Phillip and ten Brink, Stephan},
year = {2025},
booktitle = {26th IEEE Workshop on Signal Processing and Artificial Intelligence in Wireless Communications (SPAWC 2025)},
url = {https://arxiv.org/abs/2504.09924}
}













