6.1.6 HarkDataStreamSender

6.1.6.1 ノードの概要

以下の音響信号処理結果をソケット通信で送信するノードである.

6.1.6.2 必要なファイル

無し.

6.1.6.3 使用方法

どんなときに使うのか

上記のデータの中で必要な情報を TCP/IP 通信を用いて,HARK 外のシステムに送信するために用いる.

典型的な接続例

6.13の例では全ての入力端子に接続している. 送信したいデータに合わせて入力端子を開放することも可能である. 入力端子の接続と送信されるデータの関係については「ノードの詳細」を参照.

\includegraphics[width=150mm]{fig/modules/HarkDataStreamSender}
Figure 6.13: HarkDataStreamSender の接続例

6.1.6.4 ノードの入出力とプロパティ

Table 6.8: HarkDataStreamSender のパラメータ表

パラメータ名

デフォルト値

単位

説明

HOST

string 

localhost

 

データの送信先サーバのホスト名/IPアドレス

PORT

int 

5530

 

ネットワーク送出用ポート番号

ADVANCE

int 

160

[pt]

フレームのシフト長

BUFFER_SIZE

int 

512

 

ソケット通信のために確保する float 配列のサイズ

FRAMES_PER_SEND

int 

1

[frm]

ソケット通信を何フレームに一回行うか

TIMESTAMP_TYPE

string 

GETTIMEOGDAY

 

送信されるタイムスタンプ

SAMPLING_RATE

int 

16000

[Hz]

サンプリング周波数

DEBUG_PRINT

bool 

false

 

デバッグ情報出力のON/OFF

SOCKET_ENABLE

bool 

true

 

ソケット出力をするかどうかを決めるフラグ

入力

MIC_WAVE

: Matrix<float> 型.音響信号(チャンネル数 $\times $ 各チャンネルのSTFTの窓長サイズの音響信号)

MIC_FFT

: Matrix<complex<float> > 型.周波数スペクトル(チャンネル数 $\times $ 各チャンネルのスペクトル)

SRC_INFO

: Vector<ObjectRef> 型.音源数個の音源定位結果のソース情報

SRC_WAVE

: Map<int, ObjectRef> 型.音源 ID と音響信号の Vector<float> 型のデータのペア.

SRC_FFT

: Map<int, ObjectRef> 型.音源 ID と周波数スペクトルの Vector<complex<float> > 型のデータのペア.

SRC_FEATURE

: Map<int, ObjectRef> 型.音源 ID と音響特徴量の Vector<float> 型のデータのペア.

SRC_RELIABILITY

: Map<int, ObjectRef> 型.音源 ID とマスクベクトルの Vector<float> 型のデータのペア.

TEXT

: 型.任意の文字列.

MATRIX

: Matrix<float> もしくは Matrix<complex<float> > 型.任意の行列.

VECTOR

: Vector<float> もしくは Vector<complex<float> > 型.任意のベクトル.

TIMESTAMP

: TimeStamp 型.送信される時刻.

出力

OUTPUT

: ObjectRef 型.入力と同じものが出力される.

パラメータ

HOST

: string 型. データ送信先ホストの IP アドレス.SOCKET_ENABLED が falseの場合は無効.

PORT

: int 型. ソケット番号. SOCKET_ENABLED が falseの場合は無効.

ADVANCE

: int 型. フレームのシフト長.前段処理と同じ値にする.

BUFFER_SIZE

: int 型. ソケット通信のために確保するバッファサイズ.

FRAMES_PER_SEND

: int 型. ソケット通信を何フレームに一回行うかを指定する.デフォルトは1.

TIMESTAMP_TYPE

: string 型. 送信データにスタンプされる時刻の設定. TIMESTAMP_TYPE=GETTIMEOFDAY なら gettimeofday で得た時刻, TIMESTAMP_TYPE=CONSTANT_INCREMENT なら SAMPLING_RATE から計算されるフレーム時間を毎フレーム加算した時刻とする.

SAMPLING_RATE

: int 型. サンプリング周波数.デフォルトは16000.TIMESTAMP_TYPE=CONSTANT_INCREMENT の時のみ有効.

DEBUG_PRINT

: bool 型. デバッグ標準出力のON/OFF

SOCKET_ENABLE

: bool 型. trueでデータをソケットに転送し,falseで転送しない.

6.1.6.5 ノードの詳細

HOST は,データを送信する外部プログラムが動作するホストのホスト名,または IP アドレスを指定する.

PORT は,データを送信するネットワークポート番号を指定する.

ADVANCE はフレームのシフト長であり,前段処理の設定値と同じにする.

BUFFER_SIZE はソケット通信のために確保するバッファサイズ. BUFFER_SIZE * 1024 の float 型の配列が初期化時に確保される.送信するデータより大きく確保する.

FRAMES_PER_SEND はソケット通信を何フレームに一回行うかを指定する. 通常は1で問題ないが,通信量を削減したい時に使用できる.

TIMESTAMP_TYPE は送信データにスタンプされる時刻を設定する.

SAMPLING_RATE はサンプリング周波数を指定する.

DEBUG_PRINT はデバッグ標準出力の表示の可否である. 送信データの一部と同じ情報が出力される. 表示される内容については表6.15の 「 Debug 」を参照.

SOCKET_ENABLED が falseのときは,データを外部システムに送信しない. これは,外部プログラムを動かさずに HARK のネットワーク動作チェックを行うために使用する.

(B-1) データ送信用構造体

データの送信は,各フレーム毎に幾つかに分けられて行われる. データ送信のために定義されている構造体を下記にリストアップする.

Table 6.9: HD_Header のメンバ

変数名

説明

type

int

送信データの構造を示すビットフラグ.各ビットと送信データとの関係については表6.10参照.

advance

int

フレームのシフト長

count

int

HARKのフレーム番号

tv_sec

int64

タイムスタンプ(秒)

tv_usec

int64

タイムスタンプ(マイクロ秒)

Table 6.10: HD_Header の type の各ビットと送信データ

桁数

関係入力端子

送信データ

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 毎のミッシングフィーチャーマスク

8桁目

TEXT

任意の文字列

9桁目

MATRIX

任意の行列

10桁目

VECTOR

任意のベクトル

HarkDataStreamSender は入力端子の開放の可否によって送信されるデータが異なり, データ受信側では type によって,受信データを解釈できる. 以下に例を挙げる. 送信されるデータの更なる詳細については(B-2)に示す.

Table 6.11: HDH_MicData のメンバ

変数名

説明

nch

int

マイクチャネル数(送信する2次元配列の行数)

length

int

データ長(送信する2次元配列の列数)

data_bytes

int

送信データバイト数. float 型の行列の場合は nch * length * sizeof(float) となる.

Table 6.12: HDH_SrcInfo のメンバ

変数名

説明

src_id

int

音源 ID

x[3]

float

音源3次元位置

power

float

LocalizeMUSIC で計算される MUSIC スペクトルのパワー

Table 6.13: HDH_SrcData のメンバ

変数名

説明

length

int

データ長(送信する1次元配列の要素数)

data_bytes

int

送信データバイト数. float 型のベクトルの場合は length * sizeof(float) となる.

(B-2) 送信データ

Table 6.14: 送信順のデータリストと接続入力端子($\circ $記号の箇所が送信されるデータ,$\circ ^*$は,SRC_INFO端子が接続されていない場合は送信されないデータ)

送信データ詳細

入力端子と送信データ

 

サイズ

MIC_WAVE

MIC_FFT

SRC_INFO

SRC_WAVE

SRC_FFT

SRC_FEATURE

SRC_RELIABILITY

TEXT

MATRIX

VECTOR

(a)

HD_Header

sizeof(HD_Header)

$\circ $

$\circ $

$\circ $

$\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(HDH_SrcData)

       

$\circ ^*$

         

(l)

float[]

HDH_SrcData.data_bytes

       

$\circ ^*$

         

(m)

float[]

HDH_SrcData.data_bytes

       

$\circ ^*$

         

(n)

HDH_SrcData

sizeof(HDH_SrcData)

         

$\circ ^*$

       

(o)

float[]

HDH_SrcData.data_bytes

         

$\circ ^*$

       

(p)

HDH_SrcData

sizeof(HDH_SrcData)

           

$\circ ^*$

     

(q)

float[]

HDH_SrcData.data_bytes

           

$\circ ^*$

     

(r)

HDH_SrcData

sizeof(HDH_SrcData)

             

$\circ ^*$

   

(s)

char[]

HDH_SrcData.data_bytes

             

$\circ ^*$

   

(t)

HDH_MicData

sizeof(HDH_MicData)

               

$\circ ^*$

 

(u)

float[]

HDH_MicData.data_bytes

               

$\circ ^*$

 

(v)

HDH_SrcData

sizeof(HDH_SrcData)

                 

$\circ ^*$

(w)

float[]

HDH_SrcData.data_bytes

                 

$\circ ^*$

Table 6.15: 送信データ詳細
 

説明

Debug

(a)

送信データヘッダ.表6.9参照.

$\circ $

(b)

音響信号の構造(マイク数,フレーム長,送信バイト数)を表す構造体.表6.11参照.

$\circ $

(c)

音響信号(マイク数 $\times $ フレーム長 の float 型の行列)

 

(d)

周波数スペクトルの構造(マイク数,周波数ビン数,送信バイト数)を表す構造体.表6.11参照.

$\circ $

(e)

周波数スペクトルの実部(マイク数 $\times $ 周波数ビン数 の float 型の行列)

 

(f)

周波数スペクトルの虚部(マイク数 $\times $ 周波数ビン数 の float 型の行列)

 

(g)

検出された音源個数

$\circ $

(h)

音源定位結果のソース.表6.12参照.

$\circ $

(i)

音源 ID 毎の音響信号の構造(アドバンス長,送信バイト数)を表す構造体.表6.13参照.

$\circ $

(j)

音源 ID 毎の音響信号(アドバンス長 の short int 型の一次元配列)

 

(k)

音源 ID 毎の周波数スペクトルの構造(周波数ビン数,送信バイト数)を表す構造体.表6.13参照.

$\circ $

(l)

音源 ID 毎の周波数スペクトルの実部(周波数ビン数 の float 型の一次元配列)

 

(m)

音源 ID 毎の周波数スペクトルの虚部(周波数ビン数 の float 型の一次元配列)

 

(n)

音源 ID 毎の音響特徴量の構造(特徴量次元数,送信バイト数)を表す構造体.表6.13参照.

$\circ $

(o)

音源 ID 毎の音響特徴量(特徴量次元数 の float 型の一次元配列)

 

(p)

音源 ID 毎の MFM の構造(特徴量次元数,送信バイト数)を表す構造体.表6.13参照.

$\circ $

(q)

音源 ID 毎の MFM (特徴量次元数 の float 型の一次元配列)

 

(r)

文字列情報(文字数,送信バイト数)を表す構造体.表6.13参照.

$\circ $

(s)

文字列(文字数 の char 型の一次元配列)

 

(t)

行列の構造(行数,列数,送信バイト数)を表す構造体.表6.11参照.

$\circ $

(u)

行列データ (float 型の行列)

 

(v)

ベクトルの構造(ベクトル次元数,送信バイト数)を表す構造体.表6.13参照.

$\circ $

(w)

ベクトルデータ(float 型の一次元配列)

 

送信データは各フレーム毎に,表6.14, 表6.15の(a)-(w)のように,分割されて行われる. 表6.14に,送信データ(a)-(w)と,接続された入力端子の関係を, 表6.15に,送信データの説明を示す.

(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

    IF TEXT is connected
        Send (r)
        Send (s)
    ENDIF

    IF MATRIX is connected
        Send (t)
        Send (u)
    ENDIF

    IF VECTOR is connected
        Send (v)
        Send (w)
    ENDIF

 }

ここで,コード内の(a)-(w)が, 表6.14と 表6.15の(a)-(w)に対応している.