3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EDFとEDF+を理解する

3
Last updated at Posted at 2026-02-19

はじめに

はじめまして、株式会社IGSAでリサーチアシスタントとして実務訓練を行っているアンです。

European Data Format(EDF)は、マルチチャンネルの生体・物理信号を記録するために設計されたデータフォーマットです。今では、EDFは脳波(EEG)および睡眠ポリソムノグラフィー(PSG)記録の標準です。一方、EDF+はEDFを拡張するために開発されたデータフォーマットです。

この記事では、

  • EDFのデータ構造
  • EDFはEDF+と何が違うのか?
  • 実運用でEDF・EDF+を読み込む
    を中心に、EDF・EDF+を紹介していきます。

生体信号に用いられるデータフォーマットEDF・EDF+について構造・読み方を知りたい方のお役に立てれば幸いです。

データ構造

EDFデータのはASCIIのヘッダーとバイナリのデータ部から構成されます。

ヘッダー部では、最初の256バイトは、このフォーマットのバージョン番号、ローカル患者および記録識別子、記録に関する時刻情報、データレコード数、そして最後に各データレコード内の信号数(ns)を指定します。その後、各信号ごとに256バイトが続き、信号の種類(例:EEG、体温など)、振幅キャリブレーション、および各データレコード内のサンプル数を指定します。この方式により、信号ごとに異なるゲインとサンプリング周波数を記録できます。これで、ヘッダーは256 + (ns * 256)バイトで構成されます。

表にまとめると、
image.png
一方、データ部ではデータの持続時間ごとの各信号のサンプルを記録します。

ヘッダーの例:
image.png
(参照元:https://www.edfplus.info/specs/edf.html )

EEGと直腸温度の24時間記録のヘッダーレコードです。サンプリング周波数はそれぞれ500Hzと0.1Hzです。
記録は1987年9月16日20時35分に開始され、1440分後(2880×30秒)に終了します。なお、EEG Fpz-Czと直腸温度のオフセットはそれぞれ35μVおよび37.3℃であり、ゲインはそれぞれ4.31/μVおよび706.2/℃です。
各30秒のデータレコードには、EEGの15000サンプルに続いて直腸温度信号の3サンプルが含まれます。

EDF+との違い

互換性

EDF+は、複数の非連続記録を1つのファイルに保存することを可能にします。これがEDFとの唯一の非互換点です。その他の機能はすべてEDFと互換できます。

ヘッダー

最初の「reserved」フィールド(44文字)は、データレコードが連続している場合(各データレコードの開始時刻が前のレコードの終了時刻と一致する)、「EDF+C」で始まらなければなりません。一方、データレコードが連続していない場合、「reserved」フィールドは「EDF+D」で始まらなければなりません。追加スペックの詳細はこちら

アノテーション

EDF+では「EDF Annotations」信号を導入します。この信号の値はアノテーションであり、任意の時点に発生できます。この信号はヘッダー内で「EDF Annotations」というラベルを付与することで識別されます。EDFと同様に、ヘッダー内の「各データレコードのサンプル数」フィールドは、この「EDF Annotations」信号が各データレコード内で占有する2バイト整数の数を指定します。ただし、通常の信号サンプルを格納する代わりに、それらの2バイト整数は文字で埋め尽くされます。例えば、テキスト「abc」は「EDF Annotations」信号内で連続するバイト値97、98、99で表現されます。アノテーションがない場合でも、各データレコードの開始時刻を指定するため、EDF+ファイルには少なくとも1つの「EDF Annotations」信号を含める必要があります。

「EDF Annotations」信号で意味を持つヘッダーフィールドは「label」と「各データレコードのサンプル数」のみです。EDF互換性を確保するため、「デジタル最小値」と「デジタル最大値」フィールドにはそれぞれ-32768と32767を記入しなければなりません。「物理的最大値」と「物理的最小値」フィールドには互いに異なる値を含める必要があります。この信号のその他のフィールドは空白で埋めます。

アノテーションは1つのEDF+ファイルに収めず、別のファイルに保存することができます。例えば、Sleep-EDF-Expandedでは、SC4761E0-PSGとSC4761E0-Hypnogramのように、2つのEDF+ファイルにPSGと睡眠ステージアノテーションの記録を保存しています。

データの可視化・操作

データを操作するためにいくつのツールがありますが、この記事が推奨するツールは EDFbrowserです。

ツールの使用例として、Sleep-EDF-Expandedのあるデータを読み込んで見ます。
image.png
信号を選択して、「Add signal(s)」を押すと、

image.png
選択された信号が表示しされます。

データベースでは、Hypnogramファイルに睡眠ステージのアノテーションがあり、それは「Tools」の「Import annotations/events」で導入できます。
image.png
EDF+形式のため、EDF+/BDF+にし、「Import」を押してファイルを選択すると、アノテーションを表示することができました。
image.png

Google Colabでの読みデモ

この記事で使うライブラリー:pyedflib, https://github.com/holgern/pyedflib/

ライブラリーの導入:

pip install pyedflib

デモのために、Sleep-EDF-ExpandedデータベースのあるPSG・Hypnogramファイルをアップロードします。
image.png

以下はファイルを開き、チャンネルラベルと信号の数を表示するデモコードです。

import pyedflib

f = pyedflib.EdfReader("SC4001E0-PSG.edf")

print("Channels:", f.getSignalLabels())
print("Number of signals:", f.signals_in_file)

f.close()

実行結果:image.png

特定のチャンネルのサンプルを得るために、f.readSignal(chn)が使えます。
f.readSignal(0)でEEG Fpz-CZのサンプル配列をゲットできます。image.png

睡眠ステージアノテーションファイルはHypnogramに保存されるため、読み込んだ後にreadAnnotations()でアノテーションの配列が得られます。
image.png

まとめ

EDF・EDF+のデータ構造を紹介しました。
EDF・EDF+は生体信号を保存するために設計されたデータフォーマットです。EDFが連続データのみに対して、EDF+は非連続データとアノテーションを保存できます。最後に、データを読み込む・操作するために、EDFbrowserとpyedflibを紹介しました。

IGSAについて

IGSAは、社会を温かく柔らかく持続的に支えるAIシステムにより、持続可能な幸せを目指す、東京大学松尾・岩澤研究室発のAIカンパニーです。
脳の健康管理アプリ「はなしてね」や、中古品の画像解析SaaS「スグトリ」などのAIプロダクト提供に加え、潜在的な課題に対し柔軟な開発支援を行うパートナー事業を展開。センシングAI技術を活用した状態の定量化と分析により、人の意思決定をサポートしています。

参考URL

[1] https://www.edfplus.info/
[2] https://physionet.org/content/sleep-edfx/1.0.0/
[3] https://pyedflib.readthedocs.io/en/latest/ref/edfreader.html

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?