Table of Contents
PicoMic — Noise-Cancelling USB Microphone
Noise-cancelling USB microphone built on the Raspberry Pi Pico 2 (RP2350). Multiple I2S MEMS mics + adaptive filtering = clean voice on a €12 budget.
Concept
[INMP441 #1 (voice)] ──┐
├── PIO I2S RX (1 state machine, stereo)
[INMP441 #2 (noise ref)]┘ │
DMA → Audio Buffer
│
Core 0: LMS adaptive filter (5% CPU!)
│
TinyUSB UAC → appears as USB mic
LMS (Least Mean Squares) adaptive filter uses the reference mic to model ambient noise, then subtracts it from the voice mic signal in real-time. 10-15 dB noise reduction with 2 mics.
Why RP2350?
- Cortex-M33 with DSP extension — single-cycle MAC, SIMD for 16-bit math
- CMSIS-DSP built-in:
arm_lms_f32,arm_lms_norm_f32, FFT, FIR filters - PIO handles I2S with zero CPU overhead
- At 16kHz / 256-tap LMS: 5.5% of one core. Absurd headroom.
- RP2040 (Cortex-M0+) works too at ~41% of one core, but no hardware MAC
Parts List
| Part | Price | Notes |
|---|---|---|
| Pico 2 (RP2350) | €5 | Or Pico 2 W for wireless monitoring |
| 2-4x INMP441 breakout | €3-6 | I2S MEMS mic, 61 dB SNR |
| PCM5102A DAC (optional) | €3 | I2S output for monitoring processed audio |
| Total | ~€12-14 |
Alternative mics: ICS-43434 (65 dB SNR, better linearity), SPH0645LM4H (Adafruit breakout).
Mic Placement
The hard part is not computation — it's physical placement.
2-mic ANC (recommended start)
- Voice mic: pointing at mouth, ~30 cm away
- Reference mic: pointing opposite direction, back-to-back
- Spacing: doesn't matter much for LMS — orientation and acoustic isolation matter
- A foam barrier or PCB between mics helps
- LMS filter adapts to any delay
3-mic hybrid (ANC + beamforming)
- Voice mic: center, facing user
- 2 reference mics: flanking at 40-60 mm spacing
- Gives both adaptive NC AND spatial rejection
- 40-60 mm avoids spatial aliasing up to ~4 kHz
Reference spacing from products
| Device | Mics | Spacing | Application |
|---|---|---|---|
| ReSpeaker 2-Mic HAT | 2 | 58 mm | Voice capture |
| ReSpeaker 4-Mic Linear | 4 | 65 mm | Far-field beamforming |
| Amazon Echo | 7 | ~35 mm circular | Far-field 360° |
| AirPods Pro | 3/ear | ~8 mm | Feedforward + feedback ANC |
| Laptop built-in | 2 | 60-80 mm | Near-field beamforming |
Rules
- For beamforming: spacing must be < λ/2 at highest frequency (4 kHz → < 4.25 cm)
- For ANC/LMS: spacing barely matters, orientation and shielding matter
- More reference mics = diminishing returns. Sweet spot: 1 voice + 3 reference (covers 3 noise axes)
Computational Budget
LMS at 16kHz, N=256 taps: Per sample: 2*256+1 = 513 MACs Per second: 8.2 million MACs/s RP2350: 5.5% of one core RP2040: 41% of one core LMS at 48kHz, N=512 taps: Per second: 49.2 million MACs/s RP2350: 33% of one core — still comfortable
Memory: ~16 KB total (audio buffers + filter coefficients + FFT workspace). Non-issue on either chip.
Key Resources
- microphone-library-for-pico — Arm's I2S/PDM mic library, includes USB mic example
- CMSIS-DSP — LMS, FIR, FFT functions for Cortex-M33
- PineBuds Pro — open-source TWS earbuds with ANC (VM
pinebudson data has the dev environment)
Wiring
Two INMP441s on one I2S bus (3 wires + power):
Pico GPIO → INMP441 #1 (L/R=GND) + INMP441 #2 (L/R=VDD)
SCK → pin X ──┬── BCLK #1
└── BCLK #2
WS → pin Y ──┬── WS #1
└── WS #2
SD → pin Z ──┬── SD #1
└── SD #2
3V3 → VDD both
GND → GND both
One PIO state machine, one DMA channel. Samples arrive interleaved L(voice)/R(noise).
Status
Phase: Backlog. Synergizes with PicoShell (same Pico 2 platform) and turing voice satellite.
