【氏名又は名称原語表記】SHENZHEN INSTITUTES OF ADVANCED TECHNOLOGY CHINESE ACADEMY OF SCIENCES
【文献】
XU, Jiaqing,The Design Of Myocardial Ifarction Early Aided Diagnosis System Based On GPU,CHINA MASTER'S THESES FULL-TEXT DATABASE,2014年 1月15日,23-45
【文献】
NIEDERHAUSER, Thomas et al.,Graphics-Processor-Unit-Based Parallelization of Optimized Baseline Wander Filtering Algorithms for Long-Term Electrocardiography,IEEE TRANSACTIONS ON BIOMEDICAL ENGINEERING,2015年 2月 6日,Vol.62, No.6,1576-1584
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0029】
本発明の実施例の目的、技術的思想及び利点をより明確に分かるようにするため、次に、図面により本発明の実施例についてさらに詳細に説明する。ここで、本発明の概略的な実施例及びその説明は、本発明の解説に用いるものであるが、本発明を限定するものではない。
【0030】
図1は、従来の心電信号の直列解析方法についてのフローチャートであるが、
図1に示すように、フィルタリング処理101において、従来技術では、長インターバル(interval)アーチファクト(artifact)除去アルゴリズム、短インターバルアーチファクト除去アルゴリズム及び簡単な整係数コムフィルタ(simple integer coefficients comb filter)を用いてフィルタリング処理をすることで、商用電源周波数によるノイズ、基線変動、筋電のアーチファクトによるノイズを含むアーチファクトによるノイズを除去し、人体や信号収集機器などの外界の環境から生じるノイズの影響を除去していた。フィルタリング処理101に用いる上記の3通りのアルゴリズムはいずれも直列アルゴリズムで、また、アーチファクト除去が特徴抽出や波形分類の段階でも用いられていたので、上記の3通りのアルゴリズムにより、心電信号を処理するスピードが明らかに低下されていた。
【0031】
上記の3通りの直列アルゴリズムを含むフィルタリング処理のプロセスを分析することで、発明者は、いずれのアルゴリズムでもフィルタリング処理の段階でかかる時間の1/3を占めることを発見した。オールパスネットワーク(全域通過回路網)の簡単な整係数コムフィルタ(all-pass network simple integer coefficients comb filter)では、データのフィルタリング処理中にデータの前後依存関係が非常に強く、CUDA(Compute Unified Device Architecture、計算統合デバイスアーキテクチャ)のプログラミングモデルにおける並列計算の単一命令複数データ原則(SIMD)に反するので、このアルゴリズムは並列実行に適しない。長インターバルアーチファクト除去アルゴリズム及び短インターバルアーチファクト除去アルゴリズムでは、データのフィルタリング処理中にデータの関連性が弱いので、並列処理をすることができる。
【0032】
従って、心電信号にフィルタリング処理をする場合、長インターバルアーチファクト除去アルゴリズム及び/又は短インターバルアーチファクト除去アルゴリズムに並列実行する方法を採用すれば、フィルタリング処理の段階でかかる時間の1/3又は2/3を短縮することができる。
【0033】
図1に示すように、従来技術においては、直列アルゴリズムを用いてQRS検出102におけるR波位置抽出とQRS波群の開始・停止位置の抽出の2つの処理プロセスを行っている。R波位置抽出とQRS波群の開始・停止位置の抽出を並列実行するアルゴリズムを設計できれば、心電信号の解析速度をさらに高めることができる。
【0034】
さらに
図1に示すように、従来技術においては、直列アルゴリズムによってQRS波群を識別することで異常波形分類103を行っている。QRS波群を識別する並列アルゴリズムを設計できれば、より速い心電信号の解析速度を得ることができる。
【0035】
先行技術に存在する課題を解決するため、本発明の実施例では、GPUによる心電信号の並列解析方法を提供する。
図2に示すように、本発明の実施例における心電信号の並列解析方法には、次のステップが含まれる。
【0036】
S201:長インターバルアーチファクト除去と短インターバルアーチファクト除去をすることで心電信号にフィルタリング処理をする。
【0037】
S202:R波位置抽出、QRS波群の開始・停止位置の抽出及びQRS波群幅抽出をすることで、フィルタリング処理がされた前記心電信号にQRS検波をする。
【0038】
S203:テンプレート作成をして、QRS検波がされた前記心電信号について異常波形分類をする。
【0039】
ここで、上記長インターバルアーチファクト除去、上記短インターバルアーチファクト除去、上記R波位置抽出、上記QRS波群幅抽出及び上記テンプレート作成の少なくとも1つは、GPU装置における複数のスレッドにより並列実行される。ここで、各スレッドは、その唯一対応する番号によって、それに対応するデータを読み取って処理する。
【0040】
本発明の実施例における心電信号の並列解析方法では、長インターバルアーチファクト除去アルゴリズム、短インターバルアーチファクト除去アルゴリズム、R波位置抽出、QRS波群幅抽出及びテンプレート作成のうち少なくとも1つをGPU上並列実行することにより、心電信号の解析速度をある程度速めることができる。
【0041】
実施例の一つにおいて、長インターバルアーチファクト除去は直列アルゴリズムを用いて実行してもよい。長インターバルアーチファクト除去の実行中に、1つのノイズシーケンスnoiselist[length]を生じ、ノイズシーケンスの配列の長さは次の通りとなる。
【0043】
そのうち、ecgnum最初の心電信号データの配列の長さ、Tは長インターバルアーチファクト除去のインターバルを表し、あるセグメントのデータがノイズと判定された場合、ノイズシーケンスの相応の位置に1と書き込まれ、逆の場合であれば0と書き込まれる。
図3は、本発明の実施例における長インターバルアーチファクト除去の直列実行アルゴリズムについてのフローチャートである。
図3に示すように、長インターバルアーチファクト除去の直列実行アルゴリズムには、次のステップが含まれる。
【0044】
S301:心電信号のセグメント識別子をK=0と初期設定する。
【0045】
S302:最初の心電信号から心電信号データを順次読み取る。
【0046】
S303:f*T個の心電信号データ点を読み込むとき、標準偏差公式Mに従って各セグメントの心電信号データセットの標準偏差を計算し、セグメント識別子Kに1を加算する。
【0048】
ここで、fは心電信号のサンプリング周波数で、p
jは各セグメントの心電信号データセットにおけるjつ目のサンプリングデータ点を表すが、jは正整数、j≧0である。
【0049】
S304:すべての心電信号データが処理されるまで、S302及びS303のステップを繰り返す。
【0050】
S305:経験的な閾値の範囲[0.5、30]に基づいて、各セグメントの心電信号データセットの標準偏差が当該経験的な閾値の範囲内にあるか否かを判定し、当該経験的な閾値の範囲内にある心電信号データセットの標準偏差の平均値temp_Mを計算する。
【0051】
S306:平均値temp_Mに基づいて、新たな閾値上限temp_hと閾値下限temp_lを算出し、さらに、1つの新たな閾値範囲を導き出す。そのうち、
【数17】
【数18】
【数19】
である。
【0052】
S307:ステップS306で導き出された新たな閾値範囲に基づいて心電信号のノイズセグメントを判定し、当該セグメントの心電信号データセットの標準偏差が当該新たな閾値範囲内にあればノイズセグメントでないとしてnoiselist[i]=0と記し、逆の場合であれば、ノイズセグメントと判定してnoiselist[i]=1と記す。
【0053】
S308:全てのノイズセグメントの判定が完了するまでに、以上の処理を繰り返す。あるセグメントの心電信号データの1つ前と1つ後ろのセグメントの心電信号データがいずれもノイズセグメントである場合、当該セグメントの心電信号データもノイズセグメントと判定する。
【0054】
S309:長インターバルアーチファクト除去を終了する。
【0055】
長インターバルアーチファクト除去の直列アルゴリズムについて分析することで、発明者は、長インターバルアーチファクトの判定フローに4つのループがあるが、CUDAのアーキテクチャではスレッドが単一命令複数データの方式で構成されるので、ループが並列化に適している改良を発見した。
【0056】
カーネル関数を呼び出す際、スレッドブロックとブロック内のスレッドリソースの数を指定するが、スレッドブロックの数BlockNumは、最初の心電信号の長さと設定した各々のスレッドブロックにおけるスレッドの数ThreadsPerBlockに基づいて、次の数式(1)及び数式(2)により算出することができる。
【0058】
長インターバルアーチファクトの判定プロセスにおいて、1つ目のループは1つのネスティングループであるが、内部ループにより定められるサブデータセットの数によってデータセット全体における各々のサブデータセットの標準偏差を計算するという機能を実現するものである。当該ループの特徴により、当該ループに並列化をすれば、1つのスレッドに1つのサブデータセットの標準偏差を計算させて、複数のスレッドで同時に無通信で並列化に実行できるようになる。
【0059】
2つ目のループにより実現される機能は、経験閾値に基づいて部分データを除去して、残ったデータの平均値を計算するというものである。当該ループに並列化に改良をすれば、CPUで直列実行する方法を用いて、1つの新たな配列を生成し、その後、次元削減(Reduction)により合計を取得する(以下、次元削減合計と称する)カーネル関数を呼び出して、当該新たな配列におけるデータの合計を計算することができる。
【0060】
3つ目のループにより実現される機能は、1つ目のループにより生じた結果セットm_noiseに対応するデータセットがノイズであるか否かを判定するというものである。その具体的なプロセスは、結果セットm_noiseから1つの値を読み取るごとに、当該値を上記経験閾値と比較することで、当該値に対応するデータがノイズであるか否かを判定するというものである。このような事情に対しては、当該ループに並列化にすれば、length個のスレッドを起動して、各々のスレッドを結果セットm_noiseのうち1つの値のみに対応させることで、各々のスレッドがそのスレッドIDナンバーによりm_noiseから1つの相応の値を読み取るようにすることができる。その後、スレッドIDナンバーに基づいて読み取った値と設定閾値を比較して、当該スレッドIDナンバーに応じて比較結果を配列noiselistに書き込む。
【0061】
4つ目のループは、3つ目のループで生じたノイズシーケンスについてクロスチェックをするものである。当該ループで依拠する判断基準は、「1つのサブデータセットの前後の2つのデータセットがいずれもノイズと判定された場合は、当該セグメントのデータセットもノイズである」というものである。機能の実現過程では、配列noiselistから1つのデータ値を読み取るごとに、当該データ値と隣接する前後の2つのデータ値を読み取り、その後、上記判断基準に基づいて当該データ値を修正する。当該ループに並列化する改良をすれば、length個のスレッドを起動して、各々のスレッドのIDナンバーを配列noiselistのうち1つの値のみに対応させられて、そのようにすれば、スレッドがそのIDナンバーに従って配列noiselistからそれに対応する値及び当該値の前後に隣接する値を読み取って、その後、読み取った値に基づいて相応の演算をすることができるようになる。
【0062】
改良後の4つ目のループは並列実行するものであるので、読み取った前後の隣接する値がダーティーリード(Dirty Read)であるか否かを考慮する必要がある。
【0063】
解析しやすくするため、スレッドのIDナンバーに対応する値をa、aに隣接する前後の値をそれぞれfont及びback、fontに隣接する前の1つの値をb、backに隣接する後の1つの値をcと記してもよい。上記の「1つのサブデータセットの前後2つのデータセットがいずれもノイズと判定された場合は、当該セグメントのデータセットもノイズである」という4つ目のループで実行される基準から、書き込む操作が生じるには2つの必須条件がなければならないことを知ることができる。第1に、値が0であるデータのみが対象となること、第2に、当該値の前後に隣接する値が必ず1であることである。仮にfont又はbackの値がその対応するスレッドに読み取られた後、そのうち1つの値が変更されたとすれば、これら2つの条件により、font又はbackの値は0であるとともに、b及びaの値は1、又はa及びcの値は1でなければならない。言い換えれば、font又はbackの値のうちいずれの1つがダーティーリードであるかにかかわりなく、aの値は必ず1でなければならず、このことがスレッドによるaの処理に影響しないので、ダーティーリードを読み取ってしまっても、aの値の最終結果に誤りが生じることはない。
【0064】
従って、4つ目のループでは、並列実行中にダーティーリードを読み取ってしまうことはない。
【0065】
図4は、本発明の実施例における長インターバルアーチファクト除去の並列実行アルゴリズムについてのフローチャートである。
図4に示すように、前記長インターバルアーチファクト除去は、複数の前記スレッドによって並列実行され、次のことを含む。
【0066】
S401:前記GPU装置端末の変数を宣言して、それに相応のグラフィックメモリを分配し、前記心電信号をホスト端末から前記GPU装置端末のグローバルメモリにコピーする。
【0067】
S402:長インターバルアーチファクト除去のインターバルに応じて前記心電信号をセグメント化し、各々の前記スレッドで前記GPU装置端末のカーネル関数を呼び出して、前記IDナンバーに基づいて前記グローバルメモリから前記スレッドに対応する1セグメントの心電信号を読み取り、当該セグメントの心電信号の標準偏差を計算して、前記IDナンバーに基づいて前記標準偏差を前記グローバルメモリ中の第1の標準偏差シーケンスに格納する。
【0068】
S403:標準偏差が設定閾値範囲内にない前記セグメントの心電信号を除去する。
【0069】
S404:前記スレッドで前記GPU装置端末の次元削減合計カーネル関数を呼び出して、除去がされた後に残ったすべての当該セグメントの心電信号の標準偏差の合計値を計算する。
【0070】
S405:前記合計値から平均値を求めた上で、前記平均値により第1の閾値範囲を生成する。
【0071】
S406:各々の前記スレッドで前記カーネル関数を新たに呼び出して、前記IDナンバーに基づいて、除去がされた後に残った前記セグメントの心電信号の標準偏差が前記第1の閾値範囲内にあるか否かを読み取って判定し、前記IDナンバーに基づいて判定結果を前記グローバルメモリ中の第1のノイズシーケンスに格納する。
【0072】
S407:各々の前記スレッドが前記IDナンバーに基づいて前記第1のノイズシーケンスから前記判定結果及びそれに隣接する前の1つの判定結果と後の1つの判定結果を順次読み取って、前記前の1つの判定結果と前記後の1つの判定結果のいずれの標準偏差も前記第1の閾値範囲内になければ、ノイズであることを示す第1のフラグを前記IDナンバーに基づいて前記第1のノイズシーケンスに格納し、逆の場合であれば、ノイズでないことを示す第2のフラグを前記IDナンバーに基づいて前記第1のノイズシーケンスに格納し、長インターバルアーチファクト除去の結果を生成する。
【0073】
S408:前記長インターバルアーチファクト除去の結果を前記GPU装置端末から前記ホスト端末にコピーする。
【0074】
上記ステップS401において、スレッドの数は
【数22】
としてよく、各々の前記スレッドの処理する心電信号に対応するサンプリング点の個数はf*Tであるが、そのうち、Lはホスト端末からコピーされる心電信号のサンプリング点のシーケンス長、fは心電信号のサンプリング周波数、Tは長インターバルアーチファクト除去のインターバルである。
【0075】
上記ステップS402において、標準偏差は、ステップS303における標準偏差の計算式を用いて計算してもよく、標準偏差
【数23】
【数24】
である。ここで、p
jは前記セグメントの心電信号のうちjつ目のサンプリング点の心電信号、jは整数、j≧0で、fは心電信号のサンプリング周波数、Tは前記長インターバルアーチファクト除去のインターバルである。
【0076】
上記ステップS403において、当該設定閾値の範囲は[0.5、3]としてよい。上記ステップS405において、第1の閾値範囲の上限と第1の閾値範囲の下限は、それぞれ当該ステップで得られる平均値の3倍と1/3.5倍である。
【0077】
上記ステップS407において、長インターバルアーチファクト除去の結果には、心電信号データ、ノイズ/非ノイズフラグ、標準偏差データを含めてもよい。
【0078】
図5は、本発明の一実施例における長インターバルアーチファクト除去の並列実行アルゴリズムについてのフローチャートである。
図5に示すように、長インターバルアーチファクト除去の並列実行アルゴリズムには、次のステップが含まれる。
【0079】
S501:装置端末の変数を宣言して、これに相応のグラフィックメモリを分配した後で、カーネル関数を演算する上で必要な心電信号データをホスト端末から装置端末にコピーする。
【0080】
S502:最初の心電信号データの長さをLとして、
【数25】
個のスレッドを起動し、各々のスレッドで、f*T個の心電信号データを含む1つのデータセットを処理する。
【0081】
S503:各々のスレッドでカーネル関数を呼び出して、まず、グローバルメモリから当該セグメントに属する心電信号データを読み取って、当該セグメントの心電信号データの標準偏差Mを計算した後に、スレッドのIDナンバーgidに基づいて計算結果をグローバルメモリに書き込み、
【数26】
とする。
【0082】
S504:すべてのスレッドでステップS503の演算が完了するまでスレッドを同期する。
【0083】
S505:経験閾値の範囲[0.5、30]に基づいて、各セグメントの心電信号データセットの標準偏差が上記経験閾値の範囲内にあるか否かを判定することで、明らかにノイズのある心電信号データのセグメントを除去する。
【0084】
S506:次元削減合計カーネル関数を呼び出して、残ったデータの合計値を計算する。
【0085】
S507:ステップS506で得られた合計値から平均値temp_Mを求めた後で、平均値temp_Mにより新たな閾値上限と閾値下限を算出する。
【0086】
S508:各々のスレッドで新たなカーネル関数を呼び出して、まず、それぞれのIDナンバーgidに従ってグローバルメモリから相応の標準偏差を読み取った上で、ステップS507で生じた閾値上限及び閾値下限に基づいて、当該標準偏差に対応するデータセグメントがノイズセグメントであるか否かを決定する。結果をグローバルメモリnoiselist[gid]に書き込んだ後は、スレッドの操作を同期する。
【0087】
S509:各々のスレッドでまたグローバルメモリからnoiselist[gid−1]とnoiselist[gid+1]を読み取って、「あるセグメントの心電信号データの前と後の二つのセグメントの心電信号データがいずれもノイズセグメントである場合、当該セグメントの心電信号データもノイズセグメントと判定する」という判定を実行し、結果をnoiselist[gid]書き込む。
【0088】
S510:カーネル関数から返信した関連するデータを装置端末からホスト端末にコピーして、無用な装置端末の変数を解放し、装置端末のグラフィックメモリとホスト端末のメモリを回収する。
【0089】
本発明の実施例では、長インターバルアーチファクト除去アルゴリズムがGPU装置端末で並列に実行されることで、フィルタリング処理の段階でかかる時間を著しく減少させることができる。
【0090】
実施例の一つにおいて、短インターバルアーチファクト除去アルゴリズムには直列アルゴリズムを用いてもよい。長インターバルアーチファクト除去とコムフィルタによるフィルタリングがされた後で、短インターバルアーチファクト除去によって、心電信号にアーチファクト除去の処理をすることができる。主に、長インターバルアーチファクト除去によって生じたノイズフラグ配列noiselistに基づいて、心電信号データのうちノイズであるとフラグがされていないデータセグメントからより小さいインターバルT
1のノイズを除去するが、インターバルT
1の選択は長インターバルアーチファクト除去のインターバルTに依存するもので、TはT
1の倍数であってもよく、例えば、長インターバルアーチファクト除去のインターバルTの値を5として、短インターバルアーチファクト除去のインターバルT
1の値を1として、すなわち、それぞれ5秒のインターバルと1秒のインターバルのアーチファクトを表すようにしてもよい。短インターバルアーチファクト除去の処理中に生じるノイズ配列はnoise[length]と記され、配列の長さは
【数27】
である。
【0091】
図6は、本発明の実施例における短インターバルアーチファクト除去の直列実行アルゴリズムについてのフローチャートである。
図6に示すように、短インターバルアーチファクト除去の直列実行アルゴリズムには、次のステップが含まれる。
【0093】
S602:長インターバルアーチファクト除去の結果におけるノイズ配列noiselistからデータnoiselist[i]を順次読み取る。
【0094】
S603:データnoiselist[i]=1であれば、ecglist[i*T*f]〜ecglist[(i+1)*T*f−1]である最初の心電信号データがノイズセグメントであると既にフラグがされていることが示されているため、配列temp_noiseにT/T
1個の0を順次書き込み、当該ノイズセグメントに対応する心電信号データについて短インターバルアーチファクト除去の処理をしないようにする。
【0095】
S604:データnoiselist[i]=0である場合、データがnoiselist[i]の配列ecglistにおいて対応するサフィックスi*T*fから順次データを読み取り始めて、式S
i,jの値を計算し、S
i,jの値をtemp_noise[i*T/T
1+j]に書き込む。
【0097】
ここで、
【数29】
TはT
1の整数倍で、p
nはnつ目の心電信号データの値である。
【0098】
S605:ノイズ配列noiselist中のデータをすべて読み終わるまで、S602、S603、S604のステップを繰り返す。
【0099】
S606:新たに得られたノイズ配列temp_noiseについて、そのうちすべての0より大きい値の平均値temp_Sを求め、これによって新たな閾値範囲(0、5*temp_S]を導き出す。
【0100】
S607:ステップS606で導き出された新たな閾値範囲に基づいて判定をし、すなわち、データtemp_noise[i]が当該新たな閾値範囲内にある場合、データtemp_noise[i]に対応する心電信号データはノイズでなく、noise[i]=0で、逆の場合であれば、当該心電信号データはノイズで、noise[i]=1と判定して、新たなノイズ配列noiseに戻る。配列temp_noise中のすべてのデータを読み終わるまで当該ステップを繰り返す。
【0101】
S608:短インターバルアーチファクト除去アルゴリズムを終了する。
【0102】
短インターバルアーチファクト除去の直列アルゴリズムについて解析することで、発明者は、短インターバルアーチファクト除去アルゴリズムには3つの大ループがあることを発見した。
【0103】
1つ目のループの機能は、長インターバルアーチファクト除去の結果における非ノイズセグメントのデータに、より短インターバルのアーチファクト除去をすることである。具体的には2つの部分に分けられ、第1には、長インターバルアーチファクト除去がされたノイズ配列から非ノイズセグメントのデータを選別すること、第2には、非ノイズセグメントのデータをより小さいインターバルT
1でセグメント化して計算することである。ただし、上記の1つ目のループを並列に実行するように改良する場合、上記の2つの部分の直列順序によらず実行してもよい。まず、すべての最初の心電信号データをインターバルT
1でセグメント化して計算し、相応の数のスレッドリソースを起動して、各々のスレッドの処理するデータセットのサイズをf*T
1として、計算した結果をスレッドのIDナンバーに従ってグラフィックメモリに書き込むようにしてもよい。その後、スレッドリソースを起動して、スレッドの数が長インターバルアーチファクト除去の結果におけるノイズ配列の長さに等しいようにして、各々のスレッドがそのIDナンバーに従って、長インターバルアーチファクト除去により得られるノイズ配列におけるデータと一対一対応するようにする。さらに、ノイズ配列におけるデータに基づいて、前に計算した結果を補正する。
【0104】
2つ目のループの機能は、1つ目のループにより算出された結果配列のうちすべての0より大きいデータの平均値を計算することである。並列化にする場合、まず、0より大きいデータを逐次選別した上で、0より大きいデータを新たな仮配列に書き込み、その後、次元削減合計カーネル関数を呼び出して、当該仮配列におけるデータの合計を計算することで、すべての0より大きいデータの平均値を導き出す。
【0105】
3つ目のループの機能は、前の2つのループにおける計算結果に基づいて新たなノイズ配列を得ることであるが、それを並列化にすることは、相応の数のスレッドリソースを起動して、各々のスレッドがそのIDナンバーに従って、当該IDナンバーに対応するデータがノイズであるか否かを判定し、結果をグローバルグラフィックメモリに書き込むことになる。
【0106】
図7は、本発明の実施例における短インターバルアーチファクト除去の並列実行アルゴリズムについてのフローチャートである。
図7に示すように、短インターバルアーチファクト除去の並列実行アルゴリズムには、次のステップが含まれる。
【0107】
S701:前記GPU装置端末の変数を宣言して、それに相応のグラフィックメモリを分配し、前記長インターバルアーチファクト除去がされた心電信号をホスト端末から前記GPU装置端末のグローバルメモリにコピーする。
【0108】
S702:短インターバルアーチファクト除去のインターバルT
1に応じて前記心電信号をセグメント化し、各々の前記スレッドで前記GPU装置端末のカーネル関数を呼び出して、前記IDナンバーに基づいて1セグメントの心電信号を読み取り、式Sの値を計算して、前記IDナンバーに基づいて前記式の値を前記グローバルメモリ中の第2のノイズ配列に格納するが、そのうち、式Sは
【数30】
で、ここで、sumは前記セグメントの心電信号中のすべての心電信号の二乗和である。
【0109】
S703:前記スレッドの数及びその処理する心電信号に対応するサンプリング点の個数を修正して、各々の修正後のスレッドでカーネル関数を呼び出し直し、前記修正後のスレッドのIDナンバーに基づいて、その唯一対応する前記長インターバルアーチファクト除去の結果における第1のノイズ配列中の1つのフラグ値を読み取り、ノイズであることを示す前記フラグ値に対応するセグメントの心電信号を第3のフラグによって表示する。
【0110】
S704:前記第3のフラグに基づいて、ノイズであることを示す前記フラグ値に対応するセグメントの心電信号を逐次除外する。
【0111】
S705:前記修正後のスレッドで前記GPU装置端末における次元削減合計カーネル関数を呼び出し、除外がされた後に残ったすべての心電信号の合計値を計算する。
【0112】
S706:前記合計値から平均値を求め、前記平均値により第2の閾値範囲を生成する。
【0113】
S707:前記スレッドの数及びその処理する心電信号に対応する数を再度修正して、再修正後の前記スレッドでカーネル関数を再度呼び出し直し、再修正後の前記スレッドのIDナンバーに基づいて、前記第2の閾値範囲内にない各々の前記式の値を前記第2のノイズ配列から読み取って除去し、短インターバルアーチファクト除去の結果を生成する。
【0114】
S708:前記短インターバルアーチファクト除去の結果を前記GPU装置端末から前記ホスト端末にコピーする。
【0115】
上記ステップS702においては、まず、短インターバルアーチファクト除去のインターバルに応じて心電信号をセグメント化してから、心電信号に並列的に短インターバルアーチファクト除去をすることで、並列処理の複雑さを簡素化して、プログラミングを実現する作業量を減少することができる。
【0116】
上記ステップS702において、各々の前記スレッドで処理する心電信号のサンプリング点の個数はf*T
1、前記スレッドの数
【数31】
としてよいが、ここで、Lは前記ホスト端末からコピーされる心電信号のサンプリング点の配列の長さ、fは心電信号のサンプリング点の周波数である。1つのスレッドブロックに対してThreadsPerBlock個の前記スレッドを設定することができるが、各々の前記スレッドブロックに対応する心電信号のサンプリング点の個数は上記式(1)によって導き出され、すなわち、
【数32】
としてよく、スレッドブロックの数は上記式(2)によって導き出され、すなわち、
【数33】
としてよい。
【0117】
上記ステップS703において、修正後のスレッドの数
【数34】
としてよいが、ここで、Lは前記ホスト端末からコピーされる心電信号のサンプリング点の配列長配列の長さ、fは心電信号のサンプリング周波数、Tは前記長インターバルアーチファクト除去のインターバルである。1つのスレッドブロックに対して
【数35】
個の修正後のスレッドが対応してもよく、スレッドブロックの数は上記式(2)に基づいて算出することができ、
【数36】
としてよい。ここで、L1はすべての前記長インターバルアーチファクト除去の結果における第1のノイズ配列の長さである。
【0118】
上記ステップS707において、再修正後のスレッドの数
【数37】
としてよく、各々の再修正後のスレッドは1つの前記式の値に対応して処理することができ、1つのスレッドブロックに対してThreadsPerBlock2個の前記再修正後のスレッドが対応してもよく、前記スレッドブロックの数は上記式(2)に基づいて算出することができ、
【数38】
としてよく、Lは前記ホスト端末からコピーされる心電信号のサンプリング点の配列の長さである。短インターバルアーチファクト除去の結果には、心電データ、ノイズ/非ノイズフラグ、Sの値を含めてもよい。
【0119】
本発明の実施例では、短インターバルアーチファクト除去アルゴリズムに並列実行アルゴリズムを用いることで、フィルタリングの段階でかかる時間を減らして、心電信号を解析するスピードを高めることができる。
【0120】
本発明の実施例において、R波位置抽出に用いるアルゴリズムは、数理形態学変換(Mathematical Morphology、MM)アルゴリズムであってもよく、具体的には、数理形態学変換アルゴリズムにおける侵食演算と膨張演算、すなわち、まず、データを侵食演算してから、その後で侵食演算がされたデータを膨張演算するというものである。本発明の実施例では、直列アルゴリズムを利用して侵食演算をしても良い。侵食演算において、侵食ウィンドウの大きさを5として、スライディングレートを1とする。心電信号データecglistから1つのデータ、及び当該データに隣接するその後の4つのデータを読み取るごとに、その後で、読み取った5つのデータをそれぞれ異なる程度で侵食演算して、そのうちの最小値を導き出し、当該最小値を仮配列f0に書き込む。膨張演算は、侵食演算がされて得られた仮配列f0を基礎として行うことができる。膨張演算において、同じように膨張ウィンドウの大きさを5として、スライディングレートを1としてよい。配列f0から1つのデータ、及びそれに隣接するその後の4つのデータを読み取るごとに、読み取った5つのデータをそれぞれ異なる程度で膨張演算して、そのうちの最大値を導き出し、当該最大値を仮配列f1に書き込む。
【0121】
図8は、本発明の一実施例における短インターバルアーチファクト除去の並列実行アルゴリズムについてのフローチャートである。
図8に示すように、短インターバルアーチファクト除去の並列実行アルゴリズムには、次のステップが含まれる。
【0122】
S801:装置端末に必要な変数を宣言して、これに相応のグラフィックメモリを分配した後で、カーネル関数に必要な関連データをホスト端末から装置端末にコピーする。
【0123】
S802:スレッドブロックにおけるスレッドの数ThreadsPerBlockと各々のスレッドが処理するデータ量DataPerThread=f*T
1を定義した後で、上記の式(1)及び式(2)に基づいて、起動することが必要なスレッドブロックの数を算出して、kernel_1関数を起動し、各々のスレッドでそのIDナンバーgidに従って心電データからサフィックスがgid*f*T
1から(gid+1)*f*T
1−1の間であるデータを読み取った上で、式
【数39】
に基づいて、計算した結果を仮配列noiseでスレッドIDナンバーgidに対応するサフィックスの位置に書き込むが、ここで、sumは当該スレッドに対応するデータセット中のデータの二乗和である。
【0124】
S803:スレッドブロックにおけるスレッドの数ThreadsPerBlockと、各々のスレッドが処理するデータ量DataPerThreadと、データ量
【数40】
(関連変数は、長インターバルアーチファクト除去において既に定義されており、ここでいうnは、長インターバルアーチファクト除去により得られたノイズ配列の長さである)を修正して、上記の式(1)、(2)に基づいてスレッドブロックの数を算出し、kernel_2関数を起動する。スレッドの数は長インターバルアーチファクト除去により得られたノイズ配列noiselistの長さに等しく、すなわち、kernel_2では、各々のスレッドがスレッドIDナンバーに従ってnoiselist中の1つのデータに唯一対応することができるので、kernel_2では、各々のスレッドがスレッドIDナンバーに従ってnoiselistから相応のデータを読み取り、noiselist[gid]=1の場合、配列noise中のサフィックスがgid*Tから(gid+1)*T−1までの値を0にする。
【0125】
S804:配列noise中の0の値を直列に除外した上で、0の値のない1つの新しい仮配列temp_noiseを生成させ、次元削減合計カーネル関数を呼び出して仮配列の平均値を計算する。
【0126】
S805:仮配列の平均値から新たな閾値範囲を導き出す。
【0127】
S806:各々のスレッドブロックにおけるスレッドの数ThreadsPerBlockを修正して、配列noiseの長さ
【数41】
に基づいて、起動することが必要なスレッドブロックの数BlockNumを算出して、kernel_3関数を呼び出して、各々のスレッドがグローバルメモリからnoise[gid]を読み取った上で、ステップS805で生成した閾値範囲と比較して、ノイズであるか否かを判定し、最後に短インターバルアーチファクト配列noiselist_2を生成する。
【0128】
S807:関連データを装置端末からホスト端末にコピーして、無用な装置端末の変数を解放し、装置端末のグラフィックメモリとホスト端末のメモリを回収する。
【0129】
一つの実施例において、R波位置抽出のアルゴリズムには直列アルゴリズムを用いる。
図9は、本発明の実施例におけるR波位置抽出の直列実行アルゴリズムについてのフローチャートである。
図9に示すように、R波位置抽出の直列実行アルゴリズムには、次のステップが含まれる。
【0130】
S901:膨張演算と侵食演算のウィンドウサイズw=5と勾配k[w]={0、50、100、50、0}を定義する。
【0131】
S902:心電信号データecglistから1つの心電信号データecglist[i]、及びその直後の4つの心電信号データecglist[i+1]、ecglist[i+2]、ecglist[i+3]、ecglist[i+4]を順次読み取って、それぞれS901において対応する勾配とそれぞれ異なる程度の侵食演算をして最小値を導き出し、配列f0[i]に書き込む。
【0132】
S903:配列ecglistに4つのデータだけが残るまでステップS902を繰り返す。
【0133】
S904:心電信号データecglist中の最後の4つの心電信号データecglist[num_read−w+1]、ecglist[num_read−w+2]、ecglist[num_read−w+3]、ecglist[num_read−w+4]を最大限侵食演算した上で、侵食演算の結果をf0[num_read−w+1]、f0[num_read−w+2]、f0[num_read−w+3]、f0[num_read−w+4]に書き込む。
【0135】
S906:侵食演算で得られた結果セット配列f0を膨張演算して、配列f0から1つのデータf0[i]、及びその後のデータf0[i+1]、f0[i+2]、f0[i+3]、f0[i+4]を順次読み取って、それぞれS901において対応する勾配と相応の程度で膨張演算をして最大値を導き出し、配列f1[i]に書き込む。
【0136】
S907:配列f0に最後の4つのデータが残るまでステップS906を繰り返す。
【0137】
S908:ステップS907で残った最後の4つのデータをそれぞれ最大限膨張演算して、ecglist[num_read−w+1]、ecglist[num_read−w+2]、ecglist[num_read−w+3]、ecglist[num_read−w+4]にそれぞれ100を加えてからf1[num_read−w+1]、f1[num_read−w+2]、f1[num_read−w+3]、f1[num_read−w+4]に書き込む。
【0139】
最後に、データecglist[i]とデータf1[i]の間の差分値を計算した上で、すべての差分値の平均値を計算し、当該平均値をグローバルグラフィックメモリに書き込む。計算の結果に戻って数理形態学変換アルゴリズムを終了する。
【0140】
R波位置抽出の直列実行アルゴリズムについて分析することで、発明者は、上記の直列解析アルゴリズムで、すべての心電データに一括に数理形態学の膨張演算と侵食演算がされるのでなく、複数回に分けて行われることを発見した。フィルタリング処理がされた心電データから一定数(num_read)の心電データを読み取るごとに、その後で、読み取った当該一部の心電データに膨張演算と侵食演算をして、演算結果に基づいて相応の論理的判断をすることで、当該セグメントの心電データにおけるすべてのR波位置を抽出する。R波位置抽出のアルゴリズムに並列化する改良をする場合、「1対1」の方式を用いて行うことになる。
【0141】
カーネル関数を呼び出して膨張演算と侵食演算をするたびに、データ量と等量のスレッドリソースを起動することで、各々のスレッドがそのIDナンバーに従って唯一の心電データ点を見つけ出せるようにすることができる。その後、当該データ及びその後に隣接する4つのデータに膨張演算と侵食演算をした上で、計算結果をスレッドのIDナンバーに従ってグローバルグラフィックメモリに書き込む。この並列的なプロセスにおいて、発明者は、プロセスでカーネル関数が数回に渡って呼び出され、また、これが呼び出されるごとにそれまでにその回のカーネル関数に必要なデータがCPU端末のメモリからGPU端末のグラフィックメモリに書き込まれるので、CPUとGPUの間で頻繁に繰り返されるデータ伝送がプロセスの実行効率に著しく影響することをさらに発見した。次の実施例で、発明者は、これをさらに改良した。
【0142】
図10は、本発明の実施例におけるR波位置抽出の並列実行アルゴリズムについてのフローチャートである。
図10に示すように、R波位置抽出の並列実行アルゴリズムには、次のステップが含まれる。
【0143】
S1001:前記GPU装置端末の変数を宣言して、それに相応のグラフィックメモリを分配し、フィルタリング処理がされた前記心電信号をホスト端末のメモリから前記GPU装置端末のグローバルメモリにコピーする。
【0144】
S1002:各々の前記スレッドでカーネル関数を呼び出し、そのIDナンバーにより対応させて、フィルタリング処理がされた前記心電信号から1つの検波しようとする心電信号を読み取る。
【0145】
S1003:前記スレッドが、設定されたウィンドウサイズwと設定された勾配に応じて、読み取った前記の検波しようとする心電信号及びその直後のw−1個の検波しようとする心電信号をそれぞれ異なる程度で侵食演算して、侵食演算がされた後の読み取った前記の検波しようとする心電信号及び前記のw−1個の検波しようとする心電信号のうちの最小値を、前記IDナンバーに基づいて前記グローバルメモリ中の第1の仮シーケンスに格納するが、Wは整数、w≧2である。
【0146】
S1004:各々の前記スレッドで前記IDナンバーに基づいて前記第1の仮シーケンスから1つの前記最小値を読み取る。
【0147】
S1005:前記の設定されたウィンドウサイズと前記の設定された勾配に応じて、読み取った前記最小値及びその直後のw−1個の前記最小値をそれぞれ異なる程度で膨張演算して、前記IDナンバーに基づいて、膨張演算がされた後の読み取った前記最小値及びその後にすぐ隣接するw−1個の前記最小値のうちの最大値を、前記グローバルメモリ中の第2の仮シーケンスに格納する。
【0148】
S1006:前記IDナンバーに基づいて前記の検波しようとする心電信号を読み取って前記最大値との差分値を計算し、前記差分値を前記グローバルメモリ中の第3の仮シーケンスに格納する。
【0149】
S1007:前記スレッドで次元削減合計カーネル関数を呼び出して前記第3の仮シーケンス中のすべての前記差分値の合計値を計算する。
【0150】
S1008:前記合計値から平均値を求める。
【0151】
S1009:前記平均値を前記GPU装置端末から前記ホスト端末にコピーする。
【0152】
本発明の実施例では、R波位置抽出の並列実行アルゴリズムにおいて、フィルタリング処理がされた心電データのすべてがGPUのグラフィックメモリに書き込まれ、フラグビットが設けられて、読み込む位置のフラグが立てる。カーネル関数は、実行される時に、フラグビットに基づいてグラフィックメモリからその回で必要な心電データが読み取ると同時にフラグビットを更新する。当該方法では、データの準備がCPU端末からGPUに移転されることで、この過程でCPUのメモリからGPUのグラフフィックメモリにデータを書き込むことが1回だけ発生するようにされ、データ伝送にかかる時間が大幅に減らされている。
【0153】
本発明の実施例では、ステップS1008により平均値が得られた後、当該平均値に基づいてホスト端末で引き続きR波の位置を算出しても良い。
【0154】
上記ステップS1003においては、さらに、侵食演算がされた後の読み取った前記の検波しようとする心電信号及び前記のw−1個の検波しようとする心電信号のうちの最小値をレジスターに格納してもよい。上記ステップS1004においては、当該レジスターから1つの最小値を読み取ってから、グローバルメモリから当該最小値に隣接するw−1個の最小値を読み取る。
【0155】
このようにすれば、グローバルメモリとレジスターから同時にデータを読み取ることで、R波位置抽出のスピードをさらに高めることができる。
【0156】
上記ステップS1003において、設定されたウィンドウサイズと設定された勾配は複数の異なる設定値としてもよい。例えば、当該設定されたウィンドウサイズw=5、当該設定された勾配はk[w]={0、50、100、50、0}とする。
【0157】
上記ステップS1002において、当該スレッドの数は、ホスト端末からコピーされる心電信号のサンプリング点のシーケンス長L3と等しくしてもよく、1つのスレッドブロックに対してThreadsPerBlock3個の当該スレッドを設定してもよく、当該スレッドブロックの数を
【数42】
としてよい。このようにして、並列アルゴリズムの複雑さを低減することができる。
【0158】
図11は、本発明の一実施例におけるR波位置抽出の並列実行アルゴリズムについてのフローチャートである。
図11に示すように、R波位置抽出の並列実行アルゴリズムには、次のステップが含まれる。
【0159】
S1101:データの規模とGPU自体のパラメータによる制限により、起動することが必要なスレッドブロックの数BlockNumと各々のスレッドブロックにおけるスレッドの数threadPerBlockを決定して、全体のスレッドの数をデータ量と等しくする。
【0160】
S1102:kernel_1関数を呼び出して、当該カーネル関数で、各々のスレッドでそのIDナンバーgidに基づいてグローバルグラフィックメモリから相応の心電データ及びその後の4つのデータを読み取り、その後、これら5つのデータをそれぞれ異なる程度で侵食演算して、導き出された最小値を再度スレッドのIDナンバーに基づいて仮のd_f0[gid]とレジスターに書き込む。
【0161】
S1103:スレッドを同期して、すべてのスレッドでステップS1102における侵食演算が完了するようにする。
【0162】
S1104:侵食演算を完了し、侵食演算により得られた結果に基づいて膨張演算をする。
【0163】
S1105:当該カーネル関数で、スレッドでまずレジスターからデータd_f0[gid]を読み取ってから、スレッドのIDナンバーに基づいてグラフィックメモリから4つの隣接するデータd_f0[gid+1]、d_f0[gid+2]、d_f0[gid+3]、d_f0[gid+4]を順次読み取り、その後、これら5つのデータをそれぞれ異なる程度で膨張演算した上で、導き出された最大値をスレッドのIDナンバーに基づいてグローバルメモリ中の仮のd_f1[gid]に書き込む。
【0164】
S1106:膨張演算を完了し、他の演算をする。
【0165】
S1107:kernel_2関数を呼び出し、当該カーネル関数で、配列中のd_ecglist[gid]と侵食演算と膨張演算により得られた結果d_f1[gid]の間の差分値を計算して、d_s1[gid]に書き込む。
【0166】
S1108:次元削減合計カーネル関数を呼び出して、配列d_s1中のデータを次元削減合計した上で、最終的な結果を配列d_sum_s1に書き込む。
【0167】
S1109:配列s1中のデータセットの平均値d_meanを計算する。
【0168】
S1110:計算結果を装置端末からホスト端末にコピーして、無用な変数を解放し、メモリを回収する。
【0169】
本発明の実施例では、QRS波群の開始・停止位置の抽出に、ピーク値群を特定する方法を採用しても良い。R波付近の山と谷を探し出した上で、設定閾値に基づいてQRS波群のエッジ位置を特定する。QRS波群の開始位置の抽出に必要な特徴パラメータは、R波位置の抽出に依存する。QRS波群幅の計算は、主に配列QRS_startlistと配列QRS_endlistの2つの配列に依拠する。配列QRS_startlistにはQRS波群の開始点が格納され、配列QRS_endlistにはQRS波群の停止点が格納されているので、両者の間の差分値がQRS波の幅となる。
【0170】
一実施例では、QRS波群幅抽出に直列アルゴリズムを用いて実行する。
図12は、本発明の実施例におけるQRS波群幅抽出の直列実行アルゴリズムについてのフローチャートである。
図12に示すように、直列アルゴリズムを実行中に、QRS波群の開始点の配列QRS_startlistとQRS波群の停止点の配列QRS_endlistからQRS波群の開始位置QRS_startlist[i]と停止位置QRS_endlist[i]を順次読み取り、開始位置QRS_startlist[i]と停止位置QRS_endlist[i]の差分値QRSlistを求めてから、設定閾値80に基づいて、当該差分値QRSlistを記録するか否かを判断する。
【0171】
実施例のもう一つでは、QRS波群幅抽出に並列アルゴリズムを用いて実行する。配列QRS_startlistと配列QRS_endlistの長さに応じて相応の数のスレッドリソースを起動し、その後、各々のスレッドでそのIDナンバーgidに基づいてそれぞれ配列QRS_startlistと配列QRS_endlistから相応のデータを読み取って両者の間の差分値を並列計算すると、相応のQRS波群の幅が得られ、最後に、またスレッドのIDナンバーに基づいてQRS波群の幅をグローバルグラフィックメモリに書き込む。
【0172】
図13は、本発明の実施例におけるQRS波群幅抽出の並列実行アルゴリズムについてのフローチャートである。
図13に示すように、QRS波群幅抽出の並列実行アルゴリズムには、次のステップが含まれる。
【0173】
S1301:前記GPU装置端末の変数を宣言して、それに相応のグラフィックメモリを分配し、QRS波群の開始・停止位置の抽出結果をホスト端末から前記GPU装置端末のグローバルメモリにコピーする。
【0174】
S1302:前記スレッドで前記GPU装置端末のカーネル関数を呼び出し、そのIDナンバーに基づいて、前記のQRS波群の開始・停止位置の抽出結果における開始位置と停止位置を読み取って、前記の開始位置と停止位置の差分値を計算し、前記IDナンバーに基づいて前記差分値を前記グローバルメモリに格納し、QRS波群幅抽出の結果を生成する。
【0175】
S1303:前記のQRS波群幅抽出の結果を前記GPU装置端末から前記ホスト端末にコピーする。
【0176】
本発明の実施例では、ホスト端末でピーク値群決定法によってQRS波群の前記開始位置と前記停止位置を得ることができる。並列実行しにくいステップはホスト端末で直列実行すれば、CPUとGPUの間でデータをコピーすることにかかる時間を減らせる。
【0177】
上記ステップS1302においては、データの規模とGPU自体のパラメータによる制限により、起動することが必要なスレッドブロックの数blocknumと各々のスレッドブロックにおけるスレッドの数threadsPerBlockを決定してもよい。起動するスレッドの総数はblocknum*threadPerBlockとしてよい。スレッドでそのIDナンバーgidに基づいてそれぞれグローバルメモリ中のQRS波群の開始位置の配列QRS_startlistとQRS波群の停止位置の配列QRS_endlistから相応の開始位置データQRS_startlist[gid]と停止位置データQRS_endlist[gid]を読み取って、QRS波群幅を算出した上で、再度スレッドのIDナンバーに基づいて計算結果をQRSlist[gid]に書き込む。
【0178】
本発明の実施例において、用いられるQRS波群の開始位置と停止位置は、ホスト端末で算出することができる。
【0179】
本発明の実施例において、異常波形分類の直列アルゴリズムは4段階に分けられる。
【0180】
第1段階で、13種類又は複数種類の心拍を個別に判定する。
【0181】
第2段階で、ノイズに著しく影響されたデータセグメント、振幅の小さすぎる心拍及び心房性早期収縮、心室性早期収縮を判定する。
【0182】
第3段階で、心拍漏れ及び心拍停止を判定する。
【0183】
第4段階で、すべての異常波に対してテンプレート照合法を使用する。
【0184】
上記異常波形分類の4つのステップのアルゴリズムについて解析することで、発明者は、第4段階のテンプレート照合にかかる時間でアルゴリズム全体の95%以上を占めているので、最も多く時間のかかる部分を並列して加速することが可能であることを発見した。テンプレート照合法は、各々の異常心拍付近にQRSテンプレートを構築するものである。テンプレート照合法の核心部分にかかる時間は最も多く、当該核心部分では識別シーケンスを生成する。識別シーケンスは、RRインターバルRRlistに基づいて生成する。そのうち、識別子には−1、0、1の3つの値が含まれる。
【0185】
図14は、本発明の実施例におけるテンプレート作成の並列実行アルゴリズムについてのフローチャートである。
図14に示すように、テンプレート作成の並列実行アルゴリズムには、次のステップが含まれる。
【0186】
S1401:前記GPU装置端末の変数を宣言して、それに相応のグラフィックメモリを分配し、R波位置抽出の結果をホスト端末から前記GPU装置端末のグローバルメモリにコピーする。
【0187】
S1402:前記スレッドでカーネル関数を呼び出して、そのIDナンバーに基づいて、前記のR波位置抽出の結果におけるRRインターバルを読み取り、設定基準に基づいて各々の前記RRインターバルの識別子を取得した上で、前記IDナンバーに基づいて前記識別子を前記グローバルメモリに格納して、テンプレート作成の結果を生成する。
【0188】
S1403:前記のテンプレート作成の結果を前記GPU装置端末から前記ホスト端末にコピーする。
【0189】
本発明の実施例において、RRインターバルは、ホスト端末でR波位置抽出の結果から算出してもよい。
【0190】
上記ステップS1402において、当該設定基準には、次のようにすることが含まれてもよい。
【0191】
(1)iつ目のRRインターバルRRlist[i]に隣接するi+1つ目のRRインターバルRRlist[i+1]が区間(0.6*RRlist[i]、1.5*RRlist[i])にない場合、前記RRインターバルのデータであるRRlist[i]の識別子は−1となるが、そのうち、iは整数、i≧0である。
【0192】
(2)前記RRインターバルRRlist[i+1]が区間(0.6*RRlist[i]、1.5*RRlist[i])にあって、前記RRインターバルRRlist[i]が区間(0.8*RRmean、1.3*RRmean)にない場合、前記RRインターバルRRlist[i]の識別子は0となるが、そのうち、RRmeanはすべての前記RRインターバルの平均値である。
【0193】
(3)前記RRインターバルRRlist[i+1]が区間(0.6*RRlist[i]、1.5*RRlist[i])にあって、前記RRインターバルRRlist[i]が区間(0.8*RRmean、1.3*RRmean)にある場合、前記RRインターバルRRlist[i]の識別子は1となる。
【0194】
上記ステップS1402においては、データの規模とGPU自体のパラメータによる制限により、起動することが必要なスレッドブロックの数blocknumと各々のスレッドブロックにおけるスレッドの数threadPerBlockを決定してもよい。起動するスレッドの個数はblocknum*threadPerBlockとしてよい。各々のスレッドでそのIDナンバーに従ってグローバルグラフィックメモリから相応のRRインターバルのデータを読み取った上で、上記の3つの基準に基づいて相応の識別子を得て、スレッドIDナンバーに従って結果をd_FLAGRlist[gid]に書き込む。
【0195】
テンプレートは異常心拍付近に作成されるが、異常心拍が発見された場合には、テンプレート作成関数を呼び出してテンプレートを作成しなければならないので、異常波形が非常に多い場合には、この段階で大量の時間がかかってしまう。本発明の実施例では、テンプレート作成のたびに識別シーケンスを生成し直さなくてもよいので、本発明の実施例は、識別シーケンスの生成とテンプレートの作成を最適化することで、異常波形分類にかかる時間を著しく減らすことができている。
【0196】
本発明の実施例における心電信号の並列解析方法は、心電信号の直列解析方法と常に同じ正確度が保たれている。24時間の長時間心電信号データを使用して直列アルゴリズムと並列アルゴリズムを数回試験し、その後、その平均値を求めて心電信号解析の各段階における速度向上比を導き出すと、表1に示す通りとなった。
【0197】
表1は、直列実行時間及び並列実行時間並びにそれぞれに対応する速度向上比である。
【0199】
表1中のデータを比較すると、次のことを分かった。心電信号解析のフィルタリング段階で、長インターバルアーチファクト除去アルゴリズムの直列実行にかかる時間は平均392ミリ秒、並列化の設計と最適化がされた後の平均実行時間は54ミリ秒、得られた速度向上比は7.3である。短インターバルアーチファクト除去アルゴリズムの直列実行時間は平均261ミリ秒、並列化の設計と最適化がされた後の平均実行時間は44ミリ秒、得られた速度向上比は5.9である。心電信号のQRS波検出をする段階で、数理形態学的な膨張演算と侵食演算の直列実行速度は1685ミリ秒であるが、並列化の設計と最適化がされた後の平均実行時間は160ミリ秒、速度向上比は10.5である。QRS波群幅を計算する直列実行時間は7ミリ秒、並列に実行して加速された後の平均実行時間は6.8ミリ秒で、速度向上比は1に近くなる。心率異常波形分類アルゴリズムの直列実行時間の平均値は1562ミリ秒、並列に実行して加速された後の実行時間は30.2ミリ秒、得られた速度向上比は48.5である。
【0200】
各アルゴリズムを並列して加速される前後の実行時間を比較する過程で、アルゴリズムの直列実行時間が長いときには、並列して加速することで得られる速度向上比が大きくなり、アルゴリズムの直列実行時間が短いときには、速度向上比が小さいことがわかる。
【0201】
それぞれ異なる時間長の心電信号サンプルセットを使用して、本発明の実施例における並列アルゴリズムを数回に渡って分析試験し、平均解析時間を導き出すと、表2に示す通りとなった。表2からわかるように、異常波形が多いほど解析時間も長くなるが、本発明の実施例における心電信号の並列解析方法は、それぞれ異なる時間長の心電信号データファイルによく適応することができる。解析時間はいずれも2秒以内に保つことができ、時間長が24時間である心電信号データの平均解析時間は1.9秒である。仮に、家庭向けのヘルス・クラウド・プラットフォームにアップロードされる心電信号データが毎日の各時間帯に均等に分布するとすれば、「CPU+GPU」サーバー1台で1日に24時間リアルタイム解析できる長時間心電信号データの量は44920となる。それで、家庭向けのヘルス・クラウド・プラットフォームに7台の「CPU+GPU」サーバーを配備して構成されるアルゴリズムサーバークラスターさえあれば、毎日30万本もの24時間の長時間心電信号データを迅速に解析するというニーズを満足することができる。
【0202】
以下の表2はそれぞれ異なる時間長の心電データの解析時間である。
【0204】
本発明では、「GPU+CPU」異種並列システムを使用することで長時間心電データの解析過程が速められ、まず、GPU(Graphic Processing Unit、画像処理装置)加速技術を使用することで、心電直列アルゴリズムにおいて並列化可能で多くの時間のかかる部分を並列化し、命令レベルから心電の解析過程を速め、その後、心電解析並列アルゴリズムを搭載したGPUサーバーを家庭向けのヘルス・クラウド・プラットフォームに配備することで、現在の家庭向けのヘルス・クラウド・サービスプラットフォームにおけるニーズを満足している。
【0205】
本発明の実施例におけるGPUによる並列心電データの解析方法は、心電信号の解析過程における1つ又は複数のステップをGPUで並列実行することで、心電信号の解析速度を著しく高めることができるものである。
【0206】
当業者には理解すべきこととして、本発明の実施例は、方法、システム又はコンピュータプログラム製品として提供することができる。従って、本発明では、完全なハードウェアの実施例、完全なソフトウェアの実施例又はソフトウェアとハードウェアを組み合わせた場合の実施例の形態を採用することができる。また、本発明では、コンピュータで利用可能なプログラムコードをその中に含む、コンピュータで利用可能な1つ又は複数の記憶媒体(磁気ディスクメモリ、CD−ROM、光学的メモリなどが含まれるが、これらに限られない)で実施されるコンピュータプログラム製品の形態を採用してもよい。
【0207】
本発明は、本発明の実施例に基づく方法、装置(システム)及びコンピュータプログラム製品のフロー図及び/又はブロック図を参照して説明されたものである。コンピュータプログラムでフローチャート及び/又はブロック図の中の各々のフロー及び/又はブロック、並びにフロー図及び/又はブロック図の中のフロー及び/又はブロックの組合せの実現を命令することができると解すべきものである。これらのコンピュータプログラムが汎用コンピュータ、専用コンピュータ、組込みプロセッサ又はその他のプログラミング可能なデータ処理装置に命令をするプロセッサを提供することで1つの機器を生成させて、コンピュータ又はその他のプログラミング可能なデータ処理装置のプロセッサで実行される命令によって、フローチャートの1つのフロー又は複数のフロー及び/又はブロック図の1つのブロック又は複数のブロックにおいて指定された機能を実現するための装置を生成させることができる。
【0208】
これらのコンピュータプログラムの命令を、コンピュータ又はその他のプログラミング可能なデータ処理装置が特定の方法で動作するよう導くことができるコンピュータ読取可能なメモリに格納して、当該コンピュータ読取可能なメモリに格納された命令によって、命令装置を含む製品を生じさせて、当該命令装置でフロー図の1つのフロー又は複数のフロー及び/又はブロック図の1つのブロック又は複数のブロックにおいて指定された機能を実現するようにしてもよい。
【0209】
これらのコンピュータプログラムの命令をコンピュータ又はその他のプログラミング可能なデータ処理装置に搭載し、コンピュータ又はその他のプログラミング可能な装置で一連の操作ステップを実行して、コンピュータにより実現される処理を生じさせることで、コンピュータ又はその他のプログラミング可能な装置で実行される命令によって、フローチャートの1つのフロー又は複数のフロー及び/又はブロック図の1つのブロック又は複数のブロックにおいて指定された機能を実現するためのステップを提供するようにしてもよい。
【0210】
以上に述べた具体的な実施例は、本発明の目的、技術的思想及び有益な効果についてさらに詳細に説明をするものである。理解すべきこととして、以上に述べたことは、本発明の具体的な実施例であるのにすぎず、本発明の保護範囲を限定するためのものではないので、本発明の趣旨と原則の中で行ういかなる修正、均等な置換、改良などもすべて本発明の保護範囲内に含まれるべきものである。