Pico2UltraHiResUSBDDC
USB Digital Audio Device
Install / Use
/learn @ArqAlice/Pico2UltraHiResUSBDDCREADME
Pico2UltraHiResUSBDDC (USB Digital Audio Device)
本プロジェクトは、RP2350(RaspberryPiPico2)上で動作する、USB Audio Class 1.0 に準拠した USBデジタルオーディオコンバータ(USB-DDC) です。
USB経由で入力された2ch PCMオーディオ信号に対し、高品質なアップサンプリング処理を行い、I²Sインターフェイスを通じてDACチップへ出力します。
🔍 概要
本デバイスは、PCなどのUSBホストからオーディオ信号を受け取り、リアルタイムで最大32倍のアップサンプリングを行い、DACチップへ32bit I²S形式で出力するUSB-DDC(Digital to Digital Converter)です。
信号処理には Raspberry Pi Pico2(RP2350)を採用し、マルチコア構成・DMA・PIO を駆使して低遅延・高精度なオーディオ信号伝送を実現しています。
✨ 特長
- USB Audio Class 1.0 準拠(OS標準ドライバで動作)
- リアルタイム・FIR/IIRハイブリッドフィルタによる最大32倍アップサンプリング(16倍以下ではすべてFIRで変換します)
- 2ch ステレオ PCM 入力(16bit / 24bit)
- 複数のDACチップと動作確認済(TI PCM5102, ESS ES9038Q2M等)
🔈 入力仕様(USB側)
| パラメータ | 値 | | ---------------- | --------------------------------- | | オーディオクラス | USB Audio Class 1.0 | | チャンネル数 | 2ch ステレオ | | ビット深度 | 16bit / 24bit (整数型) | | サンプルレート | 44.1kHz / 48kHz / 88.2kHz / 96kHz |
🔊 出力仕様(I²S側)
| パラメータ | 値 | | -------------- | ------------------------------------------------------------------------------- | | フォーマット | I²S 32bit(左右チャンネル交互) | | チャンネル数 | 2ch ステレオ | | ビット深度 | 固定 32bit(int) | | サンプルレート | 最大 1536kHz / 1411.2kHz(入力に応じて自動切替) | | 対応出力周波数 | 1536kHz / 1411.2kHz , 768kHz / 705.6kHz , 384kHz / 352.8kHz , 192kHz / 176.4kHz |
🎧 対応DACチップ
- TI PCM5102
- ESS ES9038Q2M
- ESS ES9039Q2M
その他、32bit I²S インターフェースをサポートする DAC チップで使用可能です。
⚙ 使用技術・構成
- RP2350(Raspberry Pi Pico2)
- DMA + PIO による I²S 出力
- マルチコア処理
- Core0:USB通信処理 + アップサンプリング処理
- Core1:アップサンプリング処理 + DMA + I²S 送信処理
- アップサンプリング構成
- Core0:FIRよる 8x 拡張
- Core1:FIRによる 2x 拡張, またはBiQuad-IIR による 4x 拡張
- USB制御
- LUFAベースの USB Audio Class 実装
- タイミング制御
- timer 割り込み + バッファレートに応じたフィードバック制御
🔧 ビルド・使用方法
- VisualStudioCode上でRaspbarryPiPico拡張機能をインストール・有効化してください
- 本リポジトリをクローンしてください
- VisualStudioCodeにてCompileを行ってください (コンパイルしたファイルはbuild/srcディレクトリに生成されます)
- RaspberryPiPico2のBOOTSELボタンを押しながらRaspberryPiPico2をPCに接続してください
- 書き込みが完了すると自動的にOS標準のUSBオーディオデバイスとして認識されます
🔧 コンフィグレーション
RP2350(RaspberryPiPico2)上の仕様で可能な範囲で、出力ピンアサインおよびアップサンプリング設定を任意に変更できます。
変更する場合は、 src/common.h にある"User Configurable"項を編集してください
ピンアサイン
デフォルトでは以下のようになっています (Seed XIAO RP2350推奨)
I2S
- I2S DATA : GP26
- I2S BCLK : GP27
- I2S LRCK : GP28 (I2S_SIDESET_BASE + 1)
I2C (PCM5102では不要)
- SDA : GP6
- SCL : GP7
DAC ENABLE(PCM5102では不要)
- DAC ENABLE PIN : GP5
パワーモード切替(オプション)
- POWERMODE SW PIN : GP0 パワーモード切替を使用する際は、ALWAYS_HIGH_POWERおよびALWAYS_LOW_POWERをfalseにしてください。 (LOW_POWERモードを使用する構成の場合、768kHz/705.6kHz以下を推奨します)
アップサンプリング設定
デフォルトでは 384kHz/352.8kHz になっています。
| 出力サンプルレート | CORE0_UP_RATIO_HP | CORE1_UP_RATIO_HP | | ------------------ | ----------------- | ----------------- | | 1536kHz/1411.2kHz | 8 | 4 | | 768kHz/705.6kHz | 8 | 2 | | 384kHz/352.8kHz | 8 | 1 | | 192kHz/176.4kHz | 4 | 1 |
ESS DAC Specific
ESS製DACにて使用する場合は、USE_ESS_DAC をtrueにしてください。
現在、動作確認済みのESS製DACは、ES9038Q2M、ES9039Q2Mの2種類になります。
「KIND_ESS_DAC」のdefineに使用するESS DACの名称を書いてください。
ES9038Q2Mを使用する場合は「ES9038Q2M」、ES909Q2Mを使用する場合は「ES9039Q2M」になります。
なお、ES9039Q2Mは1536kHz/1411.2kHz入力をサポートせず、768kHz/705.6kHzまでとなるため、注意してください。
📚 ライセンス
MIT License
Copyright 2025 ArqAlice
