Skip to content

Technical

Specifications

Every part, purpose-fit for portable audio

Loading 3D view…

Processor Espressif ESP32-WROOM-32 (dual-core Xtensa LX6, 240MHz)
Memory 520KB SRAM (no PSRAM). Everything runs in the chip's built-in memory
Display 2.8" 240x320 TFT Capacitive Touchscreen
Dimensions 63 x 90 x 15 mm
Weight 75g (with case, battery, board, and MicroSD card)
Storage MicroSD up to 2TB (exFAT)
Included Storage 32GB MicroSD card
Audio Formats MP3, AAC, M4A, FLAC, WAV (PCM 8/16/24/32-bit), Opus
Audio Output Bluetooth A2DP to any speaker or headphones
Remote Control AVRCP (play/pause/next/prev from paired device)
Bluetooth Bluetooth 4.2
Wi-Fi 802.11 b/g/n
Web Interface Built-in Wi-Fi web UI accessible from any browser on the same network
Battery 1200mAh, 16+ hours playback*
Charging USB-C
Case 3D-printed, available in any color
Software Fully activated, OTA firmware updates via Wi-Fi

*Battery specs based on current prototype. The final product may ship with a larger battery.

Engineering

Under the hood

The entire Fonix One software stack shares what the ESP32 has left over. Here's how.

Memory budget

Physical SRAM on the ESP32

520 KB

~360 KB reserved ~160 KB usable

Inside that ~160KB, during playback

~160 KB

25 KB decoder pool ~88 KB remainder 45-50 KB still free

The 520KB, 160KB, 25KB and 45-50KB figures are measured. The ~88KB remainder is what is left after the decoder pool and free heap are subtracted.

Custom Audio Decoders

The Fonix MP3 and Fonix AAC decoders are fully bespoke, clean-room implementations purpose-built for the ESP32's Xtensa LX6 processor. Together they comprise approximately 9,500 lines of hand-written C and 900 lines of Xtensa assembly, operating entirely within a shared 25KB memory pool using fixed-point arithmetic with zero floating-point dependencies.

The FLAC decoder is based on miniflac, but has been largely rewritten from the ground up. It handles full 4096-sample blocks while running inside just 25KB of RAM, including all decode buffers. Key hot paths use custom Xtensa assembly for LPC prediction. As far as we know, no other FLAC decoder handles 4096-sample blocks on an ESP32 without external RAM.

Polyphase FIR Resampler

Audio files come in many sample rates, but Bluetooth output requires a consistent 44.1kHz. The Fonix One uses a broadcast-quality polyphase convolution resampler with 256 phases and 32 taps per phase, reaching around 80dB of stopband attenuation, far beyond what's typical for embedded audio.

The entire resampler state fits in just 288 bytes of RAM. The inner loop is hand-tuned Xtensa assembly with pipelined loads, zero-overhead hardware loops, and branchless saturation.

5-Band Graphic Equalizer

The EQ uses fixed-point biquad IIR filters instead of floating-point math, which suits the ESP32's integer cores far better. The filter processing has been rewritten in custom Xtensa assembly, bringing CPU usage down to roughly 2% at 44.1kHz. Gain staging and per-stage saturation keep the output clean with all five bands boosted. No clipping, no artifacts.

Memory Limitations, No Compromises.

Every audio file passes through a complete processing pipeline: decode, resample, equalize, apply ReplayGain volume normalization, then stream over Bluetooth. And that's just the audio side. The same 160KB of usable RAM simultaneously runs the touchscreen UI, Bluetooth connectivity and SBC encoding, SD card file system operations, and background tasks like metadata indexing and artwork fetching. Even during playback, 45-50KB of heap stays free.

~160 KB

Usable RAM

25 KB

Decoder pool

288 B

Resampler state

0

PSRAM