MNE读取数据单位问题
问题描述
在用同一个数据,两种数据读取方法,分别进行AI网络推理的时候,发现结果大相径庭。
经过调查是单位问题!
-
在一些 EDF 文件中,数据可能以微伏(uV)为单位存储,
mne.io.read_raw_edf
读取时 会自动将其转换为伏(V)。 -
方式一:使用raw.get_data(picks=picks),读取具体通道数据的时候,单位并不会自动转化。
-
方式二:使用
raw.to_data_frame()
将数据转换为 Pandas DataFrame 时,MNE 也会自动进行单位转换,使得数据以更易读的形式展示。
这就导致了方式一的值比方式二的值小了1e6,从而网络推理的时候结果异常,因为网络输入前没有使用归一化。
def get_edf_data(path, picks):"""输入edf文件地址和通道名称返回信号数据, 形状为 (epoch_num, channels, epoch_length)"""raw = mne.io.read_raw_edf(path, preload=True, verbose=False)# 检查通道和采样频率print('数据通道名称:', raw.ch_names)print('数据采样率:', raw.info['sfreq'])# raw数据下采样为100Hztarget_fs = 100raw.resample(target_fs, npad="auto")print('数据下采样为:', target_fs)# 选择需要的通道data = raw.get_data(picks=picks)print("选择通道:", picks)# 数据格式化为模型输入所需的形状data = data.T # 转置后的数据形状为 (samples, channels)epoch_length = 30 * target_fs # 1个epoch是30秒epoch_num = data.shape[0] // epoch_lengthdata = data[:epoch_length * epoch_num] # 丢弃末尾多余的数字data = data.reshape(-1, epoch_length, len(picks)).transpose(0, 2, 1)print("data的shape:", data.shape)# 乘以 1e6data *= 1e6print("首个data的具体数值:", data[0, 0, :10])print("****************")EPOCH_SEC_SIZE = 30raw = mne.io.read_raw_edf(path, preload=True, verbose=False, stim_channel=None)# raw数据下采样为100Hztarget_fs = 100raw.resample(target_fs, npad="auto")sampling_rate = raw.info['sfreq']raw_ch_df = raw.to_data_frame()[picks] #n_trims = len(raw_ch_df) % int(EPOCH_SEC_SIZE * sampling_rate)raw_ch = raw_ch_df.values[:-n_trims]n_epochs = int(len(raw_ch) / (EPOCH_SEC_SIZE * sampling_rate))data_2 = np.asarray(np.split(raw_ch, n_epochs)).astype(np.float32)data_2 = data_2.reshape(-1, epoch_length, len(picks)).transpose(0, 2, 1)print("data_2的shape:", data_2.shape)print("首个data_2的具体数值:", data_2[0, 0, :10])sys.exit(0) # 正常退出return data