Notifications
Clear all
Topic starter 17/08/2025 6:36 pm
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
-
Install dependencies:
pip install numpy matplotlib scipy pyyaml
-
Run the simulation:
python main.py