Forum

Notifications
Clear all

BCI – Magnetoencephalography device source code

1 Posts
1 Users
0 Reactions
17 Views
 josh
(@josh)
Member Admin
Joined: 2 months ago
Posts: 510
Topic starter  

Here’s a Python project structure for simulating or processing Magnetoencephalography (MEG) data. This project is designed for educational and research purposes, focusing on MEG signal simulation, preprocessing, and visualization.


🧠 What Is MEG?

Magnetoencephalography measures magnetic fields produced by neural activity in the brain. It’s used for functional brain mapping, epilepsy diagnosis, and cognitive neuroscience.


🗂️ Folder Structure

meg_simulator/
├── main.py
├── config/
│   └── settings.yaml
├── data/
│   └── synthetic_meg.npy
├── processing/
│   ├── __init__.py
│   ├── simulator.py
│   └── filter.py
├── visualization/
│   ├── __init__.py
│   └── plotter.py
├── utils/
│   ├── __init__.py
│   └── logger.py

📄 config/settings.yaml

meg:
  channels: 306
  duration: 10          # seconds
  sample_rate: 1000     # Hz
  signal_frequency: 10  # Hz
  noise_level: 0.2

📄 processing/simulator.py

import numpy as np
import yaml

def simulate_meg_signal(channels, duration, sample_rate, signal_freq, noise_level):
    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
    signal = np.sin(2 * np.pi * signal_freq * t)
    data = np.array([
        signal + noise_level * np.random.randn(len(t))
        for _ in range(channels)
    ])
    np.save("data/synthetic_meg.npy", data)
    return data

📄 processing/filter.py

from scipy.signal import butter, filtfilt

def bandpass_filter(data, lowcut, highcut, sample_rate, order=4):
    nyq = 0.5 * sample_rate
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    return filtfilt(b, a, data)

📄 visualization/plotter.py

import matplotlib.pyplot as plt
import numpy as np

def plot_meg_channels(data, num_channels=5):
    plt.figure(figsize=(12, 6))
    for i in range(num_channels):
        plt.plot(data[i], label=f'Channel {i+1}')
    plt.title("Simulated MEG Signals")
    plt.xlabel("Time (samples)")
    plt.ylabel("Amplitude")
    plt.legend()
    plt.tight_layout()
    plt.show()

📄 utils/logger.py

from datetime import datetime

def log_event(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"[{timestamp}] {message}")

📄 main.py

import yaml
from processing.simulator import simulate_meg_signal
from processing.filter import bandpass_filter
from visualization.plotter import plot_meg_channels
from utils.logger import log_event

def load_config():
    with open("config/settings.yaml", "r") as f:
        return yaml.safe_load(f)["meg"]

def main():
    config = load_config()
    log_event("Simulating MEG data...")
    raw_data = simulate_meg_signal(
        config["channels"],
        config["duration"],
        config["sample_rate"],
        config["signal_frequency"],
        config["noise_level"]
    )

    log_event("Filtering MEG data...")
    filtered_data = bandpass_filter(raw_data, 1, 40, config["sample_rate"])

    log_event("Plotting MEG data...")
    plot_meg_channels(filtered_data)

if __name__ == "__main__":
    main()

🧪 How to Run

  1. Install dependencies:

    pip install numpy matplotlib scipy pyyaml
    
  2. Run the simulation:

    python main.py
    

 


   
Quote
Share: