以下の音響信号処理結果をソケット通信で送信するノードである.
音響信号
STFT後の周波数スペクトル
音源定位結果のソース情報
音響特徴量
ミッシングフィーチャーマスク
無し.
どんなときに使うのか
上記のデータの中で必要な情報を TCP/IP 通信を用いて,HARK 外のシステムに送信するために用いる.
典型的な接続例
図6.10の例では全ての入力端子に接続している. 送信したいデータに合わせて入力端子を開放することも可能である. 入力端子の接続と送信されるデータの関係については「ノードの詳細」を参照.
パラメータ名 |
型 |
デフォルト値 |
単位 |
説明 |
HOST |
localhost |
データの送信先サーバのホスト名/IPアドレス |
||
PORT |
5530 |
ネットワーク送出用ポート番号 |
||
ADVANCE |
160 |
[pt] |
フレームのシフト長 |
|
BUFFER_SIZE |
512 |
ソケット通信のために確保する float 配列のサイズ |
||
FRAMES_PER_SEND |
1 |
[frm] |
ソケット通信を何フレームに一回行うか |
|
DEBUG_PRINT |
false |
デバッグ情報出力のON/OFF |
||
SOCKET_ENABLE |
true |
ソケット出力をするかどうかを決めるフラグ |
入力
: Matrix<float> 型.音響信号(チャンネル数 $\times $ 各チャンネルのSTFTの窓長サイズの音響信号)
: Matrix<complex<float> > 型.周波数スペクトル(チャンネル数 $\times $ 各チャンネルのスペクトル)
: Vector<ObjectRef> 型.音源数個の音源定位結果のソース情報
: Map<int, ObjectRef> 型.音源 ID と音響信号の Vector<float> 型のデータのペア.
: Map<int, ObjectRef> 型.音源 ID と周波数スペクトルの Vector<complex<float> > 型のデータのペア.
: Map<int, ObjectRef> 型.音源 ID と音響特徴量の Vector<float> 型のデータのペア.
: Map<int, ObjectRef> 型.音源 ID とマスクベクトルの Vector<float> 型のデータのペア.
出力
: ObjectRef 型.入力と同じものが出力される.
パラメータ
: string 型.データ送信先ホストの IP アドレス.SOCKET_ENABLED が falseの場合は無効.
: int 型.ソケット番号. SOCKET_ENABLED が falseの場合は無効.
: int 型.フレームのシフト長.前段処理と同じ値にする.
: int 型.ソケット通信のために確保するバッファサイズ.
: int 型.ソケット通信を何フレームに一回行うかを指定する.デフォルトは1.
: bool 型.デバッグ標準出力のON/OFF
: bool 型.trueでデータをソケットに転送し,falseで転送しない.
パラメータの説明
HOST は,データを送信する外部プログラムが動作するホストのホスト名,または IP アドレスを指定する.
PORT は,データを送信するネットワークポート番号を指定する.
ADVANCE はフレームのシフト長であり,前段処理の設定値と同じにする.
BUFFER_SIZE はソケット通信のために確保するバッファサイズ. BUFFER_SIZE * 1024 の float 型の配列が初期化時に確保される.送信するデータより大きく確保する.
FRAMES_PER_SEND はソケット通信を何フレームに一回行うかを指定する. 通常は1で問題ないが,通信量を削減したい時に使用できる.
DEBUG_PRINT はデバッグ標準出力の表示の可否である. 送信データの一部と同じ情報が出力される. 表示される内容については表6.13の 「 Debug 」を参照.
SOCKET_ENABLED が falseのときは,データを外部システムに送信しない. これは,外部プログラムを動かさずに HARK のネットワーク動作チェックを行うために使用する.
データ送信の詳細
(B-1) データ送信用構造体
データの送信は,各フレーム毎に幾つかに分けられて行われる. データ送信のために定義されている構造体を下記にリストアップする.
HD_Header
説明 : 送信データの先頭で送信される基本情報が入ったヘッダ
データサイズ : 3 * sizeof(int)
変数名 |
型 |
説明 |
type |
int |
送信データの構造を示すビットフラグ.各ビットと送信データとの関係については表6.8参照. |
advance |
int |
フレームのシフト長 |
count |
int |
HARKのフレーム番号 |
桁数 |
関係入力端子 |
送信データ |
1桁目 |
MIC_WAVE |
音響信号 |
2桁目 |
MIC_FFT |
周波数スペクトル |
3桁目 |
SRC_INFO |
音源定位結果ソース情報 |
4桁目 |
SRC_INFO, SRC_WAVE |
音源定位結果ソース情報 + 音源 ID 毎の音響信号 |
5桁目 |
SRC_INFO, SRC_FFT |
音源定位結果ソース情報 + 音源 ID 毎の周波数スペクトル |
6桁目 |
SRC_INFO, SRC_FEATURE |
音源定位結果ソース情報 + 音源 ID 毎の音響特徴量 |
7桁目 |
SRC_INFO, SRC_RELIABILITY |
音源定位結果ソース情報 + 音源 ID 毎のミッシングフィーチャーマスク |
HarkDataStreamSender は入力端子の開放の可否によって送信されるデータが異なり, データ受信側では type によって,受信データを解釈できる. 以下に例を挙げる. 送信されるデータの更なる詳細については(B-2)に示す.
MIC_FFT 入力端子のみが接続されている場合,type は2進数で表すと 0000010 となる. また,送信されるデータはマイク毎の周波数スペクトルのみとなる.
MIC_WAVE, SRC_INFO, SRC_FEATURE の3つの入力端子が接続されている場合, type は2進数で表すと 0100101 となる. 送信されるデータはマイク毎の音響信号,音源定位結果のソース情報,音源 ID 毎の音響特徴量となる.
SRC_WAVE, SRC_FFT, SRC_FEATURE, SRC_RELIABILITY の4つの入力端子については, 音源 ID ごとの情報になるため,SRC_INFO の情報が必須である. もし,SRC_INFO を接続せずに,上記4つの入力端子を接続したとしても,何も送信されない. その場合,type は2進数で 0000000 となる.
HDH_MicData
説明 : 2次元配列を送信するための,サイズに関する配列の構造情報
データサイズ : 3 * sizeof(int)
変数名 |
型 |
説明 |
nch |
int |
マイクチャネル数(送信する2次元配列の行数) |
length |
int |
データ長(送信する2次元配列の列数) |
data_bytes |
int |
送信データバイト数. float 型の行列の場合は nch * length * sizeof(float) となる. |
HDH_SrcInfo
説明 : 音源定位結果のソース情報
データサイズ : 1 * sizeof(int) + 4 * sizeof(float)
変数名 |
型 |
説明 |
src_id |
int |
音源 ID |
x[3] |
float |
音源3次元位置 |
power |
float |
LocalizeMUSIC で計算される MUSIC スペクトルのパワー |
HDH_SrcData
説明 : 1次元配列を送信するための,サイズに関する配列の構造情報
データサイズ : 2 * sizeof(int)
変数名 |
型 |
説明 |
length |
int |
データ長(送信する1次元配列の要素数) |
data_bytes |
int |
送信データバイト数. float 型のベクトルの場合は length * sizeof(float) となる. |
(B-2) 送信データ
送信データ詳細 |
入力端子と送信データ |
||||||||
型 |
サイズ |
MIC_WAVE |
MIC_FFT |
SRC_INFO |
SRC_WAVE |
SRC_FFT |
SRC_FEATURE |
SRC_RELIABILITY |
|
(a) |
HD_Header |
sizeof(HD_Header) |
$\circ $ |
$\circ $ |
$\circ $ |
$\circ $ |
$\circ $ |
$\circ $ |
$\circ $ |
(b) |
HDH_MicData |
sizeof(HDH_MicData) |
$\circ $ |
||||||
(c) |
float[] |
HDH_MicData.data_bytes |
$\circ $ |
||||||
(d) |
HDH_MicData |
sizeof(HDH_MicData) |
$\circ $ |
||||||
(e) |
float[] |
HDH_MicData.data_bytes |
$\circ $ |
||||||
(f) |
float[] |
HDH_MicData.data_bytes |
$\circ $ |
||||||
(g) |
int |
1 * sizeof(int) |
$\circ $ |
$\circ ^*$ |
$\circ ^*$ |
$\circ ^*$ |
$\circ ^*$ |
||
(h) |
HDH_SrcInfo |
sizeof(HDH_SrcInfo) |
$\circ $ |
$\circ ^*$ |
$\circ ^*$ |
$\circ ^*$ |
$\circ ^*$ |
||
(i) |
HDH_SrcData |
sizeof(HDH_SrcData) |
$\circ ^*$ |
||||||
(j) |
short int[] |
HDH_SrcData.data_bytes |
$\circ ^*$ |
||||||
(k) |
HDH_SrcData |
sizeof(HD_SrcData) |
$\circ ^*$ |
||||||
(l) |
float[] |
HDH_SrcData.data_bytes |
$\circ ^*$ |
||||||
(m) |
float[] |
HDH_SrcData.data_bytes |
$\circ ^*$ |
||||||
(n) |
HDH_SrcData |
sizeof(HD_SrcData) |
$\circ ^*$ |
||||||
(o) |
float[] |
HDH_SrcData.data_bytes |
$\circ ^*$ |
||||||
(p) |
HDH_SrcData |
sizeof(HD_SrcData) |
$\circ ^*$ |
||||||
(q) |
float[] |
HDH_SrcData.data_bytes |
$\circ ^*$ |
説明 |
Debug |
|
(a) |
送信データヘッダ.表6.7参照. |
$\circ $ |
(b) |
音響信号の構造(マイク数,フレーム長,送信バイト数)を表す構造体.表6.9参照. |
$\circ $ |
(c) |
音響信号(マイク数 $\times $ フレーム長 の float 型の行列) |
|
(d) |
周波数スペクトルの構造(マイク数,周波数ビン数,送信バイト数)を表す構造体.表6.9参照. |
$\circ $ |
(e) |
周波数スペクトルの実部(マイク数 $\times $ 周波数ビン数 の float 型の行列) |
|
(f) |
周波数スペクトルの虚部(マイク数 $\times $ 周波数ビン数 の float 型の行列) |
|
(g) |
検出された音源個数 |
$\circ $ |
(h) |
音源定位結果のソース.表6.10参照. |
$\circ $ |
(i) |
音源 ID 毎の音響信号の構造(フレーム長,送信バイト数)を表す構造体.表6.11参照. |
$\circ $ |
(j) |
音源 ID 毎の音響信号(フレーム長 の float 型の一次元配列) |
|
(k) |
音源 ID 毎の周波数スペクトルの構造(周波数ビン数,送信バイト数)を表す構造体.表6.11参照. |
$\circ $ |
(l) |
音源 ID 毎の周波数スペクトルの実部(周波数ビン数 の float 型の一次元配列) |
|
(m) |
音源 ID 毎の周波数スペクトルの虚部(周波数ビン数 の float 型の一次元配列) |
|
(n) |
音源 ID 毎の音響特徴量の構造(特徴量次元数,送信バイト数)を表す構造体.表6.11参照. |
$\circ $ |
(o) |
音源 ID 毎の音響特徴量(特徴量次元数 の float 型の一次元配列) |
|
(p) |
音源 ID 毎の MFM の構造(特徴量次元数,送信バイト数)を表す構造体.表6.11参照. |
$\circ $ |
(q) |
音源 ID 毎の MFM (特徴量次元数 の float 型の一次元配列) |
送信データは各フレーム毎に,表6.12, 表6.13の(a)-(q)のように,分割されて行われる. 表6.12に,送信データ(a)-(q)と,接続された入力端子の関係を, 表6.13に,送信データの説明を示す.
(B-3) 送信アルゴリズム
HARKのネットワークファイルを実行する際に繰り返し演算される部分のアルゴリズムを以下に示す.
calculate{ Send (a) IF MIC_WAVE is connected Send (b) Send (c) ENDIF IF MIC_FFT is connected Send (d) Send (e) Send (f) ENDIF IF SRC_INFO is connected Send (g) (Let the number of sounds ’src_num’.) FOR i = 1 to src_num (This is a sound ID based routine.) Send (h) IF SRC_WAVE is connected Send (i) Send (j) ENDIF IF SRC_FFT is connected Send (k) Send (l) Send (m) ENDIF IF SRC_FEATURE is connected Send (n) Send (o) ENDIF IF SRC_RELIABILITY is connected Send (p) Send (q) ENDIF ENDFOR ENDIF }
ここで,コード内の(a)-(q)が, 表6.12と 表6.13の(a)-(q)に対応している.