HARKで出力したcsvファイルと現実の時刻を同期させたい

HARK FORUM HARKで出力したcsvファイルと現実の時刻を同期させたい

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #2785
    牛太郎
    Participant

      いつもお世話になっております.
      私はHARKを用いて, 2つのマイクロホンアレイの音源定位結果から音源(牛)の二次元座標を特定したいと思っています. また, 「2つのマイクロホンアレイから出力された2つのcsvファイル」と, 「音源と2つのマイクロホンアレイが映るようにカメラで真上から撮った動画」の3つのデータから, どの牛が鳴いているのかを特定したいと思っています.

      質問1
      この3つのデータの時刻を同期させるために, HARKのネットワークの実行が開始された時刻(ネットワークの実行によりcsvファイルが作成された時刻)が必要だと考えましたが, この時刻を取得する方法はありますか?

      質問2
      質問1の開始時刻が取得できた場合, csvファイル中のフレーム番号と現実の時刻を同期させるためにはどうしたらよいでしょうか? サンプリング周波数は16000[Hz], フレーム長は512, シフト長は160です.

      csvファイルを出力するネットワークとその実行結果の画像を下に添付します.

      • This topic was modified 4 months ago by 牛太郎.
      • This topic was modified 4 months ago by 牛太郎.
      • This topic was modified 4 months ago by 牛太郎.
      #2792

      お問い合わせありがとうございます。

      > 2つのマイクロホンアレイの音源定位結果から音源(牛)の二次元座標を特定したいと思っています. 

      目的は、三角測量のようにして対象音源座標の特定をされたいのであると理解しました。

      > 「2つのマイクロホンアレイから出力された2つのcsvファイル」と, 「音源と2つのマイクロホンアレイが映るように真上から撮った動画」の3つのデータから, どの牛が鳴いているのかを特定したいと思っています.

      状況として、動画データとの同期が必要な事から2ファイルの同期だけでなく実時刻が必要であると理解しました。

      認識に誤りがございましたらご指摘ください。

      > 質問1
      > この3つのデータの時刻を同期させるために, HARKのネットワークの実行が開始された時刻(ネットワークの実行によりcsvファイルが作成された時刻)が必要だと考えましたが, この時刻を取得する方法はありますか?

      はい、ございます。幾つか手段があり、メリット・デメリットがございますので下記のいずれかからご選択ください。

      • 1. 開始時刻を取得する方法 (中でも最も簡易的に取得する方法をご提案させて頂きます)
        1-1. AudioStreamFromMic ノードの AUDIO 出力を SaveWavePCM2 ノードの INPUT 入力に接続し、ファイル名の時刻を参照します。(SaveWavePCM2 ノードの場合、ファイル名に作成時刻が入るためです。)
        1-2. AudioStreamFromMic ノードの AUDIO 出力を SaveWavePCM ノードの INPUT 入力に接続し、ファイルの作成時刻(create time)を参照します。
        デメリット:入力された音響信号の保存が不要な場合は無駄に容量を消費することになります。ファイル作成が開始直後の処理であるとはいえ、僅かに遅れがありますので厳密な開始時刻ではありません。ただし、次の影響の方が大きいと考えられます。長期間連続で稼働させる場合にはクロックずれ(後述)による影響を考慮する必要があります。
        メリット:プログラムなどを組む必要もなく、時刻を得る手段としては最も簡単です。
      • 2. フレーム単位の時刻を取得する方法
        2-1. AudioStreamFromMic ノードに TIMESTAMP という名称で出力を追加し、 HarkDataStreamSender ノードの TIMESTAMP 入力に接続します。 HARK の実行後に HarkDataStreamSender ノードの PORT パラメータで指定されたポート(listen port)に接続すると TCP/IP 経由で情報が得られます。
        補足情報: SourceTracker ノードの OUTPUT 出力を HarkDataStreamSender ノードの SRC_INFO 入力に同時に接続すると、フレームの時刻と定位結果を同時に送ることも出来ます。
        HarkDataStreamSender ノードについての詳細は、 https://www.hark.jp/document/hark-document-ja/subsec-HarkDataStreamSender.html をご参照ください。
        デメリット:TCP/IP の通信が出来るクライアントが必要となります。通信がテキストではなくバイナリで行われるため、 telnet ではなく Python などの言語でプログラミングが必要となります。セキュリティソフトのファイアーウィールで通信がブロックされた場合は、HARK のアプリまたは listen port の通信を許可するなどの手間がかかります。
        メリット:リアルタイムに送られてくるデータを処理するプログラムを書けば、2つの定位結果を受け取りながら結果を計算して出力する事ができます。 TCP/IP 通信でデータを送受するため、ネットワーク上の別の PC に送って処理する事ができます。
      • X. 時刻を使用しない (ミリ秒精度が必要ない場合はこのような手段もありだと考えます)
        X-1. 2台のマイクロホンアレイにおける定位結果を HarkDataStreamSender ノードで TCP/IP 経由で送信し、受信側のプログラムでは最新の受信結果のみをバッファしておきます。2台のマイクロホンアレイの最新の結果を使用して定期的に処理します。処理した時刻と結果を保存します。
        デメリット:基本的に「2.」のデメリットと同様です。違いですが、リアルタイムにオンライン実行を行うデモや運用には向いていますが、再現実験のようにオフラインで同じ入力を元に走らせることが出来ません。処理の再現実験などを行う場合は計算に使用した座標データを自身のプログラム側で保存しなければならなりません。
        メリット:基本的に「2.」のメリットと同様です。違いですが、2台のマイクロホンアレイ間のクロックずれ(後述)を気にせず処理が出来ます。長時間連続運用する場合には必要なデータ以外を保存しなくても良いため空き容量を気にする必要が無く向いています。

      他にもいくつか手段は御座いますが方向性としては上記のいずれかの系統となります。用途に合わせてご選択ください。

      > 質問2
      > 質問1の開始時刻が取得できた場合, csvファイル中のフレーム番号と現実の時刻を同期させるためにはどうしたらよいでしょうか? サンプリング周波数は16000[Hz], フレーム長は512, シフト長は160です.

      サンプリングレートが 16000 [Hz] であるということは 16000 [samples/sec] ですので、また、シフト長 160 [samples] づつフレームが進むということになりますので、 1 [frame] あたり 10 [ms] に相当します。
      HARK においてはフレームを 0 からカウントしますので 99 フレーム目の終端、または 100 フレーム目の開始の時刻が 100 * 10 [ms] = 1 [sec] 後となります。
      ですので基本的には(*注1)2つのCSVファイルにおいて、フレーム番号の差が常に一定となります。

      *注1:マイクロホンアレイのA/D変換を行っている回路やHARKを動作させているPCなどに使用される水晶振動子(腕時計などでクォーツと呼ばれる素子)は ±30ppm や ±50ppm などのように単位が ppm (100万分の1) と非常に精度が高いものですが、長期間継続的に使用する場合には少しづつ誤差が累積します。つまり、2台のマイクロホンアレイ間でのクロックずれがフレームカウントに影響します。
      例えば ±50ppm とはどういう状況かですが、 16000 [Hz] * 1.00005 = 16000.8 [Hz] ~ 16000 [Hz] * 0.99995 = 15999.2 [Hz] であるため、最大と最小の差は 1.6 [Hz] あります。2台のマイクロホンアレイ間で最大と最小の誤差を持つ個体であった場合、 100 [frames] = 1 [sec] 後には 160 [samples] = 1 [frame] = 10 [ms] 分のずれが発生します。少ないと言いつつも数日継続的に動作させる場合は結構な差となります。腕時計などでも電波時計のように定期的に時刻調整を行っているもの以外では、数か月使用していると時刻を分単位で合わせる必要があるのはこのためです。
      長期的に連続稼働させる場合は、開始時刻だけではなくフレームの実時刻で処理した方が良い場合もございます。

      ご不明な点がございましたらご連絡ください。
      以上、宜しくお願い致します。
      HARK Support Team.

      #2796
      牛太郎
      Participant

        早速のご返信ありがとうございます.

        方法1の場合, 取得できる時刻はPC内の時刻だと考えております.
        方法2の場合はどこの時刻を取得しているのでしょうか. また, NTPサーバーからの時刻の取得は可能でしょうか。

        (方法1で行うとしたら, webカメラをPCに接続すれば簡易的に動画の時刻を取得できるかなと考えております.)

        #2797

        > 方法1の場合, 取得できる時刻はPC内の時刻だと考えております.
        > 方法2の場合はどこの時刻を取得しているのでしょうか. また, NTPサーバーからの時刻の取得は可能でしょうか

        どのケースにおいても HARK を実行している PC のシステム時刻になります。
        フレーム単位の時刻に関しましても PC が NTP で同期している場合は、取得した時点の時刻となります。
        つまり、 HARK の実行中に NTP で大きな時刻修正が入ると時刻がジャンプしたり戻るなどが発生する可能性が御座います。

        > (方法1で行うとしたら, webカメラをPCに接続すれば簡易的に動画の時刻を取得できるかなと考えております.)

        web カメラが PC の時刻に同期している場合は、 HARK が出力する時刻と一致します。
        一方でネットワークカメラのように単体で時刻を保持する機器が NTP 同期をしている場合は、個々のデバイスで同期する時刻が僅かにずれる可能性が御座います。
        なお、計算が面倒なことになるのでロケール(世界標準時なのか日本標準時なのかなど)の設定にはご注意ください。

        蛇足ですが、 AudioStreamFromMic ノードの出力端子の具体的な仕様は次の通りです。
        もし、ノードの出力を直接扱う C++ のコードを書かれる場合は下記をご参照ください。

        • TIME 端子:
          std::chrono::system_clock::time_point time; をメンバー変数として持つクラス Time() へのポインタが渡されている。
          std::chrono::system_clock::now() から LENGTH – ADVANCE 分の時間を差し引いた値(フレームの末尾時刻)が設定されている。
        • TIMESTAMP 端子:
          struct timeval time; をメンバー変数として持つクラス TimeStamp() へのポインタが渡されている。
          std::chrono::system_clock::now() から LENGTH – ADVANCE 分の時間を差し引いた値(フレームの末尾時刻)を timeval 型に変換した値が設定されている。

        以上、宜しくお願い致します。
        HARK Support Team.

      Viewing 4 posts - 1 through 4 (of 4 total)
      • You must be logged in to reply to this topic.