You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:54:56