{"id":7061,"date":"2026-07-17T12:38:26","date_gmt":"2026-07-17T10:38:26","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=7061"},"modified":"2026-07-17T13:57:18","modified_gmt":"2026-07-17T11:57:18","slug":"microcontroller-fft-ifft-performance-benchmark-n64","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/","title":{"rendered":"Microcontroller FFT &#038; IFFT Performance Benchmark (N=64)"},"content":{"rendered":"<p>The <strong>Fast Fourier Transform (FFT)<\/strong> is an efficient algorithm for computing the <strong>Discrete Fourier Transform (DFT)<\/strong>: it converts a signal from the <strong>time domain<\/strong> into the <strong>frequency domain<\/strong>, revealing which frequencies are present in a signal and how strong they are. It is the workhorse behind spectrum analyzers, audio effects, filtering, and countless other DSP applications.<\/p>\n<p id=\"microcontroller-fft-ifft-performance-benchmark-n64\">I recently published a new <a href=\"https:\/\/github.com\/pschatzmann\/fixedpoint-fft\">FFT library<\/a> that supports both <strong>integer and floating-point<\/strong> data types for its calculations. Using this library, I benchmarked DSP performance across a wide range of microcontroller architectures \u2014 from a vintage 8-bit AVR all the way up to a 480 MHz ARM Cortex-M7. The results reveal some surprising winners and a few important lessons about choosing the right chip (and the right data type) for your signal-processing project.<\/p>\n<hr \/>\n<h2 id=\"1-methodology\">Methodology<\/h2>\n<p>Each benchmark measures the time to compute a single <strong>N=64 complex FFT and IFFT<\/strong> for five data types: <code>int8_t<\/code>, <code>int16_t<\/code>, <code>int32_t<\/code>, <code>float<\/code> (32-bit), and <code>double<\/code> (64-bit). All timings are averaged over repeated runs and reported in microseconds (\u00b5s); throughput is derived as 1,000,000 \/ latency.<\/p>\n<h2 id=\"2-executive-summary-key-takeaways\">Executive Summary &amp; Key Takeaways<\/h2>\n<ul>\n<li><strong>The single-precision float king:<\/strong> The <strong>STM32H7<\/strong> dominates overall thanks to its 480 MHz clock and a hardware FPU with double-precision support. But the <strong>ESP32<\/strong> and <strong>ESP32-S3<\/strong> punch far above their weight class in single-precision <code>float<\/code>, outperforming everything except the STM32H7.<\/li>\n<li><strong>ESP32-S3 vs. ESP32 \u2014 a real generation leap:<\/strong> The ESP32-S3 (Xtensa LX7) delivers a substantial upgrade over the base ESP32 (Xtensa LX6). It cuts the floating-point FFT from 75.14 \u00b5s down to <strong>62.62 \u00b5s<\/strong> (~17% faster) and crushes integer IFFTs, running <code>int16_t<\/code> in just <strong>107.96 \u00b5s<\/strong> (~33% faster).<\/li>\n<li><strong>The double-precision cliff:<\/strong> Devices without a double-precision hardware FPU (ESP32\/S3, STM32F411, UNO R4, RP2040) suffer a massive slowdown \u2014 frequently <strong>5\u00d7 to 11\u00d7<\/strong> \u2014 when stepping from 32-bit <code>float<\/code> to 64-bit <code>double<\/code>, because double-precision math must be emulated in software.<\/li>\n<li><strong>RP2040 integer power:<\/strong> The <strong>RP2040<\/strong>&#8216;s integer performance is exceptionally strong \u2014 it even beats the STM32F411 in 8-bit and 16-bit FFTs \u2014 but it falls behind on floats because it has no hardware FPU and relies on its (admittedly well-optimized) ROM floating-point routines.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"3-fft-master-comparison-tables\">FFT Master Comparison Tables<\/h2>\n<h3 id=\"fft-calculation-latency-lower-is-better\">FFT Calculation Latency (lower is better)<\/h3>\n<p>Values are in microseconds (\u00b5s) per single N=64 FFT calculation. The fastest data type per board is highlighted in bold.<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Microcontroller<\/th>\n<th align=\"left\">Core Architecture<\/th>\n<th align=\"left\">Clock Speed<\/th>\n<th align=\"center\">int8_t<\/th>\n<th align=\"center\">int16_t<\/th>\n<th align=\"center\">int32_t<\/th>\n<th align=\"center\">float (32-bit)<\/th>\n<th align=\"center\">double (64-bit)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>Arduino Nano<\/strong><\/td>\n<td align=\"left\">AVR ATMega328P (8-bit)<\/td>\n<td align=\"left\">16 MHz<\/td>\n<td align=\"center\"><strong>4,144.62<\/strong><\/td>\n<td align=\"center\">9,798.18<\/td>\n<td align=\"center\">29,160.16<\/td>\n<td align=\"center\">17,165.54<\/td>\n<td align=\"center\"><em>N\/A<\/em><\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>UNO R4<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M4 (32-bit)<\/td>\n<td align=\"left\">48 MHz<\/td>\n<td align=\"center\">732.87<\/td>\n<td align=\"center\">668.05<\/td>\n<td align=\"center\">1,108.19<\/td>\n<td align=\"center\"><strong>360.89<\/strong><\/td>\n<td align=\"center\">4,045.90<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32F411<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M4 (32-bit)<\/td>\n<td align=\"left\">100 MHz<\/td>\n<td align=\"center\">318.39<\/td>\n<td align=\"center\">284.30<\/td>\n<td align=\"center\">356.52<\/td>\n<td align=\"center\"><strong>151.90<\/strong><\/td>\n<td align=\"center\">1,737.21<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>RP2040<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M0+ (32-bit)<\/td>\n<td align=\"left\">133 MHz<\/td>\n<td align=\"center\"><strong>228.24<\/strong><\/td>\n<td align=\"center\">228.37<\/td>\n<td align=\"center\">472.07<\/td>\n<td align=\"center\">939.43<\/td>\n<td align=\"center\">1,672.06<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32<\/strong><\/td>\n<td align=\"left\">Tensilica Xtensa LX6 (32-bit)<\/td>\n<td align=\"left\">240 MHz<\/td>\n<td align=\"center\">255.05<\/td>\n<td align=\"center\">250.49<\/td>\n<td align=\"center\">398.47<\/td>\n<td align=\"center\"><strong>75.14<\/strong><\/td>\n<td align=\"center\">756.14<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32-S3<\/strong><\/td>\n<td align=\"left\">Tensilica Xtensa LX7 (32-bit)<\/td>\n<td align=\"left\">240 MHz<\/td>\n<td align=\"center\">199.44<\/td>\n<td align=\"center\">190.14<\/td>\n<td align=\"center\">361.17<\/td>\n<td align=\"center\"><strong>62.62<\/strong><\/td>\n<td align=\"center\">702.66<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32H7<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M7 (32-bit)<\/td>\n<td align=\"left\">480 MHz<\/td>\n<td align=\"center\">44.76<\/td>\n<td align=\"center\">36.85<\/td>\n<td align=\"center\">45.81<\/td>\n<td align=\"center\"><strong>23.36<\/strong><\/td>\n<td align=\"center\">238.10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"fft-throughput-higher-is-better\">FFT Throughput (higher is better)<\/h3>\n<p>Values represent total <strong>FFT operations computed per second<\/strong> (FFT\/s).<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Microcontroller<\/th>\n<th align=\"center\">int8_t<\/th>\n<th align=\"center\">int16_t<\/th>\n<th align=\"center\">int32_t<\/th>\n<th align=\"center\">float<\/th>\n<th align=\"center\">double<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>Arduino Nano<\/strong><\/td>\n<td align=\"center\"><strong>241<\/strong><\/td>\n<td align=\"center\">102<\/td>\n<td align=\"center\">34<\/td>\n<td align=\"center\">58<\/td>\n<td align=\"center\"><em>N\/A<\/em><\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>UNO R4<\/strong><\/td>\n<td align=\"center\">1,364<\/td>\n<td align=\"center\">1,497<\/td>\n<td align=\"center\">902<\/td>\n<td align=\"center\"><strong>2,771<\/strong><\/td>\n<td align=\"center\">247<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32F411<\/strong><\/td>\n<td align=\"center\">3,141<\/td>\n<td align=\"center\">3,517<\/td>\n<td align=\"center\">2,805<\/td>\n<td align=\"center\"><strong>6,583<\/strong><\/td>\n<td align=\"center\">576<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>RP2040<\/strong><\/td>\n<td align=\"center\"><strong>4,381<\/strong><\/td>\n<td align=\"center\">4,379<\/td>\n<td align=\"center\">2,118<\/td>\n<td align=\"center\">1,064<\/td>\n<td align=\"center\">598<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32<\/strong><\/td>\n<td align=\"center\">3,921<\/td>\n<td align=\"center\">3,992<\/td>\n<td align=\"center\">2,510<\/td>\n<td align=\"center\"><strong>13,308<\/strong><\/td>\n<td align=\"center\">1,323<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32-S3<\/strong><\/td>\n<td align=\"center\">5,014<\/td>\n<td align=\"center\">5,259<\/td>\n<td align=\"center\">2,769<\/td>\n<td align=\"center\"><strong>15,971<\/strong><\/td>\n<td align=\"center\">1,423<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32H7<\/strong><\/td>\n<td align=\"center\">22,341<\/td>\n<td align=\"center\">27,141<\/td>\n<td align=\"center\">21,827<\/td>\n<td align=\"center\"><strong>42,808<\/strong><\/td>\n<td align=\"center\">4,200<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"4-ifft-master-comparison-tables\">IFFT Master Comparison Tables<\/h2>\n<h3 id=\"ifft-calculation-latency-lower-is-better\">IFFT Calculation Latency (lower is better)<\/h3>\n<p>Values are in microseconds (\u00b5s) per single N=64 Inverse FFT calculation.<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Microcontroller<\/th>\n<th align=\"left\">Core Architecture<\/th>\n<th align=\"left\">Clock Speed<\/th>\n<th align=\"center\">int8_t<\/th>\n<th align=\"center\">int16_t<\/th>\n<th align=\"center\">int32_t<\/th>\n<th align=\"center\">float (32-bit)<\/th>\n<th align=\"center\">double (64-bit)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>Arduino Nano<\/strong><\/td>\n<td align=\"left\">AVR ATMega328P (8-bit)<\/td>\n<td align=\"left\">16 MHz<\/td>\n<td align=\"center\"><strong>4,033.66<\/strong><\/td>\n<td align=\"center\">9,302.30<\/td>\n<td align=\"center\">26,380.36<\/td>\n<td align=\"center\">18,900.00<\/td>\n<td align=\"center\"><em>N\/A<\/em><\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>UNO R4<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M4 (32-bit)<\/td>\n<td align=\"left\">48 MHz<\/td>\n<td align=\"center\">741.59<\/td>\n<td align=\"center\">652.91<\/td>\n<td align=\"center\">1,084.73<\/td>\n<td align=\"center\"><strong>384.70<\/strong><\/td>\n<td align=\"center\">4,415.17<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32F411<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M4 (32-bit)<\/td>\n<td align=\"left\">100 MHz<\/td>\n<td align=\"center\">312.65<\/td>\n<td align=\"center\">280.38<\/td>\n<td align=\"center\">336.16<\/td>\n<td align=\"center\"><strong>163.91<\/strong><\/td>\n<td align=\"center\">1,878.80<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>RP2040<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M0+ (32-bit)<\/td>\n<td align=\"left\">133 MHz<\/td>\n<td align=\"center\"><strong>219.27<\/strong><\/td>\n<td align=\"center\">224.29<\/td>\n<td align=\"center\">464.54<\/td>\n<td align=\"center\">967.96<\/td>\n<td align=\"center\">1,808.77<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32<\/strong><\/td>\n<td align=\"left\">Tensilica Xtensa LX6 (32-bit)<\/td>\n<td align=\"left\">240 MHz<\/td>\n<td align=\"center\">170.51<\/td>\n<td align=\"center\">161.18<\/td>\n<td align=\"center\">195.37<\/td>\n<td align=\"center\"><strong>83.29<\/strong><\/td>\n<td align=\"center\">830.59<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32-S3<\/strong><\/td>\n<td align=\"left\">Tensilica Xtensa LX7 (32-bit)<\/td>\n<td align=\"left\">240 MHz<\/td>\n<td align=\"center\">122.90<\/td>\n<td align=\"center\">107.96<\/td>\n<td align=\"center\">153.10<\/td>\n<td align=\"center\"><strong>69.11<\/strong><\/td>\n<td align=\"center\">776.86<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32H7<\/strong><\/td>\n<td align=\"left\">ARM Cortex-M7 (32-bit)<\/td>\n<td align=\"left\">480 MHz<\/td>\n<td align=\"center\">43.65<\/td>\n<td align=\"center\">36.79<\/td>\n<td align=\"center\">39.06<\/td>\n<td align=\"center\"><strong>24.32<\/strong><\/td>\n<td align=\"center\">258.70<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"ifft-throughput-higher-is-better\">IFFT Throughput (higher is better)<\/h3>\n<p>Values represent total <strong>IFFT operations computed per second<\/strong> (IFFT\/s), derived directly from the latencies above (1,000,000 \/ latency).<\/p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Microcontroller<\/th>\n<th align=\"center\">int8_t<\/th>\n<th align=\"center\">int16_t<\/th>\n<th align=\"center\">int32_t<\/th>\n<th align=\"center\">float<\/th>\n<th align=\"center\">double<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"left\"><strong>Arduino Nano<\/strong><\/td>\n<td align=\"center\"><strong>247<\/strong><\/td>\n<td align=\"center\">107<\/td>\n<td align=\"center\">37<\/td>\n<td align=\"center\">52<\/td>\n<td align=\"center\"><em>N\/A<\/em><\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>UNO R4<\/strong><\/td>\n<td align=\"center\">1,348<\/td>\n<td align=\"center\">1,531<\/td>\n<td align=\"center\">921<\/td>\n<td align=\"center\"><strong>2,599<\/strong><\/td>\n<td align=\"center\">226<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32F411<\/strong><\/td>\n<td align=\"center\">3,198<\/td>\n<td align=\"center\">3,566<\/td>\n<td align=\"center\">2,974<\/td>\n<td align=\"center\"><strong>6,100<\/strong><\/td>\n<td align=\"center\">532<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>RP2040<\/strong><\/td>\n<td align=\"center\"><strong>4,560<\/strong><\/td>\n<td align=\"center\">4,458<\/td>\n<td align=\"center\">2,152<\/td>\n<td align=\"center\">1,033<\/td>\n<td align=\"center\">552<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32<\/strong><\/td>\n<td align=\"center\">5,864<\/td>\n<td align=\"center\">6,204<\/td>\n<td align=\"center\">5,118<\/td>\n<td align=\"center\"><strong>12,006<\/strong><\/td>\n<td align=\"center\">1,203<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>ESP32-S3<\/strong><\/td>\n<td align=\"center\">8,137<\/td>\n<td align=\"center\">9,263<\/td>\n<td align=\"center\">6,532<\/td>\n<td align=\"center\"><strong>14,470<\/strong><\/td>\n<td align=\"center\">1,287<\/td>\n<\/tr>\n<tr>\n<td align=\"left\"><strong>STM32H7<\/strong><\/td>\n<td align=\"center\">22,910<\/td>\n<td align=\"center\">27,181<\/td>\n<td align=\"center\">25,601<\/td>\n<td align=\"center\"><strong>41,118<\/strong><\/td>\n<td align=\"center\">3,865<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"5-dedicated-device-analysis\">Device-by-Device Analysis<\/h2>\n<h3 id=\"arduino-nano-avr-atmega328p-16-mhz\">\ud83d\udd34 Arduino Nano (AVR ATMega328P @ 16 MHz)<\/h3>\n<p>The legacy 8-bit architecture struggles immensely with DSP workloads.<\/p>\n<ul>\n<li><strong>Why it&#8217;s slow:<\/strong> It has no FPU and no hardware multiplier for larger integers \u2014 every 32-bit multiplication must be emulated in software with dozens of assembly instructions.<\/li>\n<li><strong>Data-type anomaly:<\/strong> Curiously, <code>float<\/code> (17,165 \u00b5s) is actually <em>faster<\/em> than <code>int32_t<\/code> (29,160 \u00b5s). The 32-bit float library benefits from 24-bit mantissa optimizations, while full 32-bit integer multiplication and scaling on an 8-bit core requires extensive software-based register shuffling.<\/li>\n<li><strong>Practical verdict:<\/strong> Stick to <code>int8_t<\/code> \u2014 or better yet, stick to a different chip for anything beyond toy FFT sizes.<\/li>\n<\/ul>\n<h3 id=\"uno-r4-renesas-ra4m1-cortex-m4-48-mhz\">\ud83d\udd35 UNO R4 (Renesas RA4M1 Cortex-M4 @ 48 MHz)<\/h3>\n<p>A major modernization of the classic Arduino form factor.<\/p>\n<ul>\n<li><strong>FPU power:<\/strong> The Cortex-M4&#8217;s single-precision FPU makes <code>float<\/code> math remarkably quick (360.89 \u00b5s) \u2014 nearly <strong>11\u00d7 faster<\/strong> than its software-emulated <code>double<\/code> math (4,045.90 \u00b5s).<\/li>\n<li>Its modest 48 MHz clock keeps it behind the other 32-bit boards, but for an entry-level Arduino it is a huge step up from the Nano.<\/li>\n<\/ul>\n<h3 id=\"rp2040-cortex-m0-133-mhz\">\ud83d\udfe3 RP2040 (Cortex-M0+ @ 133 MHz)<\/h3>\n<p>The Raspberry Pi silicon lacks a hardware FPU but offers remarkably fast integer execution.<\/p>\n<ul>\n<li><strong>Integer strength:<\/strong> It beats the STM32F411 at <code>int8_t<\/code> and <code>int16_t<\/code> processing, helped by its higher clock speed (133 MHz vs. 100 MHz).<\/li>\n<li><strong>Smart floating-point ROM:<\/strong> Without an FPU, the RP2040 falls back on optimized floating-point routines burned directly into its boot ROM. This keeps its software <code>float<\/code> (939 \u00b5s) and <code>double<\/code> (1,672 \u00b5s) performance respectable \u2014 though still far behind hardware-accelerated chips.<\/li>\n<li><strong>Practical verdict:<\/strong> This is the one modern board where an <em>integer<\/em> FFT is clearly the right choice.<\/li>\n<\/ul>\n<h3 id=\"stm32f411-cortex-m4-100-mhz\">\ud83d\udfe2 STM32F411 (Cortex-M4 @ 100 MHz)<\/h3>\n<p>A well-balanced DSP workhorse.<\/p>\n<ul>\n<li>Equipped with ARM&#8217;s DSP instruction extensions and a single-precision FPU, it shows exceptionally uniform integer scaling and rapid <code>float<\/code> speeds (151.90 \u00b5s) \u2014 roughly 6,500 FFTs per second.<\/li>\n<\/ul>\n<h3 id=\"esp32-xtensa-lx6-240-mhz\">\ud83d\udfe0 ESP32 (Xtensa LX6 @ 240 MHz)<\/h3>\n<p>A long-time favorite for consumer audio projects \u2014 and the benchmark shows why.<\/p>\n<ul>\n<li><strong>Single-precision optimization:<\/strong> Thanks to its high 240 MHz clock and an efficient single-precision pipeline, its <code>float<\/code> FFT is blazingly fast at <strong>75.14 \u00b5s<\/strong> (over 13,300 FFTs per second) \u2014 beating everything below the STM32H7 by a wide margin.<\/li>\n<li><strong>The IFFT speedup:<\/strong> Interestingly, the ESP32 computes integer IFFTs significantly faster than forward FFTs (e.g., the <code>int32_t<\/code> IFFT takes <strong>195.37 \u00b5s<\/strong> vs. <strong>398.47 \u00b5s<\/strong> for the FFT), suggesting highly efficient compiler code paths for the backward-scaling butterfly passes of the inverse algorithm.<\/li>\n<\/ul>\n<h3 id=\"esp32-s3-xtensa-lx7-240-mhz\">\u26a1 ESP32-S3 (Xtensa LX7 @ 240 MHz)<\/h3>\n<p>The measurements highlight the real-world benefits of the upgraded LX7 core.<\/p>\n<ul>\n<li><strong>Upgraded instruction set:<\/strong> The S3 features <strong>PIE (Processor Instruction Extensions)<\/strong>, adding hardware-level vector processing capability.<\/li>\n<li><strong>The float champ (below 480 MHz):<\/strong> At <strong>62.62 \u00b5s<\/strong> per floating-point FFT \u2014 nearly <strong>16,000 computations per second<\/strong> \u2014 the ESP32-S3 is a formidable chip for real-time edge audio processing, DSP filtering, and spectrum analysis.<\/li>\n<li><strong>Integer IFFT beast:<\/strong> It processes the <code>int16_t<\/code> IFFT in just <strong>107.96 \u00b5s<\/strong>, an outstanding <strong>9,263 IFFTs per second<\/strong>.<\/li>\n<\/ul>\n<h3 id=\"stm32h7-cortex-m7-480-mhz\">\ud83d\udc51 STM32H7 (Cortex-M7 @ 480 MHz)<\/h3>\n<p>The undisputed performance benchmark of this lineup.<\/p>\n<ul>\n<li><strong>Hardware double precision:<\/strong> As the only chip tested with a double-precision hardware FPU, it computes <code>double<\/code> FFTs (238.10 \u00b5s) faster than the Arduino Nano or RP2040 can handle simple <code>int8_t<\/code> math!<\/li>\n<li><strong>Blazing clock:<\/strong> Its 480 MHz superscalar, L1-cached pipeline cranks out <strong>42,808 float FFTs every second<\/strong>.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"6-conclusions\">Conclusions<\/h2>\n<ul>\n<li><strong>If you need FFTs, choose a microcontroller with an FPU.<\/strong> On every FPU-equipped board tested, single-precision <code>float<\/code> was the fastest data type \u2014 often by a wide margin \u2014 while also being the easiest to work with (no scaling or overflow management).<\/li>\n<li><strong>Integer FFTs only make sense on FPU-less chips<\/strong> such as the RP2040 or the old AVR boards, where <code>int8_t<\/code>\/<code>int16_t<\/code> processing is 3\u20134\u00d7 faster than software floats.<\/li>\n<li><strong>Avoid <code>double<\/code> on Microcontrollers: <\/strong>.floats are at least 10 times faster<\/li>\n<li><strong>Best value for real-time audio:<\/strong> The ESP32-S3 delivers nearly 16,000 float FFTs per second at a fraction of the cost of an STM32H7 board \u2014 plus built-in Wi-Fi and Bluetooth.<\/li>\n<\/ul>\n<p>The full source code, benchmark sketches, and raw results are available in the <a href=\"https:\/\/github.com\/pschatzmann\/fixedpoint-fft\">fixedpoint-fft repository<\/a> on GitHub.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Fast Fourier Transform (FFT) is an efficient algorithm for computing the Discrete Fourier Transform (DFT): it converts a signal from the time domain into the frequency domain, revealing which frequencies are present in a signal and how strong they are. It is the workhorse behind spectrum analyzers, audio effects, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4614,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"footnotes":""},"categories":[20],"tags":[39],"class_list":["post-7061","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","tag-fft"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Microcontroller FFT &amp; IFFT Performance Benchmark (N=64) - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Microcontroller FFT &amp; IFFT Performance Benchmark (N=64) - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"The Fast Fourier Transform (FFT) is an efficient algorithm for computing the Discrete Fourier Transform (DFT): it converts a signal from the time domain into the frequency domain, revealing which frequencies are present in a signal and how strong they are. It is the workhorse behind spectrum analyzers, audio effects, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-17T10:38:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-17T11:57:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/FFT-Time-Frequency-View-540.png\" \/>\n\t<meta property=\"og:image:width\" content=\"540\" \/>\n\t<meta property=\"og:image:height\" content=\"378\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Microcontroller FFT &#038; IFFT Performance Benchmark (N=64)\",\"datePublished\":\"2026-07-17T10:38:26+00:00\",\"dateModified\":\"2026-07-17T11:57:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/\"},\"wordCount\":1212,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/FFT-Time-Frequency-View-540.png\",\"keywords\":[\"FFT\"],\"articleSection\":[\"Arduino\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/\",\"name\":\"Microcontroller FFT & IFFT Performance Benchmark (N=64) - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/FFT-Time-Frequency-View-540.png\",\"datePublished\":\"2026-07-17T10:38:26+00:00\",\"dateModified\":\"2026-07-17T11:57:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/FFT-Time-Frequency-View-540.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/FFT-Time-Frequency-View-540.png\",\"width\":540,\"height\":378},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/07\\\/17\\\/microcontroller-fft-ifft-performance-benchmark-n64\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Microcontroller FFT &#038; IFFT Performance Benchmark (N=64)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Microcontroller FFT & IFFT Performance Benchmark (N=64) - Phil Schatzmann","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/","og_locale":"en_US","og_type":"article","og_title":"Microcontroller FFT & IFFT Performance Benchmark (N=64) - Phil Schatzmann","og_description":"The Fast Fourier Transform (FFT) is an efficient algorithm for computing the Discrete Fourier Transform (DFT): it converts a signal from the time domain into the frequency domain, revealing which frequencies are present in a signal and how strong they are. It is the workhorse behind spectrum analyzers, audio effects, [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/","og_site_name":"Phil Schatzmann","article_published_time":"2026-07-17T10:38:26+00:00","article_modified_time":"2026-07-17T11:57:18+00:00","og_image":[{"width":540,"height":378,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/FFT-Time-Frequency-View-540.png","type":"image\/png"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Microcontroller FFT &#038; IFFT Performance Benchmark (N=64)","datePublished":"2026-07-17T10:38:26+00:00","dateModified":"2026-07-17T11:57:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/"},"wordCount":1212,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/FFT-Time-Frequency-View-540.png","keywords":["FFT"],"articleSection":["Arduino"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/","url":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/","name":"Microcontroller FFT & IFFT Performance Benchmark (N=64) - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/FFT-Time-Frequency-View-540.png","datePublished":"2026-07-17T10:38:26+00:00","dateModified":"2026-07-17T11:57:18+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/FFT-Time-Frequency-View-540.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/04\/FFT-Time-Frequency-View-540.png","width":540,"height":378},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/07\/17\/microcontroller-fft-ifft-performance-benchmark-n64\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Microcontroller FFT &#038; IFFT Performance Benchmark (N=64)"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/7061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=7061"}],"version-history":[{"count":13,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/7061\/revisions"}],"predecessor-version":[{"id":7074,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/7061\/revisions\/7074"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/4614"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=7061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=7061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=7061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}