1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
| import numpy as np
class EEGFeatureExtractor: """ EEG特征提取器 Frontiers 2026综述核心: 关键脑区: - 额叶(Fz, F3, F4):注意力、工作记忆 - 中央区(Cz, C3, C4):运动规划 - 顶叶(Pz, P3, P4):感觉整合 关键频段: - Delta (0.5-4 Hz):深度睡眠 - Theta (4-8 Hz):困倦、冥想 - Alpha (8-12 Hz):放松、闭眼 - Beta (12-30 Hz):活跃思考 - Gamma (30-100 Hz):高级认知 """ def __init__(self, sampling_rate: float = 256.0, channels: list = None): self.fs = sampling_rate self.channels = channels or ["Fz", "F3", "F4", "Cz", "Pz"] self.frequency_bands = { "delta": (0.5, 4), "theta": (4, 8), "alpha": (8, 12), "beta": (12, 30), "gamma": (30, 100) } def extract_band_power(self, eeg_signal: np.ndarray, band: str) -> np.ndarray: """ 提取频段功率 Args: eeg_signal: EEG信号, shape=(N, num_channels) band: 频段名称 Returns: band_power: 频段功率, shape=(num_channels,) """ from scipy.fft import fft low, high = self.frequency_bands[band] N = len(eeg_signal) spectrum = fft(eeg_signal) freq = np.fft.fftfreq(N, 1/self.fs) band_mask = (freq >= low) & (freq <= high) band_power = np.mean(np.abs(spectrum[:, band_mask]) ** 2, axis=1) return band_power def compute_theta_alpha_ratio(self, eeg_signal: np.ndarray) -> float: """ 计算Theta/Alpha比值 疲劳指标:比值越高,疲劳程度越高 Args: eeg_signal: EEG信号 Returns: ratio: Theta/Alpha比值 """ theta_power = self.extract_band_power(eeg_signal, "theta") alpha_power = self.extract_band_power(eeg_signal, "alpha") theta_mean = np.mean(theta_power) alpha_mean = np.mean(alpha_power) ratio = theta_mean / (alpha_mean + 1e-6) return ratio def detect_drowsiness(self, eeg_signal: np.ndarray) -> dict: """ 检测困倦状态 指标: - Theta增加(困倦) - Alpha增加(放松) - Beta减少(活跃降低) Args: eeg_signal: EEG信号 Returns: result: {"state": str, "confidence": float} """ theta_alpha_ratio = self.compute_theta_alpha_ratio(eeg_signal) beta_power = self.extract_band_power(eeg_signal, "beta") beta_mean = np.mean(beta_power) if theta_alpha_ratio > 1.5 and beta_mean < 10: return {"state": "drowsy", "confidence": 0.85} elif theta_alpha_ratio > 1.0 and beta_mean < 20: return {"state": "mild_fatigue", "confidence": 0.75} else: return {"state": "alert", "confidence": 0.9} def detect_cognitive_load(self, eeg_signal: np.ndarray) -> dict: """ 检测认知负荷 指标: - 额叶Theta增加(高负荷) - 额叶Alpha减少(专注) - 顶叶Alpha增加(资源分配) Args: eeg_signal: EEG信号 Returns: result: {"load_level": str, "confidence": float} """ frontal_theta = self.extract_band_power(eeg_signal[:, :3], "theta") frontal_theta_mean = np.mean(frontal_theta) frontal_alpha = self.extract_band_power(eeg_signal[:, :3], "alpha") frontal_alpha_mean = np.mean(frontal_alpha) parietal_alpha = self.extract_band_power(eeg_signal[:, 4:], "alpha") parietal_alpha_mean = np.mean(parietal_alpha) if frontal_theta_mean > 20 and frontal_alpha_mean < 5: return {"load_level": "high", "confidence": 0.85} elif frontal_theta_mean > 10 and parietal_alpha_mean > 8: return {"load_level": "medium", "confidence": 0.75} else: return {"load_level": "low", "confidence": 0.9}
if __name__ == "__main__": extractor = EEGFeatureExtractor(sampling_rate=256.0) N = 2560 num_channels = 5 normal_eeg = np.random.randn(N, num_channels) * 10 drowsy_eeg = normal_eeg.copy() drowsy_eeg[:, :3] += 5 * np.sin(2 * np.pi * 6 * np.arange(N) / 256.0) print("=== 正常状态检测 ===") result_normal = extractor.detect_drowsiness(normal_eeg) print(f"困倦检测: {result_normal}") print("\n=== 困倦状态检测 ===") result_drowsy = extractor.detect_drowsiness(drowsy_eeg) print(f"困倦检测: {result_drowsy}") theta_alpha = extractor.compute_theta_alpha_ratio(drowsy_eeg) print(f"Theta/Alpha比值: {theta_alpha:.2f}")
|