以下、本発明の好適な実施の形態を図面に基づいて説明する。
図1は本発明に係るプロセッサが搭載される超音波診断装置の全体的構成を示すブロック図である。図1のシステム制御部30は、当該超音波診断装置を統括的に制御する役割をもち、システム制御部30の中には全体制御を行うCPU31が搭載されている。また、このシステム制御部30は図1に示す各ユニットに対して制御タイミングの基本となる信号等を出力している。
送信ビームフォーマー18は、複数の送信遅延回路を有しており、各々の送信遅延回路の出力信号は、探触子10の内部にある各々の振動素子に供給される。複数の送信遅延回路は、システム制御部30から出力された制御タイミングの基本信号に基づいて駆動されており、探触子10の中に配列された複数の振動素子に対して、遅延時間が制御された送信信号が出力されている。
探触子10は、多数の振動素子を配列して構成されたアレイ振動子を有している。それぞれの振動素子は、生体に向けてタイミング制御された送信信号により超音波を送信する。生体に向けて送信した超音波は、生体からの反射波として受信される。図1において、この超音波の送受信の状態は1本の超音波ビームBとして概念的に示されている。この超音波ビームBを電子的に走査することによりセクタ形状の走査面14が形成される。この走査面14はデータ取り込み面であり、振動子からの距離を示すrと走査角θとを用いてデータの取り込み位置が把握される。本実施形態においてはセクタ走査方式を例示しているが、リニア走査、コンベックス走査、ラジアル走査及びその他の走査方式を採用することもできる。
受信ビームフォーマー16は、複数のA/D変換回路、複数の受信波位相整合回路、及び加算回路を備える。図示されていない各A/D変換回路は、各振動素子で受信されたエコー信号をデジタルデータに変換する機能をもつ。また、各受信波位相整合回路は各エコー信号の遅延量を制御して位相を揃える機能をもち、加算回路は位相整合された複数のエコー信号を加算する機能をもつ。探触子10で得られた複数のエコー信号は、受信ビームフォーマー16によって整相加算され1つのエコーデータが形成され、それがビーム処理部20に送られる。
ビーム処理部20においては、受信ビームフォーマー16から送られるエコーデータに対して、以下のような信号処理が順次行われる。すなわち、受信した高周波信号の包絡線を検出するための検波処理、信号の輝度を補正するためのダイナミックレンジの圧縮処理などの処理である。このような信号処理を行うために、ビーム処理部には複数のDSP34が搭載されている。各DSP34は、所定のプログラムを実行して信号処理を行う。そして、信号処理が終了したエコーデータは次段の画像処理部22に送られる。
画像処理部22においては、エコーデータに対する閾値処理、2値化処理などの変換処理が行われる。画像処理部22では、当該超音波診断装置の動作モードに応じて様々な処理が行われる場合がある。例えば、Bモード画像上でのカラードップラ法による血流画像の表示を行う場合には、画像処理部22では空間フィルタ処理などが行われる。この画像処理部22においても複数の画像データ処理用のDSP36が使用されている。画像処理部22から出力されたエコーデータは、次段のデジタルスキャンコンバータ(DSC)24に送られる。
DSC24においては画像データが作成される。DSC24の内部には画像メモリが設けられ、座標変換機能と補間処理機能とを備えている。座標変換処理を行うことによって、送受波座標系で管理されるエコーデータは、表示座標系で管理される画像データに変換される。このような画像データの作製処理にもDSP38が使用されている。
ビデオ出力部26は、DSC24から出力された画像データを、表示部28で画像表示するためのモニタ信号に変換する。表示部28としては一般的にCRTやLCDが用いられる。表示部28には、例えば、Bモード表示で、セクタ形状の走査面14に対応した断層画像が表示される。
操作パネル32は、キーボードやトラックボール等のデータ入力機器を有している。操作パネルはシステム制御部30と電気的に接続されており、操作パネル32から入力されたデータは、システム制御部30において、そのデータを保存することができる。システム制御部30に保存されるデータとしては、閾値処理のための閾値や折り返し補正処理のための位相角などがあげられる。
以上、説明したように、超音波診断装置の内部には、本実施形態においてはシステム制御のためのCPU31と、エコーデータ処理のための複数のDSP34、36、38などの複数のプロセッサが使用されている。
図2には、本発明の実施形態である超音波診断装置用プロセッサの概略ブロック図が示されている。プロセッサ40は、演算器42と内部メモリ44を有し、演算器42は内部メモリ44を経由してデータバス46との間でデータを送受する。システム制御部のCPU31とDSP34,36,38は、データバス46を用いることにより、図示されていない外部メモリを経由して、相互にデータの送受をすることができる。動作の詳細については後述の図5から図21までの図を用いて説明する。
本発明の実施形態の具体例の説明に入る前に、従来のエコーデータの処理方法を図3を用いて説明する。図3を用いて説明する内容は、前述した従来技術の課題を補足説明するための内容である。
図3に示すC言語のプログラム50は閾値処理のためのプログラムである。これは、演算対象データであるエコーデータと閾値を比較して、閾値以上の値については、エコーデータを無処理のままで保存し、閾値未満の値についてはエコーデータを0にするための処理を記述したものである。比較の対象である閾値THは一定値である。このプログラム50の中で用いられるエコーデータは、図4に示すように配列data[i]54に格納されている。図3のプログラム50の1行目は、変数iを回数カウンタとして、繰り返し処理がN回実行されることを示している。2行目は、if文の条件分岐処理を示している。演算対象の値data[i]と閾値THとの大小関係が調べられて、その結果に応じて分岐先が決定される。もし、あるエコーデータdata[i]の値が閾値THより大きな値である場合には、プログラム50の3行目の分岐先に処理が移り、data[i]の値はそのまま配列output[i]に格納される。もし、data[i]の値が閾値TH以下である場合には、プログラム50の5行目の分岐先に処理が移り、output[i]には0が格納される。
図3のプログラム50に示すような閾値処理をSIMD方式による並列演算によって行った場合には、上記のような条件分岐先を指定することができないか、あるいは、条件分岐先を指定できたとしても後続の処理が大幅に乱れてしまうという問題が発生する。例えば、4つのエコーデータを並列処理しようとする場合に、1つのケースとして、1つのデータが閾値THよりも大きく、残りのデータは閾値TH以下であるような場合は十分に発生しうる。このように、判定条件を満足するデータと満足しないデータが混在してしまうと、分岐先を二者択一で選択する処理を行うことは困難である。判定条件が混在するような事態が発生した場合には、一括で読み込んだ4つのデータの並列性を乱して、1つずつ分解して個別に処理するしかなくなり、結局は、1つずつのデータについて閾値との大小関係をそれぞれ判定し、逐次処理することになる。このようにSIMD演算機能を搭載したプロセッサを用いて、並列処理を維持したまま条件分岐処理を実行しようとしても、並列性を維持することができないために高速なデータ処理は望むことはできなかった。そこで、以下に本実施形態を説明する。
図5は、本発明の好適な第1の実施形態の概念図を示したものである。具体的には、エコーデータの大小判断を行うための閾値処理に関する内容を示している。この閾値処理は、図1に記す画像処理部22の中にあるDSP36を用いて実行されるデータ処理である。以下、図5において、閾値処理の説明をデータ処理の流れに沿って詳述する。演算対象の入力データ列70は、4つの入力データから構成されている。具体的には、図5に示す入力データ列70は、各16ビットの4つの入力データ(data[0]、data[1]、data[2]、data[3])から構成されている。入力データ列70は、第1演算器72と第2演算器84に入力される。ここで、第1演算器72に入力される比較データ列74も、4つの比較データから構成されている。第1演算器72では、入力データ列70と比較データ列74とを用いて以下の並列演算が行われる。
図6は、第1演算器72で行われる演算の詳細を示している。第1演算器72に入力された入力データ列70は、比較データ列74との比較のために減算されて、比較結果データ列88が得られる。すなわち、SIMD方式の減算操作により、4つの入力データ(data[0]、data[1]、data[2]、data[3])から、4つの比較データ(TH[0]、TH[1]、TH[2]、TH[3])を一括で減算することによって、4つの比較結果データ(tmp[0]、tmp[1]、tmp[2]、tmp[3])が得られる。ここでは減算を用いているが、比較結果データを得るために減算以外の算術演算、論理演算その他の演算を用いてもかまわない。4つの比較結果データは、入力データと比較データとの大小関係を判断するための手段となる。周知のことであるが、2進数表記の数値の最上位ビットは、数値の正負を表す符号ビットとして使用することができる。従って、この比較結果データ列88についても、各々の比較結果データの最上位ビットである16ビット目を、各々の符号ビット68として使用することができる。すなわち、図6において記号Sで表す4つの符号ビット(S0、S1、S2、S3)は、エコーデータと閾値との大小関係に応じて、“1”または“0”のいずれかの値になる(本明細書においては、2進数表記の数値を“ ”で括って表記する)。ここでは、具体例として、4つの符号ビットの値が決定し、S0=“0”、S1=“1”、S2=“0”、S3=“0”になったとする。この4つの符号ビットを抽出して順に並べると、4ビットの符号ビット列76が作成される。図6に示す例では、記号SIGNで表す符号ビット列76は、“0010”となる。本来、符号ビットは、“0”と“1”のいずれかの値を取るので、4ビットのビットパターンで識別できるのは24=16通りの組み合わせになる。
次に、図5に示した符号ビット列76と操作テーブルA80について、図7を用いて詳述する。図7においては、符号ビット列76は、前述した“0010”のビットパターンとして例示されている。一方、操作テーブルA80は、16組(16列)の操作データ列92から構成されており、それぞれの操作データ列92は、4つの操作データ90a、90b、90c、90dから構成されている。ある符号ビット列76のビットパターンが決定すると、それに応じて、ある特定の操作データ列82が決定されることが、図に示す矢印94によって示されている。
符号ビット列76を構成する各々の符号ビットの値は、入力データと、閾値の比較データとの大小関係の情報を抽出したものである。閾値処理を実行するためには、符号ビットが“0"であれば、入力データを無変換のまま処理すればよく、逆に、符号ビットが“1"であれば、入力データを0に変換して処理すればよい。これらの変換の必要あるいは不要の選択を行うために、符号ビットの値に応じた操作データとして、0xFFFFあるいはOx0000のいずれかを選択する。0xFFFFと0x0000の閾値処理における選択方法は、以下の2つの方法によって行う。(i)符号ビットが“0”の場合は操作データとして0xFFFFを選択する。(ii)符号ビットが“1”の場合には操作データとして0x0000を選択する。ちなみに、0xFFFFと0x0000はいずれも16進数表記の数値である。ここで、例示した符号ビット列76は、“0010”であるので、4つの符号ビットS0=“0”、S1=“1”、S2=“0”、S3=“0”に応じて選択される4つの操作データを列記すると、0xFFFF、0x0000、0xFFFF、0xFFFFとなる。この4つの操作データは、図7に示した矢印94で指し示す#2の位置の操作データ列としてTABLE_A[8]=0xFFFF、TABLE_A[9]=0x0000、TABLE_A[10]=0xFFFF、TABLE_A[11]=0xFFFFと記されている。この例から分かるように、4つの符号ビットが全て定まれば、それに対応する特定の操作データ列82の組み合わせも自動的に決定することができる。ここで、符号ビット列76が取り得るビットパターンは、“0000”から“1111”までの16通りであるので、特定の操作データ列82は図7に示す#0から#15までの16組の操作データ列のいずれか一つに該当する。操作テーブルA80は、これらの16組の操作データ列を集合することで構成されている。更に、操作データ列92を構成する4つの操作データは、前述の(i)と(ii)の2つのルールに従って、0xFFFF又は0x0000のいずれかに決定される。符号ビット列76で取り得る値がどのような値であっても、それに対応する特定の操作データ列82は操作テーブルA80の中に予め格納してある。なお、操作テーブルA80の実体的な構成は、図2に示すプロセッサ40内の内部メモリ44上に構成されるデータ列の集合である。符号ビット列76のビットパターンに応じて、ある操作データ列92を特定する際には、プログラム内で管理している相対的なメモリアドレス管理番号を使用してもよいし、メモリに割り当てられているハードウェアのアドレス番号を直接に利用してもよい。図7に示すTABLE_A[i]の記号は、メモリアドレス管理番号を示している。ちなみに、操作テーブルA80は、プロセッサ40の外部にある周辺デバイスの記憶部内に構成されてもよい。また、不揮発性のメモリに書き込むことによって、消去できない操作テーブルA80を構成することも可能である。
次に、図5に示した特定の操作データ列82、入力データ列70及び第2演算器84の関係を図8に基づいて詳述する。図8は、第2演算器84で行われる演算の内容を示している。第2演算器84に入力された入力データ列70は、特定の操作データ列82との論理積演算を行うことにより、出力データ列86に変換される。すなわち、SIMD方式の論理演算により、4つの入力データ(data[0]、data[1]、data[2]、data[3])に、4つの特定の操作データ(0xFFFF、0x0000、0xFFFF、0xFFFF)を作用させて、一括で論理積を取ることにより、4つの出力データ(out[0]、out[1]、out[2]、out[3])が得られる。周知のことであるが、論理積演算においては、双方のビット単位の入力値が“1”の場合にだけビット単位の出力値が“1”になる。また、ビット単位の入力値に1つでも“0”がある場合にはビット単位の出力値は“0”となる。本実施形態において閾値処理を行うための特定の操作データ列82を構成する4つの特定の操作データは、0xFFFFまたは0x0000のいずれかの値であり、論理積の演算において、0xFFFFを作用させるということは、演算対象である入力データに対して、全く何の変換処理も行わない操作であることを意味する。つまり、入力データは保存処理されてそのまま出力される。一方、0x0000を作用させるということは、演算対象である入力データを0に置き換える変更処理となる。すなわち、0x0000を作用させることは、ゼロへの置換処理となる。図8に示す具体例では、論理積演算にてdata[1]だけを0x0000と作用させているので、out[1]だけが0になる。その他の3つのデータout[0]、out[2]、out[3]は、それぞれの入力データdata[0]、data[2]、data[3]のそのままの値になる。結果として、第2演算部84での論理積演算により適正な閾値処理が行われることにより、出力データ列86が一括で得られる。
以上、図5の概念図に示したように、エコーデータである入力データ列70が第1演算器72と第2演算器84に入力された段階から、第2演算器84によって出力データ列86が出力される段階に至るまで、4つのデータは全て並進処理されており、演算の足並みが乱されることはない。このように、データ処理の同時並列性を保つことは、高速な実行速度を保つ上で極めて有効である。
ちなみに、本実施例においては、前述の(i)と(ii)の2つのルールに従って、符号ビットが“0”の場合は0xFFFFを対応させており、符号ビットが“1”の場合には0x0000を対応させている。しかし、別の適用例としては、符号ビットが“0”の場合は0x0000を対応させて、符号ビットが“1”の場合には0xFFFFを適用させるような他の操作テーブルA2を閾値処理に使用することも可能である。他の操作テーブルA2を用いて閾値処理を行う場合には、符号ビット列76のビットパターンが決定した直後であって、特定の操作データ列82を決定する前に、そのビットパターンを否定論理演算(NOT演算)によって反転させる必要がある。つまり、符号ビット列76の否定論理演算を追加することにより、他の操作テーブルA2を用いても正しい閾値処理の結果を得ることができる。ところが、他の操作テーブルA2を用いると、否定論理演算を実行するための演算の時間が余計に累積されてしまい、処理速度の面で不利な点が生じてしまうことになる。すなわち、演算の高速化を目的として考えると、図示されていない操作テーブルA2を用いるよりも、図7に示す操作テーブルA80を使用することが望ましい。
次に、参考までに、図9を用いて、図5の概念図に示した閾値処理をプロセッサに実行させる具体的なプログラムの説明を示す。図9に示すプログラム96は全部で4行の式からなっている。なお、C言語にはSIMD演算を表現する演算子が無いため、データを並列に扱う演算子として暫定的に“[]”の記号を使用する。
プログラム96の1行目に記す式tmp[]=data[]−TH[]は、SIMD方式による並列の減算処理を示す式であり、第1演算器72で行う演算に相当する。すなわち、入力データ列data[]を構成する4つの入力データ(data[0]、data[1]、data[2]、data[3])から、比較データ列TH[]を構成する4つの比較データ(TH[0]、TH[1]、TH[2]、TH[3])を一括で減算することによって、比較結果データ列tmp[]を構成する4つの比較結果データ(tmp[0]、tmp[1]、tmp[2]、tmp[3])が得られる。
プログラム96の2行目に記す式は、比較結果データ列tmp[]から符号ビットSが抽出されて、符号ビット列SIGNが生成される処理を示す式である。本実施形態のSIMD処理が可能なプロセッサでは、符号ビットに相当するビットを検出する機能を内蔵している。そのため、2行目の式に示したようなシフト命令や論理積演算等を行うことなく、直接的にSIGNのビットパターンに相当するデータを導出することができる。従って、符号ビットの抽出処理及び符号ビット列SIGNの生成処理において並列演算の足並みを乱すことはない。ちなみに、2行目に記す式は、符号ビットの抽出処理と符号ビット列SIGNの生成処理について演算方法を例示したものである。まず(tmp[3]>>12)の部分については、2進数表記のデータとしての比較結果データtmp[3]を右に12桁シフトさせる。すると、tmp[3]の最上位16ビット目に位置していた符号ビットの数値は、最下位ビットから数えて4番目のビットに移動される。12桁右シフトした後の2進数表記データに対して0x8との論理積を行うことにより4桁目のみが“1”か“0”かのビット判定が行われる。他の3つの入力データtmp[2]、tmp[1]、tmp[0]についても同様の処理が行われる。すなわち、tmp[2]の符号ビットは、右に13桁シフトさせることで3桁目に移動し0x4との論理積を行うことで3桁目のみのビット判定が行われる。tmp[1]の符号ビットは、右に14桁シフトさせることで2桁目に移動し0x2との論理積を行うことで2桁目のみのビット判定が行われる。tmp[0]の符号ビットは、右に15桁シフトさせることで1桁目に移動し0x1との論理積を行うことで1桁目のみのビット判定が行われる。4桁目、3桁目、2桁目及び1桁目の各々についてビット判定が行われた4つのビット判定のデータは、4つの論理和を取ることにより1つのデータに集約される。4つの符号ビットを1つのデータに集約することにより、4ビットの符号ビット列SIGNのビットパターンが形成される。(実際にはプロセッサ内ではシフト命令や論理積に相当する抽出処理が実行されるだけであり、各データごとの並列性が乱されることはない)なお、正負の判定を行う手段としては、符号ビットが最適であるので利用されるが、抽出されるビットは任意の桁のビットを抽出してもかまわない。例えば、第1演算器72で算術演算を行った上で、最上位ビット以外のある特定のビットを代表ビットとして抽出し、それらの代表ビットから代表ビット列を集積することも可能である。
プログラム96の3行目に示す式は、操作データ列が格納された操作テーブルA80の中から1つの操作データ列を特定する処理を示す式である。特定の操作データ列は符号ビット列SIGNのビットパターンによって決定される。つまり、符号ビット列SIGNのビットパターンに応じて、操作テーブルA80である配列TABLE_A[]の中から1つの操作データ列が特定される。特定された操作データ列は、式の左辺に記す変数としてのMASKに代入される。
プログラム96の4行目に記す式out[]=data[]&MASK[]は、SIMD方式による並列の論理積演算を示す式である。MASK[]は特定の操作データ列82を示しており、3行目の式で決定した変数MASKと同値である。4行目の式によって、入力データ列70としてのdata[]を構成する4つの入力データ(data[0]、data[1]、data[2]、data[3])と、特定の操作データ列82としてのMASK[]との論理積を取ることによって、出力データ列86としての(out[0]、out[1]、out[2]、out[3])を得ることができる。
以上のような手順で 閾値処理を行うことにより、4つの入力データを一括して処理することができる。最初の入力データ列(data[0]、data[1]、data[2]、data[3])の閾値処理が完了した後には、後続の入力データ列である(data[4]、data[5]、data[6]、data[7])の閾値処理が順次実行されることは言うまでもない。条件分岐命令を使った逐次判定処理を行わないので、判定条件に相当する処理を高速に行うことができ、逐次処理と比較すると数倍の処理速度を期待できる。
次に、本発明の第2の実施形態としてカラードップラ法による血流画像の形成を行う場合における折り返し現象の補正処理について詳述する。カラードップラ法とは、血流で発生する超音波ドップラ効果を利用した血流状態の表示方法である。カラードップラ法は血流を視覚化して表示するための有効な方法であるが、血流速度がサンプリング周期で決定される上限値よりも大きい場合には、血流方向が探触子に近づく方向であるのか、遠ざかる方向であるのか判定できなくなるという側面を有している。これは、偏移周波数がいわゆるナイキスト周波数を越えた場合に発生する折り返し現象として知られており、適切な血流速度の算出を阻害する現象である。そこで、この折り返し速度近傍において、適切な血流速度の平均値を求めるために、速度データに対しては、折り返し補正処理が行われる。
一般に、カラードップラ法において超音波は生体に対して同一方向に複数回送受信されて、それぞれのエコーデータを基に血流速度の平均値が求められる。この場合に、血流速度の検出上下限が存在するために、血流速度値の中には、折り返したデータが混在する。この血流速度に対して平均化処理などを行う場合、折り返し速度をまたぐデータ同士については、折り返し補正処理をデータ毎に選択的に行う必要がある。以下には、折り返し補正処理に関して、図10から図18までを用いて詳述する。
図10に示す複素平面のグラフ114は、超音波ドップラ効果に基づいて得られる血流の速度と血流の方向を図示するための概要図を示したものである。速度情報は複素平面上において位相角θをもつベクトルとして記載することができる。図10に示す複素平面グラフ114上では、2つの速度情報の位相としてθ1(符号116)とθ2(符号118)が示されている。θ1とθ2のいずれも、探触子に近づく同一方向の血流を観測することで得られた測定値とする。そうすると、θ1もθ2も正の値(例えば、θ1=130°、θ2=200°)として測定されるのが適切である。しかしながら、ドップラ法で測定される測定値としては、θ2は負の値(例えばθ2=−160°)として測定されてしまう。これを折り返し現象という。測定値をそのまま用いて、単純な平均値である(θ1+θ2)/2の計算をすると、θ2が見かけ上、負の値であるので、図10のグラフ114に記すθaのベクトル120で示される角度が求められる。しかし、θ2は実際には正の値なので、θaのベクトル120の位置は不適切となる。正しい平均値(θ1+θ2)/2の値は、グラフ114に示したθbのベクトル122として表されるのが適正である。
そこで、正しい平均値を求めるために、以下に述べる手順で2段階の処理を行う。まず、第1段階の処理として、演算対象の2つの値の角度差の絶対値を求め、その角度差△θが所定角度180°より大きいかどうかを調べる。角度差△θは△θ=|θ1−θ2|の式で表される。角度差△θが180°よりも大きい場合にはベクトルを表す矢印を反転させる必要があると判断し、反対に180°以下である場合には反転させないので何の処理も行わない。反転する必要があると判断された場合には、次の第2段階の処理を行う。第2段階の処理においては、ベクトルを表す矢印を反転させるのに、時計周りの回転方向に180°に反転するか、それとも反時計方向に180°に反転するかを決定する処理を行う。具体的には第2段階の処理においては、単純平均値θavgの計算結果が判断に使用される。単純平均値θavgはθavg=(θ1+θ2)/2の式で表される。θavgの値が0以上の値であれば、単純平均した値から180°を引く。つまり、時計周りの方向に180°回転させることで反転処理を行う。一方、θavgの値が0より小さい値であれば、単純平均した値に180°を加える。つまり、反時計方向に180°回転させることで反転処理を行う。以上のように、単純平均値θavgと角度差△θを求めて、第1段階と第2段階の処理を併せて行うことによって、折り返し補正処理を行うことができる。この2段階の併合処理自体は公知技術と言えるが、本実施形態ではそれをSIMD方式で実現している。
図11は、カラードップラ法の折り返し補正処理の概念図を示したものである。この処理は図1に記す画像処理部22の中にあるDSP36を用いて実行されるデータ処理である。以下、図11を用いて、折り返し補正処理の説明をデータ処理の流れに沿って詳述する。演算対象の入力データ列124は、4つの入力データave_TH[0]、ave_TH[1]、ave_TH[2]、ave_TH[3]から構成されている。ここで、ave_TH[P]は単純平均値{θ(2P+1)+θ(2P+2)}/2(但し、Pは0以上の整数)の値であり、例えばave_TH[0]=(θ1+θ2)/2で求められ、ave_TH[1]=(θ3+θ4)/2で求められる。更に、θ5及びθ6を用いてave_TH[2]の値が求められ、θ7及びθ8を用いてave_TH[3]の値が求められる。ここでそれぞれのθが取り得る値は単なる例示であり、同じ値が含まれていてもよいし、異なる値であってもよい。これらの単純平均値ave_TH[P]は、入力データ列124に代入される前の段階で予め計算で求められている。入力データ列124は、第1演算器126と第2演算器148に入力される。
図12を用いて、第1演算器126で行われる演算の内容を説明する。第1演算器126では、入力データ列124から比較データ列140を減算することにより比較結果データ列152が得られる。折り返し補正処理の実施形態においては、比較データ列140の値は全て0であるので、比較結果データ列152から抽出した4つの符号ビット(S0、S1、S2、S3)の各々の値は、各々の単純平均値ave_TH[]の正負を示すことになる。
次に、図11に示す符号ビット列128と操作テーブルB130との関係について、図13を用いて説明する。図13においては、符号ビット列128は、“0101”を例示のビットパターンとして示している。符号ビット列128を構成する各々の符号ビットの値が“0”であれば、単純平均値を示すベクトル120は、図10に示すグラフ114の実数軸(横軸)より上方の領域に位置していることを示す。従って、符号ビットが“0”であることは、そのベクトル120を反転させようとすると時計回りの方向が適切であることを示している。また、逆に、符号ビットの値が“1”であれば、単純平均値を示すベクトル120は、図10に示すグラフ114の実数軸(横軸)より下方の領域に位置していることを示している。従って、符号ビットが“1”であることは、そのベクトル120を反転させようとすると反時計回りの方向が適切であることを示している。整理すると、符号ビットが“0”であれば、−180°回転の操作データを作用させ、符号ビットが“1”であれば、+180°回転の操作データを作用させればよい。10進数表記の180は16進数表記で0x00B4であることから、図13に示す操作デーブルB130においては、(iii)符号ビットが“0”の場合は0xFF4Cを選択し、(vi)符号ビットが“1”の場合には0x00B4を選択する。操作テーブルB130に格納される操作データの値は、(iii)と(vi)との2つのルールに従って決定されている。図13に示すように、例示のビットパターン“0101”に対応する特定の操作データ列132は、矢印154で指し示す#5の位置の操作データ列132であって、TABLE_B[20]=0xFF4C、TABLE_B[21]=0x00B4、TABLE_B[22]=0xFF4C、TABLE_B[23]=0x00B4となる。特定の操作データ列132は、後述の第2演算器148での論理演算を行う段階では、OFFSET[]という名称の配列に代入される。符号ビット列128のビットパターンがどのような値を取っても、そのビットパターンに対応する特定の操作データ列が操作テーブルB130の中に予め準備されている。例示した符号ビット列128は4ビットであるため、操作テーブルB130は16組の操作データ列から構成されている。もし、SIMDの演算の並列性が高い場合であって、符号ビット列128が8ビットであれば、それに対応して予め準備される操作テーブルB130は256組の操作データ列から構成されることになる。一般的には、代表ビット列がN桁である場合には、予め準備される操作テーブルは2N組の操作データ列から構成される。なお、ここでは角度補正を理解しやすいように±180°を整数値で表現したが、実際には精度を確保するため、±180°を±1.0に正規化して16ビット固定小数点で処理する方がよい。
図11に戻ってこれまでの演算を確認すると、入力データ列124、第1演算器126、符号ビット列128及び操作テーブルB130に基づいて、特定の操作データ列132が決定され、それによって血流の速度を示すベクトル120を反転する方向を決定する演算を行ってきた。ところで、ベクトルの回転方向の決定とは別に、反転の必要または不要の判定については別の判定条件を必要とするので、その判定条件を導くための演算を行う必要がある。以下には、図11に示す参照データ列156、第3演算器134、符合ビット列136及び操作テーブルC138を用いて決定される反転の必要、不要の判定処理について記す。
演算対象の参照データ列156は、4つの入力データdelt_TH[0]、delt_TH[1]、delt_TH[2]、delt_TH[3]から構成されている。ここで、delt_TH[P]は、位相差{θ(2P+1)−θ(2P+2)}の絶対値(但し、Pは0以上の整数)の値を示しており、例えばdelt_TH[0]=|θ1−θ2|により求められ、delt_TH[1]=|θ3−θ4|で求められる。これらの角度差delt_TH[P]は、参照データ列156に代入される前の段階で予め計算で求められている。参照データ列156は、第3演算器134に入力される。
図11に示す第3演算器134で行われる演算の内容を、図14を用いて説明する。第3演算器134では、参照データ列156から比較データ列158を減算して比較結果データ列160が得られる。反転の要不要の判定が180°との大小関係で判定されるので、比較データ列158に代入される値は全て180となる。つまり、PI[0]=0x00B4、PI[1]=0x00B4、PI[2]=0x00B4、PI[3]=0x00B4となる。比較結果データ列160から抽出した4つの符号ビット(S0、S1、S2、S3)の各々の値は、反転の要不要の判定情報を有している。
次に、符号ビット列136と操作テーブルC138の関係について、図15を用いて記す。図15においては、符号ビット列136は、“0110”を例示のビットパターンとして示している。符号ビット列136を構成する各々の符号ビットの値が“0”であれば、角度差の絶対値から180°を減算した値が正または0であることを示しており、反転処理が必要であることを意味する。操作テーブルC138の中から特定される操作データ列162は、前述した回転方向を決定するための特定の操作データ列132と作用させることを前提としている。従って、反転が必要な場合には、0xFFFFの演算子を選択すればよい。あるいは逆に、符号ビットの値が“1”であれば、角度差の絶対値から180°を減算した値が負であることを示しており、反転処理が不要であることを意味する。従って、反転が不要な場合には0x0000の演算子を選択すればよい。図15に示す操作テーブルC138においては、(v)符号ビットが“0”の場合は0xFFFFを選択し、(vi)符号ビットが“1”の場合には0x0000を選択する。操作テーブルC138に格納される全ての操作データの値は、(v)と(vi)との2つのルールに従って決定されている。図15に示すように、例示のビットパターン“0110”に対応する特定の操作データ列162は、矢印164で指し示す#6の位置の操作データ列であってTABLE_B[24]=0xFFFF、TABLE_B[25]=0x0000、TABLE_B[26]=0x0000、TABLE_B[27]=0xFFFFとなる。特定の操作データ列162は、後述の第2演算器148での論理演算を行う段階では、MASK[]という名称の配列に代入される。ちなみに、反転の要不要を決定する目的である操作テーブルC138と、閾値処理を行う目的である操作テーブルA80とは、実質的に同じ操作テーブルとなっている。
次に、図11の第2演算器148で行われる演算について記す。第2演算器148は、論理演算器164と算術演算器166の2つの演算器からなっている。図16には、第2演算器148の一部である論理演算器164で行われるデータ演算の内容が示されている。論理演算器164には、操作テーブルB130の中から導き出された特定の操作データ列132と、操作テーブルC138の中から導き出された特定の操作データ列162と、が入力される。論理演算器164では論理積演算が行われて、派生操作データ列168が求められる。すなわち論理演算器164では、4つの操作テーブルB130から導出された操作データ(OFFSET[0]、OFFSET[1]、OFFSET[2]、OFFSET[3])と、4つの特定の操作データ(MASK[0]、MASK[1]、MASK[2]、MASK[3])との論理積により得られた4つのデータを、再度(OFFSET[0]、OFFSET[1]、OFFSET[2]、OFFSET[3])に上書きして格納する。特定の操作データ列132には、反転の回転方向を指定する+180あるいは−180のいずれかの値が格納されており、特定の操作データ列162に格納されている0xFFFFあるいは0x0000のいずれかの値と作用して、論理積の演算が行われ、派生操作データ列168が得られる。論理積演算が行われることによって、以下に記す3つの処理の中から1つの処理が選択される。つまり、1つは反転が不要な処理であり、もう1つは反転が必要であって反時計回りに180°回転させる処理であり、残りの1つは反転が必要であって時計回りに180°回転させる処理である。このように、異なる2つの操作テーブルから導出される2つの操作データ列を相互に作用させることによって、多様な演算を実行することが可能となる。本実施形態においては、反転が不要な処理については、更に2つに細分化する必要がないので3つのオペレーションからなる処理を並列演算で行うことができる。ちなみに、一般的には2つの操作テーブルを用いれば互いに異なる4つの処理を同時並列の処理で行うことができる。得られた演算結果はOFFSET[]に再度格納されて、次段の算術演算器166で用いられる。
図17は、第2演算器148の一部である算術演算器166で行われるデータ演算の内容を示している。算術演算器166には、論理演算器164から出力されるOFFSET[]の派生操作データ列168と、ave_TH[]の入力データ列124とが入力される。算術演算器166では入力データ列124と、論理演算器164の演算結果である派生操作データ列168との加算が行われて、出力データ列170が得られる。算術演算器166で行う操作は、まだ折り返し補正処理が行われていない個々の入力データave_TH[0]、ave_TH[1]、ave_TH[2]、ave_TH[3]を、適切に折り返し補正処理が施されたデータに修正するための操作とみなすことができる。適切なデータに修正するために、前述した3つのオペレーションのいずれか1つの操作が選択的に行われて、出力データ列を構成する各データ(out[0]、out[1]、out[2]、out[3])が作成される。
以上、図11の概念図に示すような演算を行うことにより、流速の単純平均値である入力データ列124が第1演算器126に入力されて符号ビット列128が生成され、操作テーブルB130の中から特定の操作データ列132が選択される。また、参照データ列156が第3演算器134に入力されて符号ビット列136が生成され、操作テーブルC138の中から特定の操作データ列162が選択される。そして、第2演算器148において、操作データ列132と操作データ列162との論理演算が行われる。その論理演算で得られた派生操作データ列168に対して入力データ列124が加算されて、出力データ列170が得られる。このように、演算の全ての段階において4つのデータは全て並進して処理が行われており、演算の足並みが乱されることはない。操作テーブルB130と操作テーブルC138との2つの操作テーブルを用いることによって、3つの操作から選択的に1つの操作を特定するような処理を行うことができる。
参考までに、次に、図11の概念図に示した折り返し補正処理を、プロセッサに実行させる具体的なプログラムとして記述する。図18に示すプログラム174が、その折り返し補正処理のためのプログラムであり全部で7行の式からなっている。このプログラム174においては、単純平均値のデータ列ave_TH[P]と角度差delt_TH[P]とを演算対象として用いる。ただし、プログラム174を実行する前段階において、単純平均値のデータ列ave_TH[P]と角度差delt_TH[P]は既に求められているものとしている。すなわち、単純平均値{θ(2P+1)+θ(2P+2)}/2(但し、Pは0以上の整数)の値は、配列ave_TH[]に格納済みであり、角度差の絶対値|θ(2P+1)−θ(2P+2)|(但し、Pは0以上の整数)の値についても、配列delt_TH[]に格納済みであるとして、それらのデータを用いた演算を開始する部分から説明を記す。
図18に示すプログラム174の1行目に記す式tmp[]=delt_TH[]−PI[]は、SIMD方式による並列の減算処理を示す式である。図14に示す第3演算器134で行われる比較演算に相当する。すなわち、入力データ列delt_TH[]を構成する4つの入力データ(delt_TH[0]、 delt_TH[1]、 delt_TH[2]、 delt_TH[3])から、比較データ列PI[]を構成する4つの比較データ(PI[0]、PI[1]、PI[2]、PI[3])を一括で減算することによって、比較結果データ列tmp[]を構成する4つの比較結果データ(tmp[0]、tmp[1]、tmp[2]、tmp[3])が得られる。
プログラム174の2行目に記す式は、比較結果データ列tmp[]から符号ビットSが抽出されて、符号ビット列SIGNが生成される処理を示す式である。図14に示す符号ビット列136の生成処理に相当する。2行目の式の右辺の処理について記す。まず(tmp[3]>>12)の部分については、比較結果データtmp[3]の2進数表記のデータを右に12桁シフトさせる。そうすると、tmp[3]の最上位16ビット目に位置していた符号ビットの数値は、最下位ビットから数えて4番目のビットに移動される。次に12桁右シフトした後の数値に対して0x8との論理積を行うこと[(tmp[3]>>12)& 0x8]により、4桁目のみが“1”か“0”かのビット判定が行われる。他の3つの入力データtmp[2]、tmp[1]、tmp[0]についても、同様の処理が行われる。すなわち、tmp[2]の符号ビットは、右に13桁シフトさせることで3桁目に移動し、0x4との論理積を行うことで、3桁目のみが“1”か“0”かのビット判定が行われる。tmp[1]の符号ビットは、右に14桁シフトさせることで2桁目に移動し、0x2との論理積を行うことで、2桁目のみが“1”か“0”かのビット判定が行われる。tmp[0]の符号ビットは、右に15桁シフトさせることで1桁目に移動し、0x1との論理積を行うことで、1桁目のみが“1”か“0”かのビット判定が行われる。4桁目、3桁目、2桁目及び1桁目の合計4つのビット判定のデータは、4つの論理和を取ることにより、1つのデータに集約される。2行目に示す式の中の&記号は論理積を、|記号は論理和の演算を表す。4つの符号ビットを1つのデータに集約することにより符号ビット列SIGNのビットパターンが形成される。
プログラム174の3行目に示す式は、操作データ列が格納された操作テーブルC138の中から、1つの操作データ列を特定する処理を示す式である。図15に示すような、特定の操作テーブル162を特定する処理に相当する。符号ビット列136の操作テーブルC138の符号ビット列SIGNのビットパターンに応じて、操作テーブルC138の配列TABLE_C[]の中から1つの操作データ列が特定され、MASKという特定された操作データ列として決定される。図15に示すように、符号ビット列136がSIGN=“0110”であった場合には、TABLE_C[24]=0xFFFF, TABLE_C[25]=0x0000, TABLE_C[26]=0x0000, TABLE_C[27]=0xFFFFの4つのデータを、特定の操作データとして使用する。図18のプログラムにおいて特定の操作データ列は、MASKという名称で指定される。
プログラム174の4行目に記す式は、入力データ列ave_TH[]から符号ビットSが抽出されて、符号ビット列SIGN2が生成される処理を示す式である。4行目の式の右辺の処理について記すと、まず(ave_TH[3]>>12)の部分については、入力データave_TH[3]の2進数表記のデータとして右に12桁シフトさせる。そうすると、ave_TH[3]の最上位16ビット目に位置していた符号ビットの数値は、最下位ビットから数えて4番目のビットに移動される。次に12桁右シフトした後の数値に対して0x8との論理積を行うこと{(ave_TH[3]>>12)&0x8}により、4桁目のみが“1”か“0”かのビット判定が行われる。他の3つの入力データave_TH[2]、ave_TH[1]、ave_TH [0]についても、同様の処理が行われる。すなわち、ave_TH [2]の符号ビットは、右に13桁シフトさせることで3桁目に移動し、0x4との論理積を行うことにより3桁目のみが“1”か“0”かのビット判定が行われる。ave_TH[1]の符号ビットは、右に14桁シフトさせることで2桁目に移動し、0x2との論理積を行うことにより2桁目のみが“1”か“0”かのビット判定が行われる。ave_TH [0]の符号ビットは、右に15桁シフトさせることで1桁目に移動し、0x1との論理積を行うことにより1桁目のみが“1”か“0”かのビット判定が行われる。4桁目、3桁目、2桁目及び1桁目の合計4つのビット判定のデータは、4つの論理和を取ることにより、1つのデータに集約される。4つの符号ビットを1つのデータに集約することにより符号ビット列SIGN2のビットパターンが形成される。
5行目に示す式は、操作データ列が格納された操作テーブルB130の中から、1つの操作データ列を特定する処理を示す式である。符号ビット列SIGN2のビットパターンに応じて、操作テーブルB130の配列TABLE_B[]の中から1つの操作データ列が特定され、OFFSETという名称の特定の操作データ列として決定される。具体的な数値を用いると、例えば、符号ビット列SIGN2が“0101”であった場合には、TABLE_B[20]=0xFF4C, TABLE_B[21]=0x00B4, TABLE_B[22]= 0xFF4C, TABLE_B[23]= 0x00B4の4つのデータを、特定の操作データとして使用する。図18のプログラムにおいて特定の操作データ列132は、OFFSETという名称で指定される。
6行目に記す式OFFSET[]=OFFSET[]&MASK[]は、SIMD方式による並列の論理積演算を示す式である。MASK[]は特定の操作データ列162を示しており、3行目の式で決定した変数MASKと同値である。4行目の式によって、操作データ列132を構成する4つの入力データ(OFFSET[0]、OFFSET[1]、OFFSET[2]、OFFSET[3])と、特定の操作データ列162としてのMASK[]との論理積を取ることによって、派生操作データ列としての(OFFSET[0]、OFFSET[1]、OFFSET[2]、OFFSET [3])を得ることができる。
7行目に記す式out[]=ave_TH[]+OFFSET[]は、SIMD方式による並列の加算演算を示す式である。まだ折り返し補正処理がなされていない入力データ列ave_TH[]に対して、派生操作データ列OFFSET[]を加算することによって、各々のデータに対して選択的に適切な折り返し補正処理がなされて、結果がout[]に格納される。
次に、変形例としてエコーデータの2値化処理について詳述する。本明細書に記す2値化処理とは、画像を構成する画素の輝度値が判定基準値より大きければ1に、小さければ0にする処理のことを示す。具体的な適用例としては、心臓の断層面に係るエコーデータを処理する場合に生体組織部である心筋と、心腔との境界を検出するような場合に適用できる。この2値化処理は、図1に記す画像処理部22の中にあるDSP36によって行われるデータ処理である。
以下、図19を用いて、2値化処理の演算の流れに沿って詳述する。演算対象の入力データ列178は、4つの入力データから構成されており、第1演算器180に入力される。4つの比較データから構成される比較データ列182も、第1演算器180に入力される。比較データ列182に格納されている値は、例えば、画素の輝度値の明暗を判定するための判定基準値である。第1演算器180では、入力データ列178から比較データ列182を引く減算が行われて、比較結果データ列が生成される。従って、比較結果データ列から抽出した4つの符号ビット(S0、S1、S2、S3)の各々の値は、判定基準値との大小関係の判定結果の情報を有している。符号ビット列184は、4つの符号ビットを集合したものである。
次に、図19に示した符号ビット列184と操作テーブルD186について、図20を用いて詳述する。図20に示す符号ビット列184は、“0010”のビットパターンとして例示されている。一方、図20に示す操作テーブルD186は、16組(16列)の操作データ列から構成されており、それぞれの操作データ列は4つの操作データから構成されている。符号ビット列184のビットパターンが決定すると、それに応じて16組の中から、ある特定の操作データ列188が決定されることが、図20に示す矢印190によって示されている。
符号ビット列184を構成する各々の符号ビットの値は、入力データと、閾値の比較データとの大小関係の情報を抽出したものである。従って、2値化処理を実行するためには、符号ビットが“0”であれば、入力データを1に置換処理すればよい。逆に、符号ビットが“1”であれば、入力データを0に置換処理すればよい。これらの置換処理の必要、不要の選択を行うために、符号ビットの値に応じた操作データとして、0x0001あるいはOx0000のいずれかを選択する。0x0001と0x0000の2値化処理における選択方法は、以下の2つの方法によって行う。(vii)符号ビットが“0”の場合は0x0001を選択する。(viii)符号ビットが“1”の場合には0x0000を選択する。ここで、例示した符号ビット列184は、“0010”であるので、4つの符号ビットS0=“0”、S1=“1”、S2=“0”、S3=“0”に応じて選択される4つの操作データを列記すると、0x0001、0x0000、0x0001、0x0001となる。この4つの操作データは、図20に示した矢印190で指し示す#2の位置の操作データ列としてTABLE_D[8]=0x0001、TABLE_D[9]=0x0000、TABLE_D[10]=0x0001、TABLE_D[11]=0x0001と記されている。この例から分かるように、4つの符号ビットが全て定まれば、それに対応する特定の操作データ列188の組み合わせも自動的に決定することができる。操作テーブルD186は、この16組の操作データ列を集合することで構成されている。更に、操作データ列を構成する4つの操作データは、前述の(vii)と(viii)の2つのルールに従って、0x0001又は0x0000のいずれかが決定される。符号ビット列184で取り得る値がどのような値であっても、それに対応する特定の操作データ列188は操作テーブルD186の中に予め格納してある。
図19に示すように、特定された操作データ列188はそのまま出力データ列192として使用することができる。操作テーブルD186には、2種類の値を予め格納しておくことができるので、2値化処理の場合には、第2演算器を特には必要としない。
図21に示すプログラム194は、2値化処理のためのプログラムを例示したものである。プログラム194の1行目及び2行目で行われる処理は、図9に示す閾値処理のプログラム96の1行目及び2行目で行う処理と実質的に同じである。すなわち、プログラム194の1行目に記す処理によりSIMD方式による並列の減算処理が行われる。そして、プログラム194の2行目に記す処理によって、SIGNで表される4ビットの符号ビット列184が作成される。プログラム194の3行目に示す式は、複数の操作データ列が格納された操作テーブルD186の中から、1つの操作データ列を特定する処理を示す式である。つまり、プログラム194の2行目に示すSIGNのビットパターンに応じて、図20に示す操作テーブルD186の配列TABLE_D[]の中から1つの操作データ列が特定される。そして、その特定の操作データ列188の値は、配列out[]にそのまま代入される。
以上のように、2値化処理を行う場合にも、2値化処理のための操作テーブルD186を用いることによって、4つの入力データを一括して処理することが可能となる。但し、図19の概念図に示す2値化処理を行う場合は、図5及び図11等に示した実施形態とは異なり、第2演算器に相当するものは含まれていない。
これまで詳述した閾値処理、カラードップラ法による折り返し補正処理及び2値化処理の説明においては、最大のデータバス幅が64ビットの演算器を用いるものであった。そして、1つのデータ長を16ビットとし、16ビット×4データの並列演算が可能なSIMD方式の演算器での例を示した。しかし、SIMD方式のプロセッサで行える演算は、16ビット×4データの場合に限定されるものではない。プロセッサの仕様によっては、32ビット、128ビットもしくは256ビットのデータバス幅を有する場合があり、それらのデータバス幅を、2分割、4分割、8分割又は16分割等のいずれかの分割値の中から1つを選択して並列処理を実行させることも可能である。並列処理を行う場合に、同時に処理できるデータ数はN個(但し、Nは2以上の整数)となる。その場合には、入力データ列、比較データ列、比較結果データ列、特定の操作データ列、出力データ列は全てN個のデータから構成される。なお、代表ビット列の桁数もN桁となる。これらのデータ列の個数あるいは桁数に関してNという数が一致していることは、演算の過程で一貫して並列処理が行われていることを示している。なお、SIMD方式の演算器を複数個備えている場合には、高速化処理の性能改善度は更に大きくなる。
70 入力データ列、72 第1演算器、74 比較データ列、76 符号ビット列、80 操作テーブルA、82 特定の操作データ列、84 第2演算器、86 出力データ列。