
Controller PCB
h2dakhil/FFT-Audio-Spectrum-Analyzer
Real-time audio-reactive LED matrix powered by an ESP32, featuring custom PCB design, I2S microphone input, and dynamic visual effects through FFT signal processing.

Real-time audio-reactive LED matrix powered by an ESP32, featuring custom PCB design, I2S microphone input, and dynamic visual effects through FFT signal processing.
LED Matrix is an open-source printed circuit board by h2dakhil, from the h2dakhil/FFT-Audio-Spectrum-Analyzer repository on GitHub. It is a 4-layer board of 160 × 90 mm with 141 parts on 131 nets, routed with 815 tracks and 262 vias.
Its parts include 128 diodes, 5 capacitors and 1 connector. It belongs with the lEDs and displays and audio and music boards of this library.
A real-time audio spectrum analyzer built from the ground up — dual custom PCBs, embedded DSP firmware on an ESP32-S3, and a complete software pipeline validated on Raspberry Pi before committing to silicon.
This device listens to ambient audio, performs real-time FFT-based frequency analysis on an ESP32-S3, and renders a live spectrum visualization on a custom-designed 8×16 WS2812B RGB LED matrix. Three physical buttons allow standalone control of display mode, brightness, and visual theme — no PC, no monitor, no SSH required after initial flash.
Key design goals:
┌──────────────────────────────────────────────────────────────────┐
│ CONTROLLER BOARD (2-layer) │
│ │
│ USB-C ──► 5V Rail ──► Buck Converter ──► 3V3 Rail │
│ │ │
│ ESP32-S3-WROOM-1-N8 │
│ (dual-core Xtensa LX7, 240 MHz) │
│ │ │
│ ICS-43434 MEMS Mic ──► I2S ──┤ │
│ (24-bit, 64 dBA SNR) │ │
│ │ │
│ Button ×3 ──────────► GPIO ──┤ │
│ (color theme / gain / viz mode) │ │
│ │ │
│ Native USB (D+/D−) ──────────┤ (flash + debug, no UART chip) │
│ │ │
│ GPIO1 ──► 330 Ω ──► JST-3 Header │
└────────────────────────────────────────────────────────────────┬─┘
│ 3-wire JST
▼
┌──────────────────────────────────────────────────────────────────┐
│ LED MATRIX BOARD (4-layer) │
│ │
│ JST Header ──► DIN ──► WS2812B 8×16 Matrix (128 LEDs) │Before committing to any PCB design, the complete audio-to-visuals pipeline was validated on a Raspberry Pi 4 using a USB microphone and an off-the-shelf WS2812B 8×32 matrix. This approach de-risked the DSP algorithm, the band-mapping logic, and the LED driving code as three independent concerns — completely decoupled from hardware design.
Software stack:
pyaudio for mic capturenumpy.fft for FFT computationpygame for real-time visualization on HDMI monitor (development aid)rpi_ws281x for WS2812B LED matrix outputValidation milestones, achieved in sequence:
Only after every milestone was confirmed working end-to-end was the custom PCB designed and sent to fab.
The ICS-43434 MEMS microphone measures air pressure variations over time and digitizes them into a 24-bit I2S stream. This is a time-domain signal — a series of amplitude samples encoding when pressure changes occur. The microphone itself detects neither bass nor treble. Frequency extraction is entirely performed by the FFT in firmware.
The Fast Fourier Transform (FFT) is an O(N log N) algorithm for computing the Discrete Fourier Transform (DFT):
X[k] = Σ (n=0 to N-1) x[n] · e^(−j2πkn/N)Where:
x[n] = time-domain audio samples from the I2S DMA bufferX[k] = complex-valued frequency-domain coefficient at bin kN = FFT window size — 2048 samples in this firmware (2× the per-chunk capture, so each FFT frame overlaps the previous one by 50%)k = bin index corresponding to physical frequency f = k · Fs / NAt Fs = 44.1 kHz, N = 2048 the bin spacing is Fs/N ≈ 21.5 Hz — fine enough to resolve kick-drum fundamentals around 40–60 Hz. Only the first N/2 bins are meaningful (Nyquist limit); the upper half is a conjugate mirror.
The implementation uses the ESP-DSP radix-2 single-precision routine dsps_fft2r_fc32 followed by dsps_bit_rev_fc32 — 2048 is 2^11 (not a power of 4), so radix-4 was not an option.
MEMS microphones output samples with a DC bias that, if left untouched, would dump a huge spike into bin 0 and leak into its low-frequency neighbours. The firmware subtracts the per-window mean before applying a 2048-point Hanning window:
w[n] = 0.5 · (1 − cos(2π · n / (N − 1)))Hanning suppresses spectral leakage from signal segments that aren't periodic in the window, at the cost of a known coherent-gain factor of 0.5 that is compensated for in the dBFS calibration below.
Every band level is expressed in dBFS — decibels relative to digital full scale — so the visualizer's dynamic range is deterministic regardless of input volume. With INMP441 24-bit samples right-shifted into int16 scale (INT16_FULL = 32768), a full-scale sine concentrated in a single bin produces:
|X[k]|_raw = (N / 2) · 0.5 · INT16_FULL = N · INT16_FULL / 4
└─FFT scale─┘ └Hanning gain┘Dividing each bin's magnitude by N · INT16_FULL / 4 therefore makes a full-scale single-bin tone read exactly 1.0 (= 0 dBFS) — a fixed reference that anchors every threshold downstream.
24 bands are log-spaced from 30 Hz to 16 kHz so bass, mids, and treble each get roughly equal visual real estate, matching perceived pitch:
band_edge[i] = f_min · (f_max / f_min)^(i / N_bands)Within each band the firmware sums power (|X[k]|²) across every FFT bin whose centre falls in [lo, hi), then takes a square root. This is energy-correct aggregation, the way professional RTAs do it: a full-scale tone in any single bin still reads 0 dBFS regardless of whether it lands in a narrow or wide band, while broadband content correctly accumulates the energy of all its bins instead of being washed out by averaging. For bands narrower than the bin spacing (which happens at the very bottom of the range — 21.5 Hz between bins), the firmware falls back to the bin nearest the band's geometric centre so the bar still registers.
The final per-band level is converted to dBFS with 20 · log10(magnitude), clamped from below to avoid log10(0).
A 24-element EQ curve in dB is added to each band's dBFS value to compensate for microphone frequency response — a mild bass lift to offset MEMS low-frequency roll-off, a mild presence lift in the upper mids. EQ in the log domain is mathematically clean: multiplicative gain becomes simple addition.
Final mapping clamps each band into the visual dynamic range:
display = clip( (bands_db + eq_db − DB_FLOOR) / (DB_CEIL − DB_FLOOR), 0, 1 )With DB_CEIL = −18 dBFS (bar saturates) and DB_FLOOR = −45 dBFS (squelch — below this the bar reads zero). DB_FLOOR sits a few dB above typical mic self-noise so ambient room tone never flickers the bars at rest.
A coarse pre-FFT silence gate runs in parallel — if the raw int16 peak of the latest chunk is below SILENCE_PEAK_INT16 = 1500 (≈ −27 dBFS) the entire frame is treated as silence and skips the FFT entirely.
Each band drives two animated quantities every frame:
bar_height -= BAR_FALL_RATE // 0.04 / frame, linear fall
bar_height = max(bar_height, current)
peak_mark -= PEAK_FALL_RATE // 0.015 / frame, slower
peak_mark = max(peak_mark, current)Both snap instantly upward whenever a band exceeds the current value. The bar falls fast enough to track musical dynamics; the peak marker — rendered as a dim white dot above the bar — falls slowly enough to leave a visible peak-hold trace. This is the same scheme used on the Raspberry Pi proof-of-concept, ported byte-for-byte.
Hand-solderable 2-layer board hosting the ESP32-S3 module, MEMS microphone, power regulation, USB-C input, and user buttons.
Stackup: Standard 2-layer FR4, 1 oz copper.
| Property | Value |
|---|---|
| Core | Dual Xtensa LX7 |
| Max clock | 240 MHz |
| Flash | 8 MB (N8 variant) |
| USB | Native Full Speed (12 Mbps), integrated PHY |
| Wireless | Wi-Fi 4, Bluetooth 5 LE |
| Form factor | Module, castellated edge pads |
Selection rationale:
Supporting circuitry follows Espressif's official ESP32-S3 Hardware Design Guidelines:
| Pin | Function | Implementation |
|---|---|---|
| EN (CHIP_PU) | Chip enable / hard reset | 10 kΩ pull-up to 3V3; 1 µF RC delay cap to GND per Espressif design guide; pushbutton to GND for manual reset |
| GPIO0 | Boot mode strapping | 10 kΩ pull-up to 3V3 (default HIGH = normal boot); pushbutton to GND to enter download mode |
| D+/D− | Native USB differential pair | 33 Ω series resistors placed close to MCU pins; traces matched in length, ~5 mm spacing, routed away from switching nodes and clocks |
| GPIO1 | WS2812B data out | 330 Ω series resistor (detail below) |
A fully integrated I2S MEMS microphone combining the MEMS transducer, analog signal conditioning, ADC, decimation filter, anti-aliasing filter, and power management internally.
| Parameter | Value |
|---|---|
| Supply voltage | 1.65 V – 3.63 V |
| Interface | I2S, 24-bit |
| SNR | 64 dBA |
| Operating current | ~490 µA (high-performance mode) |
| Package | Bottom-terminated LGA (hot air required for assembly) |
No external ADC or audio codec is needed. All analog signal conditioning is internal, significantly simplifying the schematic and eliminating noise concerns around an external analog frontend.
Supply filtering: The buck converter on the same board switches at 500 kHz, injecting noise onto the 3.3 V rail. A 10 Ω / 10 µF RC low-pass filter on the ICS-43434 VDD pin attenuates this before it can corrupt the microphone's internal analog circuitry:
f_c = 1 / (2π × R × C)
= 1 / (2π × 10 × 10×10⁻⁶)
≈ 1,592 Hz
Attenuation at 500 kHz switching frequency:
f / f_c = 500,000 / 1,592 ≈ 314
A = 1 / √(1 + 314²) ≈ 1/314 ≈ −50 dB−50 dB attenuation at the switching frequency exceeds the accepted −40 dB threshold for sensitive mixed-signal supply filtering. The resistive voltage drop at 490 µA is 4.9 mV — well within the 1.65 V minimum supply margin.
SD pin: Pulled to GND through a 100 kΩ resistor to ensure the output line decays to a defined low state during the tristate period.
A 330 Ω series resistor is placed between GPIO1 and the first WS2812B DIN, as close to the MCU pin as practical. Purpose:
I_transient ≈ V / R = 3.3 V / 330 Ω ≈ 10 mA (instantaneous worst case)t_rise ≈ 2.2 × R × C = 2.2 × 330 × 10×10⁻¹² ≈ 7.3 ns7.3 ns is well within the WS2812B's 200 ns minimum pulse width specification — the resistor damps ringing without distorting signal timing.
Logic level shifting: No level shifter IC is used. The WS2812B HIGH threshold is >0.7 × VDD = 3.5 V at 5 V supply, which is marginally above the ESP32-S3's 3.3 V GPIO output. This was validated experimentally during the Raspberry Pi proof-of-concept (the Pi's GPIO is also 3.3 V) before being carried forward to the PCB. At the trace lengths involved, 3.3 V logic drives the WS2812B reliably, eliminating a component from the BOM.
Three 12 mm × 12 mm SMD tactile pushbuttons, each mapped to a distinct runtime function:
| Button | Function | Firmware Behaviour |
|---|---|---|
| B1 — Color Theme | Cycles through preset color palettes | Steps an index through a palette table stored in flash (e.g. spectrum rainbow, monochrome green, fire gradient, cool blue) |
| B2 — Input Gain | Increases microphone input gain in discrete steps, wrapping back to minimum | Scales the FFT magnitude output by a fixed multiplier before log conversion — effectively sets the display sensitivity for quiet or loud environments |
| B3 — Visualization Mode | Cycles through visualization styles | Toggles between: (1) standard bar spectrum, (2) peak-hold bars where peaks decay slowly under gravity, (3) mirror mode where bars grow outward from the vertical center of the matrix |
Internal ESP32-S3 pull-up resistors are enabled in firmware. A timer-based software debounce (~20 ms lockout window) eliminates contact bounce without external RC networks.
A custom 4-layer PCB housing 128 WS2812B RGB LEDs in an 8-row × 16-column grid. Designed from scratch rather than using an off-the-shelf panel, allowing exact physical dimensions, LED pitch, and layer stackup to be optimized for this enclosure.
Why 4 layers:
A dedicated ground plane on layer 2 provides a low-impedance return path for WS2812B switching currents, which can be large and fast (each LED draws up to 60 mA and switches on the 800 kHz data clock). The ground plane also reduces EMI from the LED data lines running across the board.
Decoupling strategy:
Connector: 3-position JST-PH SMD header (5V, GND, Data) on each board, connected via a short cable to the controller board.
The device is powered from a standard USB-C 5 V supply. Per the USB-C specification, a UFP (device) must place 5.1 kΩ pull-down resistors on both CC1 and CC2 to signal its presence and request 5 V/900 mA from a host or charger. SBU1/SBU2 are left unconnected (only required for alternate modes such as DisplayPort). D+/D− are routed to the ESP32-S3 native USB PHY for flashing and debug.
The 5 V rail feeds the WS2812B matrix directly. LEDs are the dominant current consumer and are rated for 5 V operation.
The 3.3 V rail (ESP32-S3, MEMS mic, logic) is stepped down from 5 V via a synchronous buck converter.
Why not an LDO — thermal analysis:
An LDO dissipates (V_in − V_out) × I_load as heat. At the ESP32-S3 peak current draw of 350 mA:
P_LDO = (5.0 − 3.3) V × 0.350 A = 595 mWAt a typical θ_JA of ~40 °C/W for a small SMD package, this raises junction temperature ~24 °C above ambient under sustained load with no heatsinking — unacceptable thermal stress for a hobby PCB.
A buck converter at ~88% efficiency dissipates:
P_out = 3.3 V × 0.350 A = 1.155 W
P_dissipated = P_out × (1/η − 1) = 1.155 × (1/0.88 − 1) ≈ 158 mWLess than 27% of the LDO's dissipation. The buck converter was the clear choice.
| Rail | Consumer | Typical | Peak |
|---|---|---|---|
| 5 V | WS2812B 8×16 (128 LEDs) | ~1.5 A | ~3.8 A (all-white full brightness) |
| 3.3 V | ESP32-S3-WROOM-1 | ~100 mA | ~350 mA |
| 3.3 V | ICS-43434 MEMS mic | 0.49 mA | 0.49 mA |
| 5 V total | ~1.6 A | ~4.2 A |
The design targets a 5 V / 5 A USB-C adapter. System peak current sits below the 5 A ceiling with margin.
Following Espressif hardware design guidelines for the ESP32-S3:
| Capacitor | Value | Dielectric | Voltage Rating | Package |
|---|---|---|---|---|
| Bulk | 22 µF | X7R | 25 V | 1210 |
| Mid-frequency | 1 µF | X7R | 25 V | 0603 |
| High-frequency bypass | 100 nF | X7R | 50 V | 0603 |
X7R dielectric was specified throughout for stable capacitance over temperature and DC bias (±15% over −55 to +125 °C). Y5V/Z5U alternatives can lose >50% capacitance under DC bias and were explicitly avoided.
ESD protection: A PESD3V3S1UB unidirectional TVS diode is placed at the 3.3 V rail entry per Espressif's recommendation.
| Constraint | Decision | Rationale |
|---|---|---|
| Hand-solderability | ESP32-S3-WROOM-1 module over bare SoC | Bare QFN56 requires reflow; castellated module is iron-solderable |
| Hand-solderability | MEMS mic requires hot air gun | All I2S MEMS microphones with adequate SNR use bottom-terminated packages — no through-hole alternative at this performance level |
| Thermal | Buck converter over LDO | LDO dissipates 595 mW at peak; buck dissipates ~158 mW |
| Signal integrity | 330 Ω series on WS2812B data line | Damps ringing; 7.3 ns rise time is well within 200 ns WS2812B spec |
| Supply noise | 10 Ω / 10 µF RC on microphone VDD | −50 dB attenuation at 500 kHz switching frequency |
| USB implementation | Native ESP32-S3 USB PHY | Eliminates external UART bridge IC, reduces BOM cost and board complexity |
| GPIO variant | N8 over R8/R16V | Preserves IO35–IO37 as general GPIO |
| LED matrix | Custom 4-layer PCB over off-the-shelf panel | Exact dimensions, pitch, dedicated ground plane for LED switching currents |
| Logic level shifting | No shifter IC | 3.3 V GPIO validated against WS2812B at relevant trace lengths during Pi phase |
1. FFT output was visually noisy and impossible to read
Raw FFT magnitudes mapped linearly to LED height produced a constantly saturated, unreadable display. Resolution: applied 20·log10(|X[k]|) per bin for dB scaling, then grouped bins into logarithmically spaced frequency bands. This transformed the visualization into a clean, perceptually balanced spectrum with clear bass, mid, and treble separation.
2. Display flickering between frames
Frame-to-frame FFT variation was fast enough to cause severe LED flickering. Resolution: a peak-as-bar animation with instant attack and linear decay (bar -= BAR_FALL_RATE, snap up on any larger sample), plus a separate slower-decaying peak-hold marker. Decay rates were tuned empirically during the Pi phase to balance smooth fall against visual reactivity, and the same constants were carried over to the ESP32 port.
3. LDO thermal concern on 3.3V rail
Initial design considered an LDO for simplicity. Thermal analysis revealed 595 mW peak dissipation — unacceptable for an SMD package on a hobby board with no thermal management. Buck converter selected; RC filtering on the mic supply mitigates the switching noise introduced.
4. WS2812B logic level margin
The WS2812B HIGH threshold (3.5 V at 5 V supply) exceeds ESP32-S3 GPIO output (3.3 V). Rather than adding a level shifter IC, this was validated experimentally on the Raspberry Pi (also 3.3 V GPIO) before the PCB was designed. Validated reliable at relevant trace lengths — the level shifter was eliminated from the BOM.
5. Buck switching noise on microphone supply
Concern that 500 kHz switching noise would corrupt audio captures. Resolved with a 10 Ω / 10 µF RC low-pass filter on the ICS-43434 VDD pin, providing −50 dB attenuation at the switching frequency — exceeding the −40 dB threshold considered best practice for mixed-signal supplies.
The firmware lives under Firmware/ESP32Firmware/ as a PlatformIO project targeting Arduino-ESP32 v3.x (ESP-IDF 5.x). FFT runs on the bundled ESP-DSP component; the WS2812B chain is driven by FastLED over the ESP32's RMT peripheral. Capture and DSP/render are split across the two cores using FreeRTOS task pinning:
Core 0 ── i2s_capture task Core 1 ── dsp_render task
────────────────────────────────── ───────────────────────────────────────
i2s_std driver (INMP441, MONO, LEFT slot)
44.1 kHz · 32-bit slot · DMA pool 8 × 256
│
│ blocking read of CHUNK_SIZE samples
▼
sample >>= 16 (24-bit → int16, preserves
the int16 dBFS reference)
│
▼
xQueueSend(audioQueue, …, 0) ─────────────────► xQueueReceive(audioQueue, …, portMAX_DELAY)
length 2, drop-oldest on full │
(keeps I2S DMA hard real-time) ▼
silence gate on raw int16 peak
│
▼
dsp_push_chunk
rolling 2048-sample window
shifts left, newest chunk appended
│
▼
dsp_compute_bands
DC removal| File | Responsibility |
|---|---|
src/config.h | All DSP constants (sample rate, FFT size, band count, EQ curve, dBFS range, decay rates), I2S pins, LED layout, FreeRTOS core/priority assignments. Single source of truth for every tunable. |
src/audio_capture.cpp | I2S setup on I2S_NUM_0 via the ESP-IDF 5.x i2s_std driver. Capture task pinned to core 0. Non-blocking xQueueSend with drop-oldest fallback so the I2S DMA never stalls if the DSP side falls behind. |
src/dsp.cpp | Precomputed Hanning window + log-spaced band edges. Rolling 2048-sample buffer. ESP-DSP dsps_fft2r_fc32 (radix-2) + dsps_bit_rev_fc32. RMS-sum power aggregation per band with nearest-bin fallback for bands narrower than the bin spacing. dBFS conversion via the calibration constant N · INT16_FULL / 4. |
src/themes.cpp | Five colour themes × five stops each, linearly interpolated by band index and dimmed by amplitude (bright = 0.4 + 0.6 · amp). Same five palettes as the Pi version. |
src/led_matrix.cpp | FastLED init on LED_DATA_PIN. xy_to_led walks chained 8×8 panels in serpentine layout (even rows L→R, odd rows R→L). Fills rows below the bar height with the column's theme colour; draws a dim white marker at the peak-hold row above. |
src/main.cpp | setup() brings up LEDs / DSP / capture and spawns the DSP+render task on core 1. loop() watches USB serial for 1–5 to switch themes (stand-in for the Pi version's keyboard hotkeys). |
The capture and render tasks share state through a single FreeRTOS queue of AudioChunk items (length 2). The capture side uses non-blocking xQueueSend; on a full queue it discards the oldest pending chunk and re-sends. This keeps I2S DMA running at hard real-time even if the FFT/render side stalls briefly (e.g. during the WS2812B frame flush), at the cost of occasionally dropping a chunk under sustained backpressure — strictly preferable to letting the DMA descriptors overflow.
There is no shared mutable state between cores beyond that queue. The render task owns the rolling 2048-sample buffer, the per-band decay state, and the LED framebuffer; the capture task owns only the I2S DMA and the int16 shift.
All knobs live as constexpr in config.h and are carried over byte-for-byte from the Raspberry Pi proof of concept (visualizer.py):
| Constant | Value | Purpose |
|---|---|---|
SAMPLE_RATE | 44 100 Hz | I2S clock, Nyquist ≈ 22.05 kHz |
CHUNK_SIZE | 1024 samples | Per-DMA-read frame size |
FFT_SIZE | 2048 | Rolling window — 2× chunk so frames overlap 50%; bin spacing ≈ 21.5 Hz |
NUM_BANDS | 24 | Log-spaced display bands (one per matrix column) |
FREQ_MIN / FREQ_MAX | 30 / 16 000 Hz | Display range |
EQ_DB[24] | mild bass + presence lift | Additive per-band EQ in dB |
DB_CEIL / DB_FLOOR | −18 / −45 dBFS | Display dynamic range |
SILENCE_PEAK_INT16 | 1500 | Silence gate (≈ −27 dBFS peak) |
BAR_FALL_RATE | 0.04 / frame | Linear bar decay |
PEAK_FALL_RATE | 0.015 / frame | Slower decay for the peak-hold marker |
cd Firmware/ESP32Firmware
pio run -t upload
pio device monitorThe platform line in platformio.ini points at the pioarduino fork, which ships Arduino-ESP32 v3.x with the ESP-IDF 5.x i2s_std driver and the bundled esp-dsp component — both required by this firmware.
| Component | Part | Key Specification |
|---|---|---|
| MCU module | ESP32-S3-WROOM-1-N8 | Dual LX7 240 MHz, 8 MB flash, native USB |
| Microphone | ICS-43434 | I2S 24-bit, 64 dBA SNR |
| RGB LEDs | WS2812B | 5 V, single-wire addressable, ×128 |
| USB-C connector | USB4085 or equivalent | UFP, CC1/CC2 5.1 kΩ termination |
| ESD protection | PESD3V3S1UB | 3.3 V rail TVS |
| Tactile buttons | 12 mm × 12 mm SMD | ×3 (color theme, input gain, viz mode) |
| JST connector | B3B-PH-SM4-TB | 3-pos SMD, ×2 (one per board) |
| WS2812B series R | 330 Ω 0603 | Data line signal integrity |
| EN pull-up R | 10 kΩ ±1% 0603 100 mW | EN RC delay circuit |
| GPIO0 pull-up R | 10 kΩ 0603 | Boot strapping default HIGH |
| USB D+/D− R | 33 Ω 0603 ×2 | USB differential signal integrity |
| 3V3 bulk cap | 22 µF X7R 25 V 1210 | ESP32-S3 decoupling |
| 3V3 mid cap | 1 µF X7R 25 V 0603 | Decoupling + EN RC |
| 3V3 bypass cap | 100 nF X7R 50 V 0603 | High-frequency bypass |
| Mic supply filter | 10 Ω resistor + 10 µF cap | Buck noise suppression on VDD |
| LED bulk cap | 1000 µF electrolytic | 5 V rail at matrix board entry |
| LED bypass caps | 100 nF ceramic per cluster | WS2812B local transient decoupling |
| Qty | Value | Footprint | References |
|---|---|---|---|
| 128 | ~ | LED_SMD:LED_WS2812B-V6 | D1, D10, D11, D100, D101, D102, D103, D104, D105, D106, D107, D108, D109, D110, D111, D112 +112 |
| 4 | 100nF | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C2, C3, C4, C5 |
| 3 | , , | ||
| 1 | 1000 uF | Capacitor_SMD:CP_Elec_10x10.5 | C1 |
| 1 | B3B-PH-SM4-TBLFSN | Connector_PinHeader_2.54mm:CONN_B3B-PH-SM4-TB_03P_JST | J1 |
The 137 most common of 141 parts.

h2dakhil/FFT-Audio-Spectrum-Analyzer
Real-time audio-reactive LED matrix powered by an ESP32, featuring custom PCB design, I2S microphone input, and dynamic visual effects through FFT signal processing.

loxodes/vna
Under development open hardware microwave vector network analyzer


OpenBCI/Ganglion_Hardware_Design_Files
General repo for Ganglion hardware files

G-Pereira/greenmobi-bms
A VESC compatible battery management system


wayri/SPIKE
PCB-focused multiphysics simulation, from board to complete assembly: PI, SI, circuits, thermal, EM/RF and mechanical workflows, with MCAD collaboration and a roadmap toward large-scale coupled assemblies.

frohro/SDR-TRX
SDR-TRX is an experimental low-cost digital mode ham radio HF transceiver.

It measures 160 × 90 mm and has 4 copper layers, 1.6 mm thick.
141 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the h2dakhil/FFT-Audio-Spectrum-Analyzer repository on GitHub, at the commit this page was made from: the board is Hardware/PCB/LED Display/LED Matrix.kicad_pcb and its schematic Hardware/PCB/Controller PCB/Controller PCB.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask h2dakhil before reusing the design.