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?

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.

3-mic hybrid (ANC + beamforming)

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

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

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.