はじめに
はじめまして、株式会社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)バイトで構成されます。
表にまとめると、

一方、データ部ではデータの持続時間ごとの各信号のサンプルを記録します。
ヘッダーの例:

(参照元: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のあるデータを読み込んで見ます。

信号を選択して、「Add signal(s)」を押すと、
データベースでは、Hypnogramファイルに睡眠ステージのアノテーションがあり、それは「Tools」の「Import annotations/events」で導入できます。

EDF+形式のため、EDF+/BDF+にし、「Import」を押してファイルを選択すると、アノテーションを表示することができました。

Google Colabでの読みデモ
この記事で使うライブラリー:pyedflib, https://github.com/holgern/pyedflib/
ライブラリーの導入:
pip install pyedflib
デモのために、Sleep-EDF-ExpandedデータベースのあるPSG・Hypnogramファイルをアップロードします。

以下はファイルを開き、チャンネルラベルと信号の数を表示するデモコードです。
import pyedflib
f = pyedflib.EdfReader("SC4001E0-PSG.edf")
print("Channels:", f.getSignalLabels())
print("Number of signals:", f.signals_in_file)
f.close()
特定のチャンネルのサンプルを得るために、f.readSignal(chn)が使えます。
f.readSignal(0)でEEG Fpz-CZのサンプル配列をゲットできます。
睡眠ステージアノテーションファイルはHypnogramに保存されるため、読み込んだ後にreadAnnotations()でアノテーションの配列が得られます。

まとめ
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

