ESP32S3でDSP機能を使う

ESP32S3でFFTしたい…

こうした悩みを解決します。自分の忘備録も兼ねているので適宜スキップしてください。

前提

本記事はVScodeのESP-IDF拡張機能を用いて行います。

ESP-IDFのインストール

本筋ではないのでざっくり。

VScodeの拡張機能からESP-IDFをVScodeにインストール。

左にESP-IDFアイコンが表示されるので、
COMMANDSタブ→AdvancedタブにあるConfigue ESP-IDF Extensionをクリック。

Configue extensionボタンをクリック。EXPRESSを押して諸々をインストール。
(8GB程度必要なので容量注意、10分以上かかるのでPCスリープ中断にも注意)

プロジェクトの作成

左にESP-IDFアイコンのCOMMANDSタブ→AdvancedタブにあるNew Projectをクリック。
プロジェクトを作成します。

ESP-DSPコンポーネントの追加

ESP-IDF公式のgitを参照します。

まずテキトーにプロジェクトを開きます。

コマンドパレット(ctrl + shift + P)を開いて、下記コマンドを入力

idf.py add-dependency "espressif/esp-dsp"

これにより、esp-dsp コンポーネントがmainプロジェクトのコンポーネントへの依存関係として追加されます。
とりあえず意味は気にせず次行きます。

DSPサンプルプログラムのインストール

ESP-IDF公式のgitにDSPのサンプルプログラムがあります。

今回はFFTをインストールしてみます。コマンドパレットにて、下記コマンドを入力します。

idf.py create-project-from-example "espressif/esp-dsp:fft"

すると、プロジェクトにfftディレクトリがコピーされます。

サンプルプログラムのビルド、書き込み

ここからコンソールにて操作することになります。

VScodeのTERMINALからpowershellを開き、fftディレクトリに移動します。

おそらく標準ではディレクトリmainやfftの上がカレントディレクトリとなっていると思います。

cd ./fft

これでfftディレクトリに移動します。

環境変数の設定

まずはターミナルの環境変数を設定します。これをやらないとコマンド操作ができません。

. $HOME\esp\v5.5.3\esp-idf\export.ps1

※windowsの場合。linuxだとps1ではなくsh拡張子のファイルを指定します。
※バージョンによって5.5.3部分の数字は変わります。

失敗する場合は、まず下記コマンドを実行してください。
. $HOME\esp\v5.5.3\esp-idf\install.ps1

ターゲット設定

つづいてターゲット設定をします。

標準ではESP32が割り当てられているので、必要に応じて切り替えます。
たとえば、私はESP32-S3を使用しているので、下記のように設定します。

idf.py set-target esp32s3

設定ファイルが再構築されます。

ビルド

下記コマンドでプロジェクトをビルドします。

idf.py build

1200近いステップがあり、時間がかかります(windowsは特に。linuxだとwindowsの1/3程度の時間で済む)

成功すると、下記のような出力が出ます。「書き込みしよう」と言われてます。

Project build complete. To flash, run:
 idf.py flash
or
 idf.py -p PORT flash
or
 python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 2MB --flash_freq 80m 0x0 build\bootloader\bootloader.bin 0x9000 build\partition_table\partition-table.bin 0x20000 build\fft2r.bin
or from the "<プログラムディレクトリ>\fft\build" directory
 python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args"

書き込み

ESP32-S3をPCに接続して、下記コマンドで書き込みます。

idf.py flash

シリアルモニタを開くと、以下のように出力します。

---- Opened the serial port COM3 ----
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x2b (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce2820,len:0x14f0
load:0x403c8700,len:0xd24
load:0x403cb700,len:0x2ef0
entry 0x403c8924
I (24) boot: ESP-IDF v5.5.3 2nd stage bootloader
I (25) boot: compile time Feb 27 2026 13:49:59
I (25) boot: Multicore bootloader
I (25) boot: chip revision: v0.2
I (28) boot: efuse block revision: v1.3
I (31) boot.esp32s3: Boot SPI Speed : 80MHz
I (35) boot.esp32s3: SPI Mode       : DIO
I (39) boot.esp32s3: SPI Flash Size : 2MB
I (43) boot: Enabling RNG early entropy source...
I (47) boot: Partition Table:
I (50) boot: ## Label            Usage          Type ST Offset   Length
I (56) boot:  0 nvs              WiFi data        01 02 0000a000 00006000
I (63) boot:  1 phy_init         RF data          01 01 00010000 00001000
I (69) boot:  2 factory          factory app      00 00 00020000 00100000
I (76) boot: End of partition table
I (79) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=0e340h ( 58176) map
I (97) esp_image: segment 1: paddr=0002e368 vaddr=3fc92400 size=01cb0h (  7344) load
I (99) esp_image: segment 2: paddr=00030020 vaddr=42000020 size=1660ch ( 91660) map
I (117) esp_image: segment 3: paddr=00046634 vaddr=3fc940b0 size=01270h (  4720) load
I (119) esp_image: segment 4: paddr=000478ac vaddr=40374000 size=0e3d4h ( 58324) load
I (134) esp_image: segment 5: paddr=00055c88 vaddr=50000000 size=00020h (    32) load
I (140) boot: Loaded app from partition at offset 0x20000
I (140) boot: Disabling RNG early entropy source...
I (152) cpu_start: Multicore app
I (160) cpu_start: GPIO 44 and 43 are used as console UART I/O pins
I (161) cpu_start: Pro cpu start user code
I (161) cpu_start: cpu freq: 160000000 Hz
I (162) app_init: Application information:
I (166) app_init: Project name:     fft2r
I (170) app_init: App version:      1
I (173) app_init: Compile time:     Feb 27 2026 13:45:43
I (178) app_init: ELF file SHA256:  f5b9a4f84...
I (183) app_init: ESP-IDF:          v5.5.3
I (187) efuse_init: Min chip rev:     v0.0
I (190) efuse_init: Max chip rev:     v0.99 
I (194) efuse_init: Chip rev:         v0.2
I (198) heap_init: Initializing. RAM available for dynamic allocation:
I (205) heap_init: At 3FC9B408 len 0004E308 (312 KiB): RAM
I (210) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
I (215) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (220) heap_init: At 600FE000 len 00001FE8 (7 KiB): RTCRAM
I (226) spi_flash: detected chip: gd
I (229) spi_flash: flash io: dio
W (232) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (244) sleep_gpio: Configure to isolate all GPIO pins in sleep state
I (250) sleep_gpio: Enable automatic switching of GPIO sleep configuration
I (257) main_task: Started on CPU0
I (277) main_task: Calling app_main()
I (277) main: Start Example.
W (327) main: Signal x1
I (327) view: Data min[331] = -160.081253, Data max[164] = 23.930540
 ________________________________________________________________
0                                                                |
1                    |                                           |
2                    |                                           |
3                    |                                           |
4                    |                                           |
5                    |                                           |
6                   | |                                          |
7                   | |                                          |
8                  || ||                                         |
9||||||||||||||||||     ||||||||||||||||||||||||||||||||||||||||||
 0123456789012345678901234567890123456789012345678901234567890123
I (387) view: Plot: Length=512, min=-60.000000, max=40.000000
W (397) main: Signal x2
I (397) view: Data min[406] = -210.518005, Data max[205] = 3.849705
 ________________________________________________________________
0                                                                |
1                                                                |
2                                                                |
3                         |                                      |
4                         |                                      |
5                         |                                      |
6                         |                                      |
7                         ||                                     |
8                        | |                                     |
9||||||||||||||||||||||||   ||||||||||||||||||||||||||||||||||||||
 0123456789012345678901234567890123456789012345678901234567890123
I (477) view: Plot: Length=512, min=-60.000000, max=40.000000
W (477) main: Signals x1 and x2 on one plot
I (487) view: Data min[425] = -156.430313, Data max[164] = 23.930540
 ________________________________________________________________
0                                                                |
1                    |                                           |
2                    |                                           |
3                    |    |                                      |
4                    |    |                                      |
5                    |    |                                      |
6                   | |   |                                      |
7                   | |   ||                                     |
8                  || || | |                                     |
9||||||||||||||||||     |   ||||||||||||||||||||||||||||||||||||||
 0123456789012345678901234567890123456789012345678901234567890123
I (557) view: Plot: Length=512, min=-60.000000, max=40.000000
I (567) main: FFT for 1024 complex points take 99097 cycles
I (567) main: End Example.
I (577) main_task: Returned from app_main()

まとめ

ESP-DSP機能の使うにあたっては、
引っ張ってきたサンプルのディレクトリに移動して
環境変数やターゲット設定を行った後、ビルド・書き込みします。

error: コンテンツ保護のため右クリック使用禁止