本章では,FlowDesignerとHARK のノード群で使用するデータ型について述べる.HARK でデータ型を意 識する必要があるのは,以下の2つのケースである.
• ノードのプロパティ設定
• ノード同士の接続(ノード間通信)
ノードのプロパティ設定で用いるデータ型
ノードのプロパティとして現状で指定できるデータ型は,以下の5種類である.
型 意味 データ型レベル
int 整数型 基本型
float 単精度浮動小数点型 基本型
string 文字列型 基本型
bool 論理型 基本型
Object オブジェクト型 FlowDesigner固有型
subnet param サブネットパラメータ型 FlowDesigner固有型
int,float,string,bool,については,C++の基本データ型をそのまま利用しているので,仕様はC++に準 じる.Object,subnet paramについては,FlowDesigner固有のデータ型である.Objectは,FlowDesigner内
部のObject型を継承しているクラスとして定義されるデータ型の総称となっている.HARK では,プロパ
ティとして指定できるObjectは,VectorもしくはMatrixであるが,後述のように基本型以外はObject型 を継承しているため,VectorやMatrixのようにテキスト形式での記述が実装されていればプロパティとして 指定することができる.基本型であっても,Object型を継承したオブジェクトを利用することで(例えば<Int
1>など),Objectとして指定することも可能である.subnet paramは,複数のノード間で一つのパラメー
タをラベルを用いて共有する際に用いられる特殊なデータ型である.
ノード同士の接続の際に用いるデータ型
ノードの接続(ノード間通信)は,異なるノードのターミナル(ノードの左右に黒点として表示される)を
FlowDesignerのGUI上で線で結ぶことによって,実現される.この際に用いられるデータ型は,以下の通り
である.
型 意味 データ型レベル
any Any型 FlowDesigner固有型
int 整数型 基本型
float 単精度浮動小数点実数型 基本型
double 倍精度浮動小数点実数型 基本型
complex<float> 単精度浮動小数点複素数型 基本型
complex<double> 倍精度浮動小数点複素数型 基本型
char 文字型 基本型
string 文字列型 基本型
bool 論理型 基本型
Vector 配列型 FlowDesignerオブジェクト型
Matrix 行列型 FlowDesignerオブジェクト型
Int 整数型 FlowDesignerオブジェクト型
Float 単精度浮動小数点実数型 FlowDesignerオブジェクト型
String 文字列型 FlowDesignerオブジェクト型
Complex 複素数型 FlowDesignerオブジェクト型
TrueObject 論理型(真) FlowDesignerオブジェクト型
FalseObject 論理型(偽) FlowDesignerオブジェクト型
nilObject オブジェクト型(nil) FlowDesignerオブジェクト型
ObjectRef オブジェクト参照型 FlowDesigner固有型
Map マップ型 HARK 固有型
Source 音源情報型 HARK 固有型
anyはあらゆるデータ型を含む抽象的なデータ型であり,FlowDesigner固有で定義されている.int,float, double,complex<float>,complex<double>,char,string,boolは,C++の基本データ型を利用してい る.これらの仕様は対応するC++のデータ型の仕様に準ずる.基本型を,Objectのコンテキストで使おうと すると自動的にGenericType<T> に変換され,Int,Floatのように,Objectを継承した先頭が大文字になっ たクラスとして扱うことができる.ただし,String,Complexは,GenericTypeではなく,それぞれstd:string, std:complexに対するデファインとして定義されているが,同様にstring, complexをObject型として使う 際に用いられる.このように基本型に対して,FlowDesignerのObjectを継承する形で定義されているデータ 型をFlowDesignerオブジェクト型と呼ぶものとする.TrueObject,FalseObject,nilObjectもそれぞれ,
true,false, nilに対応するObjectとして定義されている.FlowDesignerオブジェクト型で最もよく使われ るものは,Vector,Matrixであろう.これらは,C++のSTLを継承したFlowDesignerオブジェクト型であ り,基本的にはC++のSTLの対応するデータ型の仕様に準ずる.
ObjectRefは,オブジェクト型へのスマートポインタとして実現されているFlowDesigner固有のデータ型
であり,Vector,Matrix,Mapの要素として用いられることが多い.
Mapも,C++のSTLを継承しているがFlowDesignerではなく,HARK 固有のデータ型である.Sourceは,
音源情報型として定義されるHARK 固有のデータ型である.
ノードのターミナルの型 は,FlowDesigner上で型を知りたいノードのターミナルにカーソルをフォーカスす ると,FlowDesignerの最下部に表示される.図4.1に,AudioStreamFromMicノードのAUDIOターミナルに マウスをフォーカスした例を示す.FlowDesignerの最下部にAUDIO (Matrix<float>Windowed multi-channel sound data. A row index is a channel, and a column index is time.が表示され,AUDIOポートがMatrix<float>を サポートしていること,窓掛けされた音声波形を出力すること,行列の行がチャネルを表し,列が時刻を表し
ていることがわかる.一般的に,ノードのターミナル同士は,データ型が同じである,もしくは受け側のター
図4.1:メッセージバーの表示例
ミナルが,送り側のターミナルのデータ型を包含していれば,正常に接続することができ,黒矢印で表示され る.この条件を満たさないターミナル同士を接続した場合は,警告の意味で赤矢印で表示される.
以降の節では,上述について基本型,FlowDesignerオブジェクト型,FlowDesigner固有型HARK 固有型に 分けて説明を行う.
4.1 基本型
int,float,double,bool,char,string,complex(complex<float>,complex<double>)は,前述の ようにC++データ型を引き継いだ基本型である.HARK では,番号など,必ず整数であると分かっているもの (音源数やFFTの窓長など)はintが,それ以外の値(角度など)にはすべてfloatが用いられる.フラグなど,
真偽の2値のみが必要な場合はboolが用いられる.ファイル名などの文字列が必要な場合はstringが使われ る.HARK はスペクトル単位の処理や特定長の時間ブロック(フレーム)ごとの処理を行うことが多いため,
ノードのターミナルのデータ型としては,直接基本型を用いる場合は少なく,MatrixやVector,Mapの要素と して用いることが普通である.complex<float> も,単独で用いることは少なく,スペクトルを表現するため に,Vector,Matrixの要素として用いることが多い.倍精度の浮動小数点(double型)は,FlowDesignerと してはサポートしているが,HARK では,Sourceを除いて利用していない.
この型に変換するノード: Conversion カテゴリのTo* ノードが各型に変換する.intはToInt,floatは ToFloat,boolはToBool,stringはToStringを用いる.
4.2 FlowDesigner オブジェクト型
Int,Float,String,Complexはそれぞれ,int,float,string,complexのObject型である.TrueObject, FalseObjectはbool型のtrue,falseに対応するObjectであり,nilObjectは,nilに対応するObjectで ある.これらの説明は省略する.C++の標準テンプレートライブラリ(STL)を継承する形でFlowDesigner内
でObject型として再定義されているものとして,Vector,Matrixが挙げられる.これらに関して以下で説明
する.
4.2.1 Vector
データの配列を格納する型を表す.Vectorには何が入っていてもよく代表的にはObjectRefを要素にもつ Vector< Obj > ,値(int,float)を要素にもつVector< int > ,Vector< float > などが使われる.
複数の値を組にして用いるので,ConstantLocalizationでの角度の組の指定や,LocalizeMUSICの出力であ る定位結果の組を表すのに用いられる.
以下に,Vector型の定義を示す.BaseVector は,FlowDesigner用のメソッドを実装した型である.下に示 すように,Vector型はSTLのvector 型を継承している.
template<class T> class Vector : public BaseVector, public std::vector<T>
Conversion カテゴリにあるToVect ノードは,int,floatなどの入力をとり,入力された値を1つだけ要
素に持つVectorを出力する.
また,ノードのパラメータとしてVectorを使いたい時は,パラメータのタイプをObjectにし,以下のよ うにテキストで入力することができる.
例えば,二つの要素3,4を持つint型のVectorをパラメータに入力したい時は,図4.2に示すように文字 列を入力すればよい.ただし,文字列は初めの文字<の次に,スペースを開けずにVectorを書く必要がある などの注意が必要である.
図4.2: Vectorの入力例
4.2.2 Matrix
行列を表す.代表的な型はMatrix<complex<float> >型とMatrix<float>型である.それぞれ,複素数 を要素に持つ行列と,実数を要素に持つ行列である.
Matrixをノード間通信に用いるノードとしては,MultiFFT(周波数解析),LocalizeMUSIC(音源定位)など
が挙げられるなお,HARK を用いた典型的な音源定位・追従・分離と音声認識の機能を有するロボット聴覚シ ステムでは,音源追従(SourceTracker)で,音源にIDが付与されるので,それ以前の処理では,ノード間通信
にMatrixが用いられ,それ以降の処理では,Mapが用いられることが多い.
4.3 FlowDesigner 固有型
FlowDesigner固有型には,any,ObjectRef,Object,subnet paramが挙げられる.
4.3.1 any
anyはあらゆるデータ型の総称となっており,ノードのターミナルがany型である場合は,他のノードの ターミナルがどんな型であっても警告なしに(黒線で)接続することができる.ただし,実際に通信が可能か どうかはノード内部の実装に左右されてしまうため,自ら実装を行う際には極力利用しないことが望ましい.
HARK では,MultiFFT,DataLogger,SaveRawPCM,MatrixToMapといった汎用的に用いるノードに使用を 限定している.
4.3.2 ObjectRef
FlowDesigner内で定義されているObject型を継承するデータ型への参照を表すデータ型である.
具体的には,Object型へのスマートポインタとして定義されている.FlowDesignerオブジェクト型,
FlowDe-signer固有型HARK 固有型はいずれもObjectを継承したデータ型であるので,これらのデータ型はどれで
も参照することができる.基本データ型も,前述のように,ObjectRef に代入しようとした際に最終的に NetCType<T>で変換され,Objectのサブクラスとなるため,利用可能である.
4.3.3 Object
主にノードのプロパティで用いられるデータ型である.HARK では,ChannelSelectorなどで用いられてい る.基本的には,事前に用意されているint,float,string,bool,subnet param以外のデータ型をプロパ ティとして設定する際に用いるデータ型である.4.3.2節で述べたように,基本データ型を含めてObject型と して利用可能なため,原理的には,すべてのデータ型をObjectとして指定できることになるが,実際に入力 できるのはテキストでの入出力が実装されているデータ型に限られる.Vectorや,Matrixも指定できるよう に実装されているが,Mapはテキスト入出力を実装していないため,Objectとして入力することは現時点では できない.
参考までに,以下に,入力できる例,できない例を挙げる.
OK <Vector<float> 0.0 1.0> 一般的なVectorの入力法
OK Complex<float(0,0)> complexもComplexとすれば入力できる
NG <Vector<complex<float> > (0.0, 1.0)> complexの入力は非サポート OK <Vector<ObjectRef> <Complex<float>(0.0, 1.0)> > Complexとして入力すれば問題ない OK <Int1> intもIntとして入力できる
4.3.4 subnet param
ノードのプロパティで用いられるデータ型である.subnetの複数のノードに同じパラメータをプロパティと して設定する際に,subnet paramを指定して,共通のラベルを記述すれば,MAIN(subnet)上で,このラベル の値を書き換えることによって,該当の箇所すべての値を修正することができる.
例えば,Iteratorネットワークを作成して(名前をLOOP0とする)その上にLocalizeMUSIC,GHDSSといった サンプリング周波数を指定する必要のあるノードを配置した際に,これらのプロパティであるSAMPLING RATE
の型をsubnet paramとし,“SAMPLINGRATE”というラベルを指定しておけば,MAIN(subnet)上に仮想ネッ