Skip to content
Keiv4nPublic

About

Implementation for GSS-LSF

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

Repository files navigation

Graph Signal Separation with Learnable Spectral Filters (GSS-LSF)

Paper Preprint Institution

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.

Contents

.
├── 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

Setup

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 lab

Open Demo.ipynb and run its cells from top to bottom. The notebook uses the included sensor_data.pt.

Minimal Python example

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
)

Citation

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}
}

About

Implementation for GSS-LSF

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages