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