MCX N94マイクロコントローラによる高速光学式心拍数センサ

はじめに

フィットネストラッカやスマートウォッチなどのウェアラブルデバイスは、装着者のバイタルサインを測定するために光センサを採用することがよくあります。フォトプレチスモグラフィ(PPG:photoplethysmography)として知られる技術により、これらのセンサは被験者の皮膚組織内の血流と血液量の変化に対応する信号を生成します。このPPG信号は、心拍数、呼吸数、血中酸素飽和度、さらには血圧などのバイタルサインの妥当な推定値を得るために、さまざまなレベルの処理が必要です。心拍数はこれらの中で最も簡単であるため、以下に示すプロジェクトでは、光センサを使用してこの値を導き出す簡単な方法を示します。

この方法は確かに簡単ですが、トレードオフがあります。このフィルタリング演算は非常に計算量が多く、入力されるデータサンプルごとに100回近い乗算命令を必要とします。ほとんどのマイクロコントローラ(MCU)ではこのアルゴリズムを実装するのは困難であり、さらなるトレードオフ(サンプリングレートを下げるなど)を要求される可能性があります。しかし、NXPのMCU「MCX N94」は、DSPアクセラレータを内蔵しているため、このアルゴリズムを高速に実行でき、組み込み設計者に高い柔軟性を提供します。

NXPの優れた評価用ハードウェア、SDK、およびコンフィギュレーションツールは、このプロ ジェクトの開発を大いに促進しました。この記事の残りの部分では、選択されたハードウェアコンポーネントの詳細と、ファームウェアがバイタルサイン検出アプリケーションを実装するためにそれらをどのようにまとめるかについて説明します。

ハードウェア

図1は、このプロジェクトが実働している様子を示しています。明らかに以下の3つの要素で構成されています。


図1: 光センサに指を置くことにより、デモプロジェクトを使って心拍情報を取得するユーザー

FRDM-MCXN947

このプロジェクトのベースとなるのは、MCX N94xシリーズMCUを搭載したFRDM-MCXN947開発ボードです。FRDMプラットフォームは、多数のヘッダによるI/Oアクセスを優先し、プッシュボタン、LED、外部フラッシュメモリなどの基本的なプロトタイピング機能を提供する安価な評価オプションです。FRDM-MCXN947には、CANコネクタ、Ethernetコネクタ、温度センサ、タッチパッドも搭載されています。標準的なArduino、mikroBUS、およびPmodフォームファクタをサポートするとともに、カメラ用とLCD用のヘッダも含まれています。SmartDMA/CameraヘッダはCAMERA-OV7670などのカメラモジュールと互換性があり、FlexIO/LCDヘッダはLCD-PAR-S035などのディスプレイと互換性があります。

このプロジェクトでは、mikroBUSとLCDヘッダの両方を使用してユーザーとのインタフェースを行います。Heart Rate 10 ClickボードはmikroBUSソケットに接続され、ユーザーの指からPPGデータを収集し、LCD-PAR-S035ディスプレイは、カスタムグラフィカルユーザーインターフェース(GUI)を表示するために使用され、後処理されたPPGデータがリアルタイムのグラフとして表示されます。

光センサ

PPGセンサの基本的な動作原理は単純です。光はLEDから皮膚組織に照射され、その一部が循環血液に吸収されます。組織から出た光の強度(反射または透過)は光検出器によって測定され、その強度の経時変化を観察することができます。この変化は、心周期のさまざまな段階における血流の変化に対応しています。

アプリケーション(どのバイタルサインを測定するか、光源に対する光検出器の位置、被験者の活動レベルなど)に応じてさまざまな波長の光が使用されます。光の波長が長ければ長いほど、より深く組織に浸透します。例えば、波長470nmの光(青色光)は毛細血管が存在する表皮までしか届きません。570nmの波長(緑色光)は、より深く、細動脈のある真皮層まで届きます。皮下にある動脈に到達するには、640nmから940nmの波長(赤色光と赤外光)が必要です。多くのPPGセンサは複数のLEDを利用し、順番に素早くオン/オフして複数チャンネルのデータを取得します。図2は、これを簡略化して示したもので、4つのLEDが反射型センサによって用いられ、人間の指先の異なる深度からデータを収集しています。


図2: 複数の波長の光を利用する反射型光センサの基本的な動作原理

Analog DevicesのMAX86916光センサは、ウェアラブルデバイスやモバイルデバイスをターゲットに設計されています。3.5mm × 7.0mm × 1.5mmのパッケージに、4個のLED(赤外、赤、緑、および青)、フォトダイオード、および周囲光キャンセル、クロストークキャンセル、一部のデジタルフィルタ用の低ノイズ回路が集積されています。どのLEDを使用するか、またその順序、各LEDの強度、パルス幅をホスト側で設定できるため、最大限の柔軟性が得られます。内部のADCは19ビットの分解能を持ち、最大3200サンプル/秒(sps:samples per second)のデータレートで動作するようプログラムすることができます。データは、ホストプロセッサがI2Cバス経由で取り出す準備ができるまで、32サンプルデータ用FIFOに保存されます。

MikroElectronikaは、MAX86916センサと簡単にインターフェースする手段として、Heart Rate 10 Click拡張ボードを提供しています。センサ本体以外に、1.8VのLDO(低ドロップアウトレギュレータ)、I2Cバス用の電圧レベルシフタ、および割り込み信号用のプルアップ抵抗が含まれています。このボードはmikroBUSソケットを介してFRDM-MCXN947ボードに接続され、MCUとの接続を確立します。

MCX N947

NXPのMCX NシリーズMCUは、高い演算性能と低消費電力の両方を必要とするアプリケーションをターゲットにしています。デュアルArm Cortex-M33コア、コプロセッサ、アクセラレータ、およびインテリジェントなペリフェラルなどの利用可能な機能により、高速かつ自律的な並列演算が可能です。これにより、レイテンシと消費電力を大幅に削減できます。MCX N94xはこのシリーズの最上位製品で、図3のブロック図に示すように、前述の機能をすべて備えています。


図3: NXPのMCX N94x MCUのブロック図

このプロジェクトで特に興味深いのは、アクセラレータセクションのブロックの1つであるPowerQuad DSPコプロセッサおよびアクセラレータです。このペリフェラルは、一般的なデジタル信号処理(DSP)タスクでCortex-M33を支援することを目的としています。図4にそのブロック図が示され、FIRフィルタ(畳み込み)、FFT/IFFT(高速フーリエ変換/逆高速フーリエ変換)、行列演算(乗算、逆行列、内積、スケーリング)、デュアル双2次IIRフィルタ、三角関数、 超越関数、および逆三角関数用のCORDIC( Volderのアルゴリズム)を実行でき る複数の演算エンジンを備えてい ます。


図4: MCX N94x/54x MCUに搭載されているPowerQuad DSPアクセラレータのブロック図

PowerQuadの各エンジンは、4つの浮動小数点乗算アキュムレータ(MAC:multiply accumulator)ブロックの一部またはすべてを使用し、 並列演算を実行することができます。例えば、FIRフィルタのエンジンは、4つのMAC演算を並列に処理することができるため、基礎となる畳み込み演算を大幅に高速化することができます。畳み込み演算の高速化はフィルタリングの高速化をもたらし、その結果、a)MCUがより多くの時間、低消費電力状態で使えるようになるか、b)信号処理の流れがより高性能になることを意味します。

このシンプルなプロジェクトでは消費電力はあまり気にする必要がないため、オプション(b)を選択し、99タップの大型FIRハイパスフィルタ(HPF)で4つのPPGデータ チャンネルのそれぞれをフィルタリングするためにPowerQuadを使用します。そうすることで、DCオフセットとベースライン変動が除去され、結果として得られる信号はゼロを中心にしたものになります。この効果は、計算量の少ないフィルタリング方法でも達成できますが、PPG波形が大きく変形することになります。これは単純な心拍数検出では必ずしも必要ではありませんが、LCDディスプレイ上にグラフ化されたPPGデータは、心臓活動に関連する特徴を正確に表示することが望まれます。

注: タップの数を増やすと確かにフィルタの性能は向上しますが、演算時間が長くなる以外にもう1つの欠点があります。FIRフィルタの群遅延はフィルタ次数の半分 (\frac{N-1}{2})であり、フィルタ係数の数が増えると出力信号に生じる遅延も大きくなります。したがって、今回採用した99タップのフィルタでは、PPG信号が49サンプル遅延します。これは私たちのプロジェクトでは許容できる範囲ですが、特定のシステムでどれだけの遅延が許容できるかを決定するのはアプリケーションの設計者次第です。

ファームウェア

このアプリケーションのMCUXpressoプロジェクトはGitHubリポジトリにあります。データ収集、データ処理およびGUI制御を実装する高レベルのアプリケーションのコードを見つけるには、source/lvgl_guider.cファイルの PpgTask()関数に移動します。

PPGデータの取得と処理

MAX86916光センサからデータを収集する前に、まず、I2バスを介してその内部レジスタを変更することによって、光センサを設定する必要があります。この作業は簡単で、デバイスのデータシートにこのレジスタの説明があります。このアプリケーションでは、デバイスは4つのLEDを順番に点灯し、それぞれの反射光強度を測定するように設定され、これにより、4チャンネルのPPGデータが生成されます。サンプリングレートは800spsに設定され、「サンプル平均」値は16に設定されています。こうすることで、センサは内部的に16サンプルごとに平均化し、その結果をFIFOに書き込んでMCUに読み込ませるため、実効サンプリングレートは50spsになります。これらのサンプルのうち17個がFIFOに書き込まれると、割り込み信号が割り込みピンからMCUに送信されます。センサの近接機能も有効になります。

近接機能を有効にすると、赤外線LEDは物体がセンサの近くにあるかどうかを判断する近接検出器として二重の役割を果たします。物体がセンサに十分に近づいた場合にのみ、データ収集モードになります。この場合、ユーザーがセンサの上に指を置くと、LEDシーケンス動作がトリガされ、FIFOにサンプルデータが蓄積されます。MCUは、FIFOがいっぱいになる前に、割り込みピンを介して定期的に信号を受け取り、FIFOからデータを読み出します。指がセンサから離れると、データ収集モードが自動的に終了し、消費電力が削減されます。

MCUがセンサのFIFOからサンプルデータのウィンドウを読み取ったら、以前のセクションで説明したように、PowerQuad DSPコプロセッサの支援によりハイパスフィルタにかけます。その結果を下図に示します。元の波形(黒色)には大きなDCオフセットがあり、信号のベースラインは時間の経過とともに変動していることに注意してください。これらの低周波数成分を減衰させ、高周波数成分は影響を受けないようにすることで、赤色で示したゼロ中心の波形が残ります。フィルタリングされたPPG信号の形状が目に見えるほど歪んでいないことにも注目してください。


図5: センサから取得したPPGデータをハイパスフィルタに通した例

十分なサンプルが収集されフィルタにかけられると、それらを使用してユーザーの心拍数の推定値を導き出すことができます。この目的のために用いられる洗練された方法やアルゴリズムは数多くありますが、このプロジェクトでは単純化のために非常にシンプルなアプローチを使用しています。個々の心拍にインデックスを付ける手段として、負のゼロクロス点を検出し、タイムスタンプを押すことで動作します。そして、心拍数の推定値は、それに続く心拍間の時間スパンを平均化し、この「1拍あたりのサンプル数」という指標を「1分あたりの拍数」という指標に変換することで簡単に導き出すことができます。

グラフィカルユーザーインターフェース

LCDドーターボードはシンプルなGUIを表示するために使用され、ユーザーにフィルタリングされた最新のPPGデータと推定心拍数を提供します。これは、NXPのGUI Guiderツールを使用して設計されており、グラフ、プログレスバー、ラベル、画像などのウィジェットをドラッグアンドドロップで配置および設定できるエディタを提供します。図6のスクリーンショットは、このプロジェクトでどのウィジェットを使用し、どのようにレイアウトしたかを示しています。GUI設計が完了したら、このツールを使用してMCUXpressoプロジェクトに実装するCコードを生成できます。


図6: このプロジェクトのGUI設計に使用したNXPのGUI Guiderツールのスクリーンショット

このツールはオープンソースのLVGLグラフィックスライブラリを使用して GUI 要素を実装し、アプリケーションコードはそのハイレベルのインターフェースを使用して GUI の動作を制御し、表示するデータを更新します。これには、最新のPPGデータによるグラフの要素の更新、最新の推定値による心拍数ラベルの更新、異なるアプリケーション状態間でのスムーズな遷移を提供するためのさまざまなアニメーションのトリガなどが含まれます。実際、GUI Guiderが生成するui_animation()関数により、アニメーションのコーディングはよりシンプルになりました。これによって、このアプリケーションの各アニメーションはたった1行のコードで実装できます。

前述のとおり、このアプリケーションでは、ユーザーが光センサに指を置くとデータ収集が開始されます。最初のサンプルがMCUによって収集されると、フィルタの群遅延を超えるまでプログレスバーが順次埋まっていきます。完全に満たされると、プログレスバーは消え、ラベル/画像が現れます。そして、ユーザーがセンサに接触し続ける限り、4つのグラフはフィルタリングされたデータサンプルで継続的に更新され、心拍数は負のゼロクロス点が検出されるたびに更新され、右上隅のハートマークはズームイン/アウトのアニメーションで定期的に「鼓動」します。

ユーザーが指を離し、光センサがデータ取得モードを終了すると、GUIの更新とアニメーションは停止します。再び指を置くとGUIはリセットされ、最初から始まります。

まとめ

このシンプルなプロジェクトは、NXPのMCX N94xシリーズのMCUで実現可能なことのほんの一部にすぎません。特にeIQ Neutron NPUは、組み込みニューラルネットワークの推論時間を劇的に短縮することで、多くの高度なエッジAIアプリケーションへの扉を開きます。例えば、上述の単純な心拍数推定アルゴリズムの代わりに、CNN(畳み込みニューラルネットワーク)またはRNN(再帰型ニューラルネットワーク)モデルを利用することができます。このようなディープラーニングアプローチは、非常にノイズの多いPPG信号が存在する場合でも、より正確で信頼性の高い心拍数の推定を提供できる可能性があります。

言うまでもなく、潜在的なアプリケーションの範囲はヘルスケアの領域をはるかに超えています。このMCUシリーズは、監視カメラやスマートスピーカなどのスマートホーム製品だけでなく、産業分野におけるモータ制御や ロボティクスの課題に対しても優れたソリューションを提供します。どのようなアプリケーションであれ、このプロジェクトがこれから始める際の有用なリソースとなることを願っています。ご質問があれば、返信ボタンをクリックしてお知らせください。




オリジナル・ソース(English)