設計上の考慮事項

Design Considerations

オーディオデータ形式に応じて、可逆、非可逆、または圧縮される場合があります。 WAV、MP3、またはFLACと、サンプリングレートとビットレートで表される品質の場合、プロジェクトには、メモリ、ストレージスペース、入出力スループット、処理能力など、さまざまなリソースが必要になります。 リソースは、プロジェクトの種類とプロジェクトの設計で説明されている機能によっても異なります。

Depending on the audio data format, that may be lossless, lossy or compressed, e.g. WAV, MP3 or FLAC and the quality expressed in sampling rate and bitrate, the project will require different resources: memory, storage space, input / output throughput and the processing power. The resources will also depend on the project type and features discussed in Project Design.

このセクションでは、必要なデータ形式、オーディオ品質、および機能を満たすようにオーディオプロジェクトを設計するときに考慮する必要がある、ESP32システムリソースの容量とパフォーマンスについて説明します。

This section describes capacity and performance of ESP32 system resources that should be considered when designing an audio project to meet required data format, audio quality and functionality.

メモリ

Memory

予備の内部データRAMは、「hello_world」の例で約290kBです。 オーディオシステムの場合、これでは不十分な場合があるため、ESP32には最大4MBの外部SPI RAM(つまり、PSRAM)メモリを使用する機能が組み込まれています。 外部メモリはメモリマップに組み込まれており、特定の制限内で、内部データRAMと同じように使用できます。

The spare internal Data-RAM is about 290kB with “hello_world” example. For audio system this may be insufficient, and therefore the ESP32 incorporates the ability to use up to 4MB of external SPI RAM (i.e. PSRAM) memory. The external memory is incorporated in the memory map and is, within certain restrictions, usable in the same way internal Data-RAM is.

詳細については、IDFドキュメントの外部SPI接続RAMセクションを参照してください。特に、非常に重要な制限セクションに注意してください。

Refer to External SPI-connected RAM section in IDF documenation for details, especially pay attention to its Restrictions section which is very important.

PSRAMを使用できるようにするには、ボードにインストールされている場合、menucofigの[Component config] > [ESP32-specific] > [SPI RAMconfig]で有効にする必要があります。 同じメニューでデフォルトで設定されているオプションCONFIG_SPIRAM_CACHE_WORKAROUNDは、有効のままにしておく必要があります。

To be able to use the PSRAM, if installed on your board, it should be enabled in menucofig under Component config > ESP32-specific > SPI RAM config. The option CONFIG_SPIRAM_CACHE_WORKAROUND, set by default in the same menu, should be kept enabled.

Note

BluetoothとWi-Fiは、オーディオアプリケーションに十分なメモリを残さないため、PSRAMなしでは共存できません。

Bluetooth and Wi-Fi can not coexist without PSRAM because it will not leave enough memory for an audio application.

内部RAMの最適化とPSRAMの使用

Optimization of Internal RAM and Use of PSRAM

PSRAMにはいくつかの制限があるため、内部RAMはより価値のある資産です。 内部RAMを最適化するためのヒントをいくつか紹介します。

Internal RAM is more valuable asset since there are some restrictions on PSRAM. Here are some tips for optimizing internal RAM.
  • PSRAMを使用している場合は、[コンポーネントの構成] > [Wi-Fi]ですべての静的バッファーを最小値に設定します。 PSRAMを使用しない場合は、メモリを節約するために動的バッファを選択する必要があります。 詳細については、IDFドキュメントの「Wi-Fiバッファの使用」セクションを参照してください。
    If PSRAM is in use, set all the static buffer to minimum value in Component config > Wi-Fi; if PSRAM is not used then dynamic buffer should be selected to save memory. Refer to Wi-Fi Buffer Usage section in IDF documentation for details.
  • PSRAMとBTを使用する場合は、CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRSTCONFIG_BT_BLE_DYNAMIC_ENV_MEMORYを[Component config] > [Bluetooth] > [Bluedroid Enable]で「yes」に設定して、より多くの40kBメモリをPSRAMに割り当てる必要があります。
    If PSRAM and BT are used, then CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST and CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY should be set as “yes” under Component config > Bluetooth > Bluedroid Enable, to allocate more of 40kB memory to PSRAM
  • PSRAMとWi-Fiを使用する場合は、[コンポーネント構成] > [ESP32固有] > [SPI RAM構成]CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRSTを「yes」に設定して、PSRAMにメモリを割り当てる必要があります。
    If PSRAM and Wi-Fi are used, then CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST should be set as “yes” under Component config > ESP32-specific > SPI RAM config, to allocate some memory to PSRAM
  • [コンポーネント構成] > [ウェアレベリング]CONFIG_WL_SECTOR_SIZEを512に設定します
    Set CONFIG_WL_SECTOR_SIZE as 512 in Component config > Wear Levelling

Note

セクターのサイズが小さいほど、書き込み/読み取り速度が遅くなり、その逆も同様ですが、サポートされるのは512と4096のみです。

The smaller the size of sector be, the slower the Write / Read speed will be, and vice versa, but only 512 and 4096 are supported.
  • PSRAMを使用するにはmalloc(1024 * 10)ではなくchar *buf = heap_caps_malloc(1024 * 10, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)を呼び出し、内部RAMを使用するにはchar *buf = heap_caps_malloc(512, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)を呼び出します。
    Call char *buf = heap_caps_malloc(1024 * 10, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT) instead of malloc(1024 * 10) to use PSRAM, and call char *buf = heap_caps_malloc(512, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) to use internal RAM.
  • PSRAMを自動的に割り当てるためにmalloc()に依存しないことで、メモリを完全に制御できます。 他のmalloc()呼び出しによる内部RAMの使用を回避することにより、PSRAMをタスクスタックメモリとして使用できないため、高効率の使用とタスクスタックのためにより多くのメモリを予約できます。
    Not relying on malloc() to automatically allocate PSRAM allows to make a full control of the memory. By avoiding the use of the internal RAM by other malloc() calls, you can reserve more memory for high-efficiency usage and task stack since PSRAM cannot be used as task stack memory.
  • タスクスタックは常に内部RAMに割り当てられます。 一方、PSRAM上のスタックでタスクを作成できるxTaskCreateStatic()関数を使用できます(PSRAMおよびFreeRTOS menuconfigのオプションを参照)が、そのヘルプ情報に注意してください。
    The task stack will always be allocated at internal RAM. On the other hand you can use of the xTaskCreateStatic() function that allows to create tasks with stack on PSRAM (see options in PSRAM and FreeRTOS menuconfig), but pay attention to its help information.

Important

xTaskCreateStaticタスクでROMコードを使用しないでください:ROMコード自体はcomponents/esp32/ld/esp32.rom.ldにリンクされています。 ただし、Wi-FiライブラリやBluetoothライブラリなど、ROM関数を呼び出す他のコードや、CONFIG_SPIRAM_CACHE_WORKAROUNDパッチに対して再コンパイルされないコードも考慮する必要があります。 一般に、これはIDFライブラリ(libcを含む)を呼び出さないスレッドでのみ使用し、計算のみを実行し、FreeRTOSプリミティブを使用して他のスレッドと通信することをお勧めします。

Don’t use ROM code in xTaskCreateStatic task: The ROM code itself is linked in components/esp32/ld/esp32.rom.ld. However, you also need to consider other pieces of code that call ROM functions, as well as the code that is not recompiled against the CONFIG_SPIRAM_CACHE_WORKAROUND patch, like the Wi-Fi and Bluetooth libraries. In general, we advise using this only in threads that do not call any IDF libraries (including libc), doing only calculations and using FreeRTOS primitives to talk to other threads.

コンポーネント別のメモリ使用量の概要

Memory Usage by Component Overview

以下は、ESP-ADFコンポーネントとそのメモリ使用量を含む表です。 必要なコンポーネントを選択し、残りの内部RAMの量を調べます。 PSRAMを使用するかどうかに関係なく、テーブルは2つの部分に分かれています。 PSRAM(外部RAM)が使用されている場合、メモリの一部はPSRAMに自動的に割り当てられます。

Below is a table that contains ESP-ADF components and their memory usage. Choose the components needed and find out how much internal RAM is left. The table is divided into two parts, when PSRAM is used or not. If PSRAM (external RAM) is in use, then some of the memory will be allocated at PSRAM automatically.

初期のスペア内部RAMは290kBです。

The initial spare internal RAM is 290kB.
成分
Component
必要な内部RAM
Internal RAM Required
PSRAMは使用されていません
PSRAM not used
PSRAM付き
With PSRAM
Wi-Fi 1 50kB+ 50kB+
Bluetooth 140kB (50kB if only BLE needed) 95kB (50kB if only BLE needed)
Flash Card 2 12kB+ 12kB+
I2S 3 構成可能、参照用8kB
Configurable, 8kB for reference
構成可能、参照用8kB
Configurable, 8kB for reference
RingBuffer 4 構成可能、参照用30kB
Configurable, 30kB for reference
0kB、すべてPSRAMに移動
0kB, all moved into PSRAM

上記の表の注

Notes to the table above
  1. Wi-Fiのmenuconfigによると、各TxおよびRxバッファーは1.6kBの内部RAMを占有します。 50kB RAMの値は、5つのRx静的バッファーと6つのTx静的バッファーの使用を想定しています。 PSRAMを使用していない場合は、RAMを節約するために「WiFi送信バッファーのタイプ」オプションをDYNAMICに設定する必要があります。この場合、RAMの使用量は50kBをはるかに下回りますが、プログラマーは少なくとも50kBを使用可能に保つ必要があります。 Wi-Fiがデータを送信できるようにするため。 [内部RAMのみ]
    According to the Wi-Fi menuconfig each Tx and Rx buffer occupies 1.6kB internal RAM. The value of 50kB RAM is assuming use of 5 Rx static buffers and 6 Tx static buffers. If PSRAM is not in use, then the “Type of WiFi Tx Buffer” option should be set as DYNAMIC in order to save RAM, in this case, the RAM usage will be far less than 50kB, but programmer should keep at least 50kB available for the Wi-Fi to be able to transmit the data. [Internal RAM only]
  2. sd_card_mount()関数で使用されるaudio_hal/board/board.hSD_CARD_OPEN_FILE_NUM_MAXの値に応じて、必要なRAMは、開くファイルの最大数が増えると増加します。 12kBは、最大5つのファイルと512バイトのCONFIG_WL_SECTOR_SIZEで必要なRAMです。 [内部RAMのみ]
    Depending on value of SD_CARD_OPEN_FILE_NUM_MAX in audio_hal/board/board.h, that is then used in sd_card_mount() function, the RAM needed will increase with a greater number of maximum open files. 12kB is the RAM needed with 5 max files and 512 bytes CONFIG_WL_SECTOR_SIZE. [Internal RAM only]
  3. I2Sストリームの構成設定に応じて、audio_stream/include/i2s_stream.hおよびaudio_stream/i2s_stream.cを参照してください。 [内部RAMのみ]
    Depending on configuration settings of the I2S stream, refer to audio_stream/include/i2s_stream.h and audio_stream/i2s_stream.c. [Internal RAM only]
  4. リングバッファの構成設定に応じて、audio_pipeline/include/audio_pipeline.hDEFAULT_PIPELINE_RINGBUF_SIZEを参照するか、バッファが次のように作成されている場合はユーザー設定を参照してください。rb_create()
    Depending on configuration setting of the Ringbuffer, refer to DEFAULT_PIPELINE_RINGBUF_SIZE in audio_pipeline/include/audio_pipeline.h or user setting, if the buffer is created with e.g. rb_create().

システム設定

System Settings

オーディオプロジェクトで高いWi-Fiパフォーマンスを実現するには、次の設定をお勧めします。

The following settings are recommended to achieve a high Wi-Fi performance in an audio project.

Note

製品設計、コンポーネントの選択、製品テストに注意を払っている評判の良いベンダーのESP32モジュールとボードを使用してください。 これは、校正されたRFを備えた適切に設計されたボードを確実に受け取るためです。

Use ESP32 modules and boards from reputable vendors that put attention to product design, component selection and product testing. This is to have confidence of receiving well designed boards with calibrated RF.
  • menuconfigで次のオプションを設定します。

    Set these following options in menuconfig.
    • Flash SPI mode as QIO
    • Flash SPI speed as 80MHz
    • CPU frequency as 240MHz
    • [コンポーネント設定] > [LWIP] > [TCP]で、デフォルトの受信ウィンドウサイズ最大セグメントサイズの5倍に設定します
      Set Default receive window size as 5 times greater than Maximum Segment Size in Component config > LWIP > TCP
  • 外部アンテナを使用する場合は、「esp-idf/components/esp32/phy_init.c」で、PHY_RF_CAL_PARTIALPHY_RF_CAL_FULLとして設定します。

    If external antenna is used, then set PHY_RF_CAL_PARTIAL as PHY_RF_CAL_FULL in ‘’esp-idf/components/esp32/phy_init.c’‘