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
Inside that ~160KB, during playback
~160 KB
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