Skip to content
Back to skills

Eeg Signal Processing

ASecurity

Use when processing EEG signals. Preprocessing, FFT.

  • 2 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 10, 2026
ai-agentspython

Works with

  • cli

Security analysis

A100/100

Scanned September 10, 2026

npx -y skills add LoopyLuci/Skills --skill eeg-signal-processing --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Eeg Signal Processing?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Eeg Signal Processing
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/loopyluci-eeg-signal-processing/badge)](https://www.skillsdirectory.com/skills/loopyluci-eeg-signal-processing)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: eeg-signal-processing
description: "Use when processing EEG signals. Preprocessing, FFT."
version: 1.0.0
author: Hermes Agent
license: MIT
platforms: [linux, macos, windows]
metadata:
  hermes:
    tags: [neurotech, eeg, signal-processing, preprocessing, spectral-analysis]
    related_skills: [neural-interface-design, neurofeedback-analysis]
---

# EEG Signal Processing

## Overview
Process EEG signals for brain-computer interfaces (BCIs), neurofeedback, clinical diagnostics, and cognitive state monitoring. Covers signal preprocessing, artifact removal, spectral analysis, and feature extraction from EEG data.

## When to Use
- "Preprocess EEG signals for BCI applications"
- "Remove artifacts from EEG recordings"
- "Analyze EEG power spectra for cognitive states"
- "Extract features for machine learning classification"
- "Detect event-related potentials in EEG"

## Signal Preprocessing Pipeline

### 1. Noise Reduction
```python
import numpy as np
from scipy import signal
import mne

def preprocess_eeg(raw_eeg, sfreq=256):
    """
    Standard EEG preprocessing pipeline
    
    Args:
        raw_eeg: raw EEG data (channels × samples)
        sfreq: sampling frequency (default 256 Hz)
    
    Returns:
        Preprocessed clean EEG data
    """
    # 1. Notch filter (50/60 Hz mains interference)
    notch_freq = 60 if abs(sfreq - 256) < 8 else 50
    clean_data = apply_notch_filter(raw_eeg, notch_freq, sfreq)
    
    # 2. Bandpass filter (0.5-50 Hz)
    clean_data = apply_bandpass_filter(clean_data, 0.5, 50, sfreq)
    
    # 3. Re-reference to average (reduces common-mode noise)
    clean_data = clean_data - np.mean(clean_data, axis=0)
    
    # 4. Artifact removal (ICA)
    clean_data = remove_artifacts_ica(clean_data)
    
    return clean_data

def apply_notch_filter(data, freq, sfreq, quality=30):
    """Apply notch filter at power line frequency"""
    nyquist = sfreq / 2
    w0 = freq / nyquist
    b, a = signal.iirnotch(w0, quality)
    return signal.filtfilt(b, a, data, axis=1)

def apply_bandpass_filter(data, low_freq, high_freq, sfreq):
    """Apply Butterworth bandpass filter"""
    nyquist = sfreq / 2
    low = low_freq / nyquist
    high = high_freq / nyquist
    b, a = signal.butter(4, [low, high], btype='band')
    return signal.filtfilt(b, a, data, axis=1)
```

### 2. Artifact Removal
| Artifact Type | Frequency Range | Removal Method |
|---------------|----------------|----------------|
| Ocular (blinks, eye movement) | 0.1-10 Hz | ICA, regression |
| Muscle (EMG) | 20-100 Hz | ICA, high-pass filter |
| Cardiac (ECG) | 1-3 Hz | ICA, template removal |
| Line noise | 50/60 Hz | Notch filter |
| Motion artifacts | Broadband | Acceleration correction |

### ICA Artifact Removal
```python
def remove_artifacts_ica(eeg_data, n_components='auto'):
    """
    Independent Component Analysis for artifact removal
    """
    from sklearn.decomposition import FastICA
    
    if n_components == 'auto':
        n_components = min(eeg_data.shape[1] // 3, eeg_data.shape[0])
    
    ica = FastICA(n_components=n_components, random_state=42)
    ica_components = ica.fit_transform(eeg_data.T).T
    
    # Identify artifact components
    artifact_indices = identify_artifactual_components(ica_components, eeg_data)
    
    # Remove artifact components
    clean_components = np.delete(ica_components, artifact_indices, axis=0)
    cleaned_eeg = ica.mixing_ @ ica_components
    
    return cleaned_eeg, artifact_indices

def identify_artifactual_components(components, eeg_data):
    """
    Auto-detect artifacts using variance and spatial patterns
    """
    artifacts = []
    for i, component in enumerate(components):
        # Eye blink components have frontal maximum
        frontal_power = np.var(component[:5])
        total_power = np.var(component)
        if frontal_power / total_power > 0.5:
            artifacts.append(i)
    return artifacts
```

## Spectral Analysis & Feature Extraction
```python
def extract_psd_features(eeg_data, sfreq):
    """
    Extract EEG power spectral density features
    """
    from scipy.signal import welch
    
    nperseg = min(sfreq * 4, eeg_data.shape[1])
    freqs, psd = welch(eeg_data, sfreq, nperseg=nperseg, axis=1)
    
    # Standard EEG bands
    bands = {
        'delta': (0.5, 4),    # Deep sleep
        'theta': (4, 8),      # Memory, meditation
        'alpha': (8, 13),     # Relaxed attention
        'beta': (13, 30),     # Active thinking
        'gamma': (30, 45)     # High-level processing
    }
    
    features = {}
    for band_name, (low, high) in bands.items():
        band_mask = (freqs >= low) & (freqs <= high)
        band_power = np.mean(psd[band_mask, :], axis=0)
        features[f'{band_name}_power'] = np.mean(band_power)
    
    return features

# Example: Alpha asymmetry for emotional state
def alpha_asymmetry(eeg_data, sfreq):
    """
    Left > Right frontal alpha = approach motivation
    Right > Left = withdrawal avoidance
    """
    features = extract_psd_features(eeg_data, sfreq)
    left_frontal_alpha = features['alpha_power'][:3]
    right_frontal_alpha = features['alpha_power'][3:6]
    
    alpha_asymmetry_index = (np.log(left_frontal_alpha.mean()) - 
                            np.log(right_frontal_alpha.mean()))
    
    return {
        "asymmetry_index": round(alpha_asymmetry_index, 4),
        "interpretation": "approach" if alpha_asymmetry_index > 0 else "withdrawal"
    }
```

## Common Pitfalls
1. **Notch filter at wrong frequency** — mains varies by country
2. **Over-filtering** — removing real neural signals
3. **Not removing artifacts** — blink/muscle dominate results
4. **Wrong ICA rejection thresholds** — removing neural signals
5. **Not checking channel quality** — bad electrodes corrupt analysis
6. **Incorrect power band boundaries** — varies by field
7. **No consistent referencing** — affects signal morphology
8. **Insufficient downsampling** — oversampled data wastes compute
9. **Not validating preprocessing** — no quality metrics
10. **Ignoring individual differences** — one-size-fits-all

## Verification Checklist
- [ ] Notch filter frequency confirmed (50/60 Hz)
- [ ] Bandpass filter removes artifacts without distorting
- [ ] ICA components validated manually
- [ ] EEG quality checked (impedance <5kΩ)
- [ ] Power band analysis validated against baselines
- [ ] Artifact rejection rate <15%
- [ ] Referencing consistent (average/Cz/Pz)
- [ ] Pre/post comparison shows artifact reduction
- [ ] Sampling rate ≥256 Hz
- [ ] Results reproducible across sessions

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.