Keivan Faghih Niresi, Dorina Thanou, and Olga Fink
IEEE Signal Processing Letters, 2026.
This repository accompanies the paper “Graph Signal Separation With Learnable Spectral Filters”, which studies recovery of latent graph signals from a single noisy mixture by using source-specific graphs and unsupervised learnable spectral filtering.
Implementation status: This repository provides the paper's fixed-random-input learnable spectral filtering approach, optimized using Adam, alongside a closed-form least-squares solution in the truncated graph Fourier domain. As discussed in the paper, both approaches are theoretically equivalent in this scenario and are expected to yield identical separation results upon convergence, up to numerical precision.
.
├── Demo.ipynb # Real-world data comparison
├── sensor_data.pt # Small paired signals used by the illustration
├── spectral_lsf/
│ ├── __init__.py
│ ├── spectral.py # Graphs, learnable spectral gains, LS separation, oracle sweep
│ └── plotting.py # Visualization utilities
├── requirements.txt
├── CITATION.cff
└── README.md
Python 3.10+ is recommended. In a new environment:
python -m venv .venv
source .venv/bin/activate # Windows: .venv\\Scripts\\activate
pip install -r requirements.txt
jupyter labOpen Demo.ipynb and run its cells from top to bottom. The notebook uses the included sensor_data.pt.
import torch
from spectral_lsf import build_graph, closed_form_spectral, make_noisy_mixture, seed_everything
seed_everything(42)
data = torch.load("sensor_data.pt", weights_only=True)
x_temperature = data["x_temperature"]
x_pressure = data["x_pressure"]
mixed, _ = make_noisy_mixture(x_temperature, x_pressure, noise_std=0.2)
L_temperature = build_graph(x_temperature, k=5)
L_pressure = build_graph(x_pressure, k=5)
# GSS-LSF (paper's learnable spectral-filter parameterization)
from spectral_lsf import learnable_spectral_filters
result = learnable_spectral_filters(L_temperature, L_pressure, mixed, k1=5, k2=5)
x_temperature_hat, x_pressure_hat = result.temperature, result.pressure
# Closed-form truncated-basis baseline for GSS-LSF
baseline_temperature, baseline_pressure = closed_form_spectral(
L_temperature, L_pressure, mixed, k1=5, k2=5
)If you use or build on this research, please cite:
@article{niresi2026graph,
title = {Graph Signal Separation With Learnable Spectral Filters},
author = {Faghih Niresi, Keivan and Thanou, Dorina and Fink, Olga},
journal = {IEEE Signal Processing Letters},
year = {2026},
doi = {10.1109/LSP.2026.3705721}
}