这段代码包含多个函数和主函数,主要用于对数据进行分解和处理。以下是对每个函数和主函数的逐行解释:

  1. def decompose(file, name): 定义了一个名为 decompose 的函数,接收文件路径和名称作为参数,用于对数据进行分解。

  2. data = loadmat(file): 使用 loadmat 函数加载数据文件,并将结果保存在 data 变量中。

  3. frequency = 200: 设置采样频率为200。

  4. decomposed_de = np.empty([0, 62, 5]): 创建一个空的三维数组,用于保存分解后的特征。

  5. label = np.array([]): 创建一个空的一维数组,用于保存标签。

  6. all_label = [1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 0, 1, -1]: 定义一个包含全部标签的列表。

  7. for trial in range(15):: 循环15次,表示15个试验。

  8. tmp_trial_signal = data[name + '_eeg' + str(trial + 1)]: 获取当前试验的信号数据。

  9. num_sample = int(len(tmp_trial_signal[0]) / 100): 计算样本数量。

  10. temp_de = np.empty([0, num_sample]): 创建一个空的二维数组,用于保存临时的特征。

  11. label = np.append(label, [all_label[trial]] * num_sample): 将当前试验的标签重复 num_sample 次,然后添加到标签数组中。

  12. for channel in range(62):: 循环62次,表示62个通道。

  13. trial_signal = tmp_trial_signal[channel]: 获取当前通道的信号数据。

  14. delta = butter_bandpass_filter(trial_signal, 1, 4, frequency, order=3): 调用 butter_bandpass_filter 函数对信号应用Delta频带的带通滤波器,并将结果保存在 delta 变量中。

  15. theta = butter_bandpass_filter(trial_signal, 4, 8, frequency, order=3): 调用 butter_bandpass_filter 函数对信号应用Theta频带的带通滤波器,并将结果保存在 theta 变量中。

  16. alpha = butter_bandpass_filter(trial_signal, 8, 14, frequency, order=3): 调用 butter_bandpass_filter 函数对信号应用Alpha频带的带通滤波器,并将结果保存在 alpha 变量中。

  17. beta = butter_bandpass_filter(trial_signal, 14, 31, frequency, order=3): 调用 butter_bandpass_filter 函数对信号应用Beta频带的带通滤波器,并将结果保存在 beta 变量中。

  18. gamma = butter_bandpass_filter(trial_signal, 31, 51, frequency, order=3): 调用 butter_bandpass_filter 函数对信号应用Gamma频带的带通滤波器,并将结果保存在 gamma 变量中。

  19. DE_delta = np.zeros(shape=[0], dtype=float): 创建一个长度为0的一维浮点型数组,用于保存Delta频带的差分熵。

  20. DE_theta = np.zeros(shape=[0], dtype=float): 创建一个长度为0的一维浮点型数组,用于保存Theta频带的差分熵。

  21. DE_alpha = np.zeros(shape=[0], dtype=float): 创建一个长度为0的一维浮点型数组,用于保存Alpha频带的差分熵。

  22. DE_beta = np.zeros(shape=[0], dtype=float): 创建一个长度为0的一维浮点型数组,用于保存Beta频带的差分熵。

  23. DE_gamma = np.zeros(shape=[0], dtype=float): 创建一个长度为0的一维浮点型数组,用于保存Gamma频带的差分熵。

  24. for index in range(num_sample):: 循环 num_sample 次,表示样本数量。

  25. DE_delta = np.append(DE_delta, compute_DE(delta[index * 100:(index + 1) * 100])): 计算当前样本Delta频带的差分熵,并将结果添加到Delta频带差分熵数组中。

  26. DE_theta = np.append(DE_theta, compute_DE(theta[index * 100:(index + 1) * 100])): 计算当前样本Theta频带的差分熵,并将结果添加到Theta频带差分熵数组中。

  27. DE_alpha = np.append(DE_alpha, compute_DE(alpha[index * 100:(index + 1) * 100])): 计算当前样本Alpha频带的差分熵,并将结果添加到Alpha频带差分熵数组中。

  28. DE_beta = np.append(DE_beta, compute_DE(beta[index * 100:(index + 1) * 100])): 计算当前样本Beta频带的差分熵,并将结果添加到Beta频带差分熵数组中。

  29. DE_gamma = np.append(DE_gamma, compute_DE(gamma[index * 100:(index + 1) * 100])): 计算当前样本Gamma频带的差分熵,并将结果添加到Gamma频带差分熵数组中。

  30. temp_de = np.vstack([temp_de, DE_delta]): 将Delta频带的差分熵数组作为一行添加到临时特征数组中。

  31. temp_de = np.vstack([temp_de, DE_theta]): 将Theta频带的差分熵数组作为一行添加到临时特征数组中。

  32. temp_de = np.vstack([temp_de, DE_alpha]): 将Alpha频带的差分熵数组作为一行添加到临时特征数组中。

  33. temp_de = np.vstack([temp_de, DE_beta]): 将Beta频带的差分熵数组作为一行添加到临时特征数组中。

  34. temp_de = np.vstack([temp_de, DE_gamma]): 将Gamma频带的差分熵数组作为一行添加到临时特征数组中。

  35. temp_trial_de = temp_de.reshape(-1, 5, num_sample): 将临时特征数组重塑为三维数组,形状为(样本数量,频带数量,样本长度)。

  36. temp_trial_de = temp_trial_de.transpose([2, 0, 1]): 转置三维数组的维度顺序。

  37. decomposed_de = np.vstack([decomposed_de, temp_trial_de]): 将重塑后的试验特征数组添加到分解后特征的数组中。

  38. print("trial_DE shape:", decomposed_de.shape): 打印试验特征的形状。

  39. return decomposed_de, label: 返回分解后的特征和标签。

  40. def butter_bandpass(lowcut, highcut, fs, order=5):: 定义了一个带通滤波器的函数,接收低频截断、高频截断、采样频率和阶数作为参数,返回滤波器的系数。

  41. def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):: 定义了一个应用带通滤波器的函数,接收原始数据、低频截断、高频截断、采样频率和阶数作为参数,返回滤波后的信号。

  42. def compute_DE(signal):: 定义了计算差分熵(DE)的函数,接收信号作为参数,返回计算结果。

  43. file_path = 'D:/project/4D-CRNN/SEED/Preprocessed_EEG/': 设置数据文件的路径。

  44. people_name = ['1_20131027', '1_20131030', '1_20131107', ...]: 定义一个包含数据文件名称的列表,用于遍历所有数据文件。

  45. short_name = ['djc', 'djc', 'djc', 'mhw', 'mhw', ...]: 定义一个包含简短名称的列表,用于标识数据文件的来源。

  46. X = np.empty([0, 62, 5]): 创建一个空的三维数组,用于保存特征。

  47. y = np.empty([0, 1]): 创建一个空的二维数组,用于保存标签。

  48. for i in range(len(people_name)):: 循环遍历所有数据文件。

  49. file_name = file_path + people_name[i]: 拼接文件路径和文件名。

  50. decomposed_de, label = decompose(file_name, short_name[i]): 调用 decompose 函数,获取分解后的特征和标签。

  51. X = np.vstack([X, decomposed_de]): 将分解后的特征添加到特征数组中。

  52. y = np.append(y, label): 将标签添加到标签数组中。

  53. np.save("D:/project/4D-CRNN/SEED/DE0.5s/X_1D.npy", X): 将特征数组保存为 .npy 格式的文件。

  54. np.save("D:/project/4D-CRNN/SEED/DE0.5s/y.npy", y): 将标签数组保存为 .npy 格式的文件。

  55. X = np.load('D:/project/4D-CRNN/SEED/DE0.5s/X_1D.npy'): 加载特征数组。

  56. y = np.load('D:/project/4D-CRNN/SEED/DE0.5s/y.npy'): 加载标签数组。

  57. X89 = np.zeros((len(y), 8, 9, 5)): 创建一个初始值为0的四维数组,用于保存转换后的特征。

  58. X89[:, 0, 2, :] = X[:, 3, :]: 将原始特征中的某一部分复制到转换后的特征中。

  59. X89[:, 0, 3:6, :] = X[:, 0:3, :]: 将原始特征中的某一部分复制到转换后的特征中。

  60. X89[:, 0, 6, :] = X[:, 4, :]: 将原始特征中的某一部分复制到转换后的特征中。

  61. for i in range(5):: 循环5次,表示5个频带。

  62. X89[:, i + 1, :, :] = X[:, 5 + i * 9:5 + (i + 1) * 9, :]: 将原始特征中的某一部分复制到转换后的特征中。

  63. X89[:, 6, 1:8, :] = X[:, 50:57, :]: 将原始特征中的某一部分复制到转换后的特征中。

  64. X89[:, 7, 2:7, :] = X[:, 57:62, :]: 将原始特征中的某一部分复制到转换后的特征中。

  65. np.save("D:/project/4D-CRNN/SEED/DE0.5s/X89.npy", X89): 将转换后的特征保存为 .npy 格式的文件。

希望以上解释对您有所帮助!如果还有其他问题,请随时提问。

Python EEG 数据分解和处理代码详解 - SEED 数据集

原文地址: https://www.cveoy.top/t/topic/N9K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录