chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

BMI用にデジタルフィルタを試作

OpenBCIの脳波信号を入力とするBMI/BCI用アプリを自作しているのだが、とりあえずOpenBCIが出力する生の脳波信号はUSBシリアルのドングル経由で取得できるようになった。次にやるべきは、デジタルフィルタにより余計な信号を取り除き、必要な情報だけを抽出する作業。これはノッチフィルタとかバンドパスフィルタと呼ばれ、OpenBCI_GUIでも実装されている。自分はフィルタについて全くわかっていないので、まずはOpenBCIが開発したOpenBCI_GUIで使われているデジタルフィルタ(Processingで記述)をそっくりそのままPythonで書き直してみた。以下が試作したフィルタ関数(仕様は、1Hz-50Hzまでを通過させるバンドパスフィルタ)(オリジナルソースは、OpenBCI_GUIのmath.pde 95行目のfilterIIR関数)


# filt_txt = "Bandpass 1-50Hz";
filt_b = ( 2.001387256580675e-001, 0.0, -4.002774513161350e-001, 0.0, 2.001387256580675e-001)
filt_a = (1.0, -2.355934631131582e+000, 1.941257088655214e+000, -7.847063755334187e-001, 1.999076052968340e-001)

def filterIIR(filt_b, filt_a, data):

Nback = len(filt_b)
prev_y = [0]* Nback
prev_x = [0]* Nback

#step through data points
for i in range(0,len(data)):

# shift the previous outputs
for j in range(Nback-1,0,-1):
prev_y[j] = prev_y[j-1]
prev_x[j] = prev_x[j-1]

#add in the new point
prev_x[0] = data[i]

#compute the new data point
out = 0
for j in range(0,Nback):
out += filt_b[j]*prev_x[j]
if j > 0:
out -= filt_a[j]*prev_y[j]

#save output value
prev_y[0] = out
data[i] = out

自作のデータ取得ツールでOpenBCIハードから受信した脳波データに対してフィルタをかけてみた。この結果が左の図。上がフィルタ前の信号の波形、0Vから大きく外れて、しかもドリフトしている。下がフィルタ後の波形。0Vを中心に振れているけど、かなりの信号がフィルタされている。電源ノイズと思われる細かい信号がフィルタされているのは効果的としても、50Hz以下の信号(緩やかに波打つ信号(50Hzよりも低い周波数))まですっぽり落ちてるようにも思えるのだが。。デジタルフィルタで何をやっているのか?は大体わかったので自分なりに必要とする情報が得られるようにフィルタを作ればいいのだろう。。しかし、大元の理論が分からん、無限インパルス応答(IIR)というらしいですが。

■今後の取り組み

OpenBCIの設計上、アナログフロントエンドのADS1299は基準電位4.5Vに対して24bitの分解能で250Hzで16ch(頭の電極が16か所)のサンプリングしているが、USBシリアルで取得できる脳波データは、16chの場合、250fpsではなくて、実力値としては、250*1/2 fpsとなっている。この理由として、USBシリアルのパケットは1フレーム8chで構成されており、16ch分揃うには2フレーム必要になるため。なぜもっとスピードを上げないのか?と疑問に思うかもしれませんが、本体とドングル間の無線通信(BLE)の性能上限によるものらしいです。だから、、FPSの性能は半分。欠ける情報は2フレーム分の平均値で代用されている(OpenBCIの仕様書より)。平均化されない本来の250fpsの脳波信号を得るには本体に付属されるSDカードのデータを用いるべき。BMIで機器制御するのには、USBシリアルでPCでデータ取得してリアルタイムで処理する必要があるけど、最初のうちは脳波信号に対して、どんな特徴があるのか?どういうアルゴリズムが有効であるか?を明らかにするため、フィルタかけたり、FFTしたり機械学習したりするのが主な作業なので、むりにリアルタイムに処理せず、SD経由でデータをPCに落として、MATLABとかSCILAB等の数値演算ソフトやPythonの?機械学習ライブラリ等を使いながらどうやったらデータ分析できるのかをじっくり取り組むべきと思った。

■とりあえず参考本(デジタルフィルタ)

デジタルフィルタ (ビギナーズ)

デジタルフィルタ (ビギナーズ)

自分はフィルタの勉強をするのが目的なのか!?!? BMI/BCIは単なる口実でなんでも目新しい事を勉強するのが目的か?

■ご参考URL
やる夫で学ぶディジタル信号処理
東北大学 大学院情報科学研究科 鏡様著)
http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/main.html

BMIのシステムを作るにはFFTとデジタルフィルタは必須と思われ、どうせなら一度に勉強する方が効率いいかも。根本原理を理解できるかどうか?はともかく。。