Team for GR-PEACH Producer Meeting

IsochronousEp::isochronousReceiveの利用

11 Oct 2015

GR-PeachをUSBHOSTとして動作させ、isochronousReceiveを利用して、USBDAC(ADCとして使う訳ですが)からオーディオストリームを読み込もうとしていますが、知識不足で動作させることができません。ちょっとしたヒントでも構いませんので、何か感じられる事があれば、ご指摘下さい。
◆現在試している方法は、入力用のIsochronousEpを作って、m_isoEp->initにてエンドポイント番号( | 0x80)等を設定し、SET_CUR命令で、DAC内のエンドポイントやMUTE,FUを設定した後、isochronousReceiveを呼び出しています。
ダンプで確認した限りでは、ITDやEDは正しく設定されているのですが、transferCompletedが呼び出されないため、いつまでもキューに受信済みのITDが入って来ず、get_queue_HCITDでITDが取り出せない状態です。

25 Sep 2015

USBHostに対するアイソクロナスIN用のインターフェース登録と、USBDACへのSET_INTERFACEが正しく行えていない可能性があります。
USBHostDacのサンプルでは、chkAudioStreaming()にてインターフェースの確認をしており、戻り値がtrueの場合にUSBHostに対してインターフェース登録がされます。
この関数では以下の場合に使用可能なインターフェースだと判断しています。

  1. 出力用のエンドポイントがある
  2. 48kHz
  3. 2チャンネル
  4. 16bitデータ
  5. 最大パケットサイズが192byte以上

通常USBDACでは、入力と出力で異なるインターフェースが使用されます。
そこで、判定文を以下のように書き換えてみてはいかがでしょうか。

bool USBHostDac::chkAudioStreaming() {
 ...omit...
   /* bNumEndpoints */
    if (conf_descr[index + 4] >= 1) {
...omit...
#if(1) // 入力、48kHz、16bit
        if (((bEndpointAddress & 0x80) != 0) && (SubframeSize == 2) && (smpling_ok != false)) {
            return true;
        }
#else
        if (((bEndpointAddress & 0x80) == 0) && (wMaxPacketSize >= PACKET_SIZE)
         && (channels == 2) && (SubframeSize == 2) && (smpling_ok != false)) {
            return true;
        }
#endif
    }

    return false;
}
  • チャネル数はマイク入力の場合は1チャンネルになることが多いので今回は参照しない。
  • 最大パケットサイズはチャネル数に依存するので今回は参照しない。

ここで設定された、bEndpointAddress、bAlternateSetting、bInterfaceNumberを使って、USBDACに対してSET_INTERFACEが送信されます。

                int addr = dev->getAddress();
                m_isoEp->init(addr, bEndpointAddress, PACKET_SIZE, FRAME_COUNT, QUEUE_NUM);
                setInterface(bAlternateSetting, bInterfaceNumber);


入出力の両方を行いたい場合はもう少し改造が必要になると思います。

30 Sep 2015

USBHostDac::receiveをサンプルに加えました。よろしければご参照ください。
2つ以上のアイソクロナス転送を同時に実行すると、正常に動作しない問題があったため、こちらについても修正しています。
サンプルでは、BSHSAU01BKというデバイスを使って、マイク入力(モノラル)した音声をスピーカー(ステレオ)に出力します。
使用するデバイスに合わせて、USBHostDac::chkAudioStreaming()を書き換える必要があると思います。(入力チャネル数など)

Import programUSBHostDac_Audio_in_out

The sound input from a microphone is output from a speaker. Check device : BSHSAU01BK

11 Oct 2015

サンプルありがとうございます。残念ながらサンプルを利用させて頂いても、力不足のためDN-USBSA6CHOPTからLINE-INのオーディオストリームを読み取ることはできておりません。仕方なく、USB1端子を使って、USBデバイスとしてPC等が再生したオーディオデータを受取って動作するように致しました。チャンネル分割、特性補償ともに正常動作しております。
全く開発途上のものであるにもかかわらず、https://developer.mbed.org/users/dokunewon/code/Peach_ChDividerAndCompensator_84として公開しました。初めて「公開」処理を行なったので、うまく公開できているかどうかさえわかりません。公開の途中で「ライブラリをコミットします」というメッセージが出るので、既存の共用ライブラリが書き換えられたらどうしよう、とドキドキ致しました。
LINE-INが利用できますと、スマホ等のヘッドホン端子と接続して、手軽に使えるようになりますので、今一度サンプルをよく読ませて頂き、勉強したいと存じます。
現在、システムの測定と逆関数の生成はPC上で処理しておりますので、これもPeach上で行なえれば面白いなと考えております。

12 Oct 2015

おかげさまで、LINE-INを読み出すことができました。
マルチチャンネルDACでは、コンフィギュレーションディスクリプタ534バイトと大きく、サンプルプログラムでは、デイスクリプタバッファ(data)のサイズが415バイト固定であったた、え最後まで読めてなかった様子です。この最後の方にLINE-INのエンドポイントが記述されていました。
data[4150]としたところ、LINE-INのイソクロナス信号がUSB上に現れたことがオシロで観察され、接続すると、音が聞こえてまいりました。 いやぁ…ほんとうにありがとうございます。

12 Oct 2015

6CHが出力できるように細工しました。6CH出力のような、大きなアイソクロナスパケットを出すには、USBIsochronous.hの一部を、
inline void* operator new(size_t size, int buf_size) {
void* p;
#if !defined (_CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
//バッファ先頭アドレスは、下位12ビットが0となっていると好都合
//アイソクロナスパケットが小さい間は問題が無いが、大きくなると、異常を生じる様子。
//獲得されるメモリアドレスは時によるので、運がよければ動作するが、12ビットアラインにすれば、確実に動くように思われる
p = memalign(0x1000, size+buf_size);
return p;
#else
//バッファ先頭アドレスは、下位12ビットが0となっていると好都合
//p = posix_memalign(&p, 32, size+buf_size);というオリジナルの記述では下位4ビットしか0になってない。
if (posix_memalign(&p, 0x1000, size+buf_size) == 0) {
return p;
}
return NULL;
#endif
}
と、書き換えると、なぜかうまく行くことが分かりました。偶然動いただけかも知れません。

14 Oct 2015

プログラムの公開ありがとうございます。
私も最初の公開時には「ライブラリをコミットします」であせりました。

> 現在、システムの測定と逆関数の生成はPC上で処理しておりますので、これもPeach上で行なえれば面白いなと考えております。
とても良い案ですね!PC無しで設定まで作れると凄いですね!

  1. USBHost_AddIsoを使ったLINE-INについて
    デイスクリプタバッファ(data)のサイズが415バイト固定なのはオフィシャルコードと合わせているのですが、確かに少ないと思います。USBHost_AddIsoでも拡大することを検討します。
    また、USBHost_AddIsoのリビジョン31(31:271fcfd7cfc2)にて、2つ以上のアイソクロナス転送を同時に実行すると、正常に動作しない問題を修正しています。現在、Doku_USBHost_AddIso は、USBHost_AddIsoのリビジョン30(30:2851a9b2bbfb)を元に作成しているようですので、LINE-INとLINE-OUTを同時に行うのであれば、USBHost_AddIsoのリビジョン31(31:271fcfd7cfc2)を元にした方が良いです。
  2. USBIsochronous.hのアラインサイズについて
    おそらく、元のプログラムで行っているアラインは、ITDの先頭アドレスとして使用できるアラインに設定するもので、BufferPage0に設定するメモリのアラインについては考慮していないと思います。その為、ご指摘の通り、大きな転送(1つのITDあたり、4096byteを超える)を行う場合は、取得できたアドレスによっては正常に動作しないと思われます。(BufferPage0、BufferEndで表現できるアドレスの範囲は各4Kbyte。)
    16bit、6chの場合、1つのITDに設定されるバッファのサイズは「48kHz * 16bite / 8(byteに変換) * 6ch * 8ms分 = 4608byte」となり、4096byteを超えます。
    USBHost_AddIsoライブラリの修正を検討します。
  3. cmsis_dsp_neonについて
    1. 4096ポイントを超えるFFT
      申し訳ありません。CMSIS-DSPで提供されるcfftライブラリは、ご指摘どおり4096ポイントまでしか対応しておりません。
      (以下、arm_cfft_f32.cソースコードのコメントを転記します。)
      * The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses
      * a different twiddle factor table.

      当方では未検証で申し訳ないのですが、ProjectNe10というサイトでNEON対応の算術演算ライブラリが提供されています。
      http://projectne10.github.io/Ne10/

      (サンプルとして添付されているテストコードを見る限り、上限32768ポイントの FFT処理が実行できそうです。48行目、96行目。)
      http://projectne10.github.io/Ne10/doc/test__suite__fft__float32_8c_source.html
    2. FIR_f32フィルタ機能は32767ポイントなどの多ポイントFIRに使えるのか?
      以下のサンプルを参考に構成いただければ、適用可能と考えています。
      (サンプルプログラムのソースコードです。)
      https://www.keil.com/pack/doc/CMSIS/DSP/html/arm_fir_example_f32_8c-example.html

      (サンプルプログラムの解説です。)
      https://www.keil.com/pack/doc/CMSIS/DSP/html/group___f_i_r_l_p_f.html
16 Oct 2015

USBHost_AddIsoのアップデートを行いました。変更は以下の通りです。

  • デイスクリプタバッファ(data)のサイズを1024に拡張しました。
  • USBIsochronous.hのアラインを見直し、1つのITDあたり、4096byteを超える転送に対応しました。
19 Oct 2015

公開していただいた下記プログラム、こちらでも動作させることができました。とても快適です。
(USBDACはamazonで見つけた「RA-AUD51」を使用しています。)
https://developer.mbed.org/users/dokunewon/code/Peach_AudioChannelDividerAndCompensator/

19 Oct 2015

>こちらでも動作させることができました。とても快適です。
ご確認ありがとうございます。別のボードでも動作することが分かりとても嬉しいです。
最新のパブリッシュ(リビジョン12)では、まれに発生していたクリックノイズ(PCの送信が(曲の変わり目で)一時途絶えた後等に、USBDACへの送信バッファーのデータ不足が生じる)が対策でき、実用に耐えるレベルにかなり近づいたと感じています。ようやく、mbedの「コミット」や「パブリッシュ」の意味も分かって参りました。
現在はPC上で動作させている、補正用の逆フィルタの生成も、色々な論文を参考に工夫しておりますので、世間一般の工夫されたソフトと同レベルの性能が出ていると考えています。まずはこのツールを公開して、Peachをオーディオで使えるようにし、次の段階でPeach上で補正関数を生成できるようにしたいと考えております。

28 Oct 2015

Peachとは直接関係ありませんが、音響システムの特性を測定して、/users/dokunewon/code/Peach_AudioChannelDividerAndCompensator で使用するFIR係数ファイルを生成するツールを、同じページ内で公開しました。
非常に効果的ではあるのですが、オーディオの人はシステム補償に興味が無いし、手軽に良い特性を手に入れたい人は、このような難しいツールを使いたく無いし、よく考えるとニーズの無いツールであります。

02 Nov 2015

PC用ツールのご紹介、ありがとうございます。マニュアルも整備されていて、使いやすそうです。