Preprocessing Steps Applied to CSI Data in WiFi-DensePose: A Complete Technical Guide

The WiFi-DensePose pipeline applies three mandatory preprocessing steps to raw CSI data—noise removal via threshold filtering, Hamming windowing to reduce spectral leakage, and amplitude normalization to unit variance—implemented in the CSIProcessor.preprocess_csi_data method within v1/src/core/csi_processor.py.

The ruvnet/wifi-densepose repository implements a sophisticated WiFi-based human pose estimation system that relies on Channel State Information (CSI) data. Before feature extraction or human detection algorithms can process this raw signal data, specific preprocessing steps applied to CSI data must standardize the input and remove artifacts. This article examines the exact implementation details, configuration options, and source code structure of the preprocessing pipeline.

Overview of the CSI Preprocessing Pipeline

The preprocessing logic resides in the CSIProcessor class, specifically within the preprocess_csi_data method defined in v1/src/core/csi_processor.py. By default, preprocessing is enabled through the enable_preprocessing configuration flag (line 77), which triggers a sequential three-stage transformation of the raw CSIData object. If disabled, the method returns the raw data unchanged (lines 126-128).

Each preprocessing stage is encapsulated in a private helper method, enabling independent unit testing and modular replacement of specific signal processing techniques.

Step-by-Step Preprocessing Implementation

1. Noise Removal via Threshold Filtering

The first preprocessing step, implemented in _remove_noise (lines 313-332), eliminates low-amplitude noise that could corrupt subsequent frequency-domain analysis. The method operates on the amplitude matrix of the CSI data, creating a boolean mask based on a configurable noise_threshold parameter (default typically set in configuration).

Amplitude values below the threshold, measured in decibel-scaled signal strength, are zeroed out. The method returns a new CSIData instance containing the filtered amplitude matrix and updates the metadata dictionary with a noise_filtered flag set to True, enabling downstream components to verify which transformations have been applied.

2. Spectral Leakage Reduction with Hamming Windowing

Following noise removal, the _apply_windowing method (lines 334-350) applies a Hamming window across the sub-carrier dimension to mitigate spectral leakage effects before any Fast Fourier Transform (FFT) or frequency-domain feature extraction. Spectral leakage occurs when the signal frequency components do not align perfectly with the discrete frequency bins of the transform, causing energy to spread across adjacent bins.

The Hamming window function tapers the signal at the boundaries of the analysis window, reducing discontinuities that cause leakage artifacts. The windowed amplitude data is encapsulated in a new CSIData object with the windowed metadata flag set to True.

3. Amplitude Normalization to Unit Variance

The final preprocessing stage, _normalize_amplitude (lines 352-368), standardizes the amplitude matrix to unit variance, ensuring that subsequent machine learning models and feature extraction algorithms are not biased by absolute signal strength variations caused by differing transmitter-receiver distances or environmental attenuation.

This normalization scales the amplitude values such that the resulting distribution has a variance of one, preserving the relative relationships between sub-carrier amplitudes while removing magnitude-dependent artifacts. The method returns a CSIData instance marked with the normalized flag in its metadata.

How to Configure CSI Preprocessing in WiFi-DensePose

The preprocessing pipeline is controlled through the configuration dictionary passed to the CSIProcessor constructor. By default, enable_preprocessing is set to True, activating all three stages automatically when preprocess_csi_data is invoked.

Enabling the Full Preprocessing Pipeline

To process raw CSI data with the complete preprocessing workflow, instantiate the processor with default or explicit preprocessing enabled:

from v1.src.core.csi_processor import CSIProcessor
from v1.src.hardware.csi_extractor import CSIData

# Configuration with preprocessing enabled (default behavior)

config = {
    "sampling_rate": 1000,
    "window_size": 256,
    "overlap": 0.5,
    "noise_threshold": -80,          # dB threshold for noise removal

    "human_detection_threshold": 0.8,
    "enable_preprocessing": True,    # Explicitly enable (default True)

    "enable_feature_extraction": True,
    "enable_human_detection": True,
}

processor = CSIProcessor(config)

# Assume `raw_csi` is a CSIData instance from hardware extraction

preprocessed = processor.preprocess_csi_data(raw_csi)

print("Metadata after preprocessing:", preprocessed.metadata)

# Output includes: noise_filtered, windowed, normalized flags

Disabling Preprocessing for Custom Pipelines

For researchers implementing alternative signal processing techniques or working with already-cleaned datasets, preprocessing can be bypassed entirely:


# Disable preprocessing in configuration

config["enable_preprocessing"] = False
processor = CSIProcessor(config)

# Returns raw CSIData unchanged (lines 126-128 in csi_processor.py)

preprocessed = processor.preprocess_csi_data(raw_csi)

When disabled, the preprocess_csi_data method returns the input CSIData object directly without invoking _remove_noise, _apply_windowing, or _normalize_amplitude.

Summary

The WiFi-DensePose repository implements a robust three-stage preprocessing pipeline for CSI data that standardizes raw channel measurements before pose estimation:

  • Noise removal eliminates low-amplitude artifacts using a configurable decibel threshold in _remove_noise (lines 313-332).
  • Hamming windowing reduces spectral leakage across sub-carriers via _apply_windowing (lines 334-350).
  • Unit variance normalization ensures amplitude consistency through _normalize_amplitude (lines 352-368).

Each stage is encapsulated in the CSIProcessor class within v1/src/core/csi_processor.py, with the enable_preprocessing configuration flag controlling whether the pipeline executes or returns raw data unchanged.

Frequently Asked Questions

What is the default noise threshold for CSI preprocessing in WiFi-DensePose?

The default noise threshold is configurable through the noise_threshold parameter in the processor configuration dictionary, typically set to -80 dB as shown in the repository examples. This value determines which amplitude measurements are zeroed out during the _remove_noise stage, though users can adjust this threshold based on their specific hardware sensitivity and environmental noise floors.

Can I disable specific preprocessing steps while keeping others active?

No, the current implementation in v1/src/core/csi_processor.py treats preprocessing as an atomic operation controlled by the single enable_preprocessing boolean flag. When enabled, all three stages—noise removal, windowing, and normalization—execute sequentially. To implement selective preprocessing, you would need to subclass CSIProcessor and override the preprocess_csi_data method to call specific private helpers (_remove_noise, _apply_windowing, or _normalize_amplitude) individually.

How does the Hamming window reduce spectral leakage in CSI data?

The Hamming window function tapers the CSI amplitude signal at the boundaries of the analysis window, minimizing discontinuities that cause energy to spread across adjacent frequency bins during Fourier analysis. In _apply_windowing (lines 334-350), the window is applied across the sub-carrier dimension, creating a weighted amplitude matrix that preserves the central signal information while suppressing edge artifacts that characterize spectral leakage.

Where is the preprocessing output validated in the test suite?

Unit tests for the preprocessing pipeline reside in v1/tests/unit/test_csi_processor_tdd.py, which validates each private helper method (_remove_noise, _apply_windowing, _normalize_amplitude) under the Test-Driven Development (TDD) approach. These tests verify that metadata flags (noise_filtered, windowed, normalized) are correctly set, that amplitude matrices are transformed according to mathematical specifications, and that the enable_preprocessing flag properly bypasses the pipeline when set to False.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →