如何在Python中写入EDF文件?并提取信号片段保存为新EDF文件
Python操作EDF文件:写入与信号提取保存
1. 如何在Python中将数据写入EDF文件?
使用pyedflib库可实现EDF文件的写入,核心是通过EdfWriter类,需提前准备信号数据及每个信号的元信息(标签、采样率、物理极值等),示例代码如下:
import pyedflib import numpy as np # 构造模拟信号:2通道,采样率1kHz,时长5秒 sample_rate = 1000 duration = 5 num_samples = sample_rate * duration signal1 = np.random.randn(num_samples) # 通道1数据 signal2 = np.random.randn(num_samples) # 通道2数据 # 定义每个信号的头信息,包含标签、采样率、物理范围等关键参数 signal_headers = [ { 'label': 'EEG_Fp1', 'sample_rate': sample_rate, 'physical_max': 5000, 'physical_min': -5000, 'digital_max': 32767, 'digital_min': -32768, 'dimension': 'uV' }, { 'label': 'EEG_Fp2', 'sample_rate': sample_rate, 'physical_max': 5000, 'physical_min': -5000, 'digital_max': 32767, 'digital_min': -32768, 'dimension': 'uV' } ] # 创建EdfWriter对象并写入数据 with pyedflib.EdfWriter('output.edf', len(signal_headers)) as writer: writer.setSignalHeaders(signal_headers) writer.writeSamples([signal1, signal2])
2. 提取5分钟信号的第一秒并保存为单独EDF文件
基于你提供的读取代码,扩展实现信号提取与保存逻辑:读取原EDF中第一秒的信号数据,复用原文件的信号元信息保证格式一致,再写入新EDF文件,代码如下:
import pyedflib import numpy as np import matplotlib.pyplot as plt file_name = "17335.0001_0001.edf" output_file = "first_second_signal.edf" # 读取原EDF文件 with pyedflib.EdfReader(file_name) as f: signal_labels = f.getSignalLabels() sample_rate = f.getSampleFrequency(0) # 假设所有通道采样率一致 num_channels = f.signals_in_file # 读取所有通道的第一秒信号:采样率1kHz对应取前1000个样本 first_second_signals = [] for ch in range(num_channels): # readSignal(通道索引, 起始样本, 样本数量) signal = f.readSignal(ch, 0, int(sample_rate)) first_second_signals.append(signal) # 可视化第一通道的第一秒信号(可选) fig = plt.figure() ax = plt.axes() ax.plot(first_second_signals[0]) plt.title(f"First Second of {signal_labels[0]}") plt.show() # 将提取的信号写入新EDF文件 with pyedflib.EdfWriter(output_file, num_channels) as writer: # 复用原文件的信号头信息,保证元数据与原文件一致 signal_headers = [] for ch in range(num_channels): header = { 'label': f.getSignalLabels()[ch], 'sample_rate': f.getSampleFrequency(ch), 'physical_max': f.getPhysicalMaximum(ch), 'physical_min': f.getPhysicalMinimum(ch), 'digital_max': f.getDigitalMaximum(ch), 'digital_min': f.getDigitalMinimum(ch), 'dimension': f.getDimension(ch) } signal_headers.append(header) writer.setSignalHeaders(signal_headers) writer.writeSamples(first_second_signals)
关键说明:
- 读取信号时,
readSignal(ch, start, n_samples)的第三个参数为样本数,第一秒的样本数等于信号采样率(如1kHz对应1000个样本)。 - 写入新EDF时复用原文件头信息,可保证新文件的格式、物理单位等与原文件一致,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Hussain
相关产品推荐
相关产品推荐

