User Tools

Site Tools


picomic

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.

  • 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 pinebuds on 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.

picomic.txt · Last modified: by 127.0.0.1