Hear what my cats hear. Fold the ultrasonic world down into my ears.
The premise
Human hearing stops at about 20 kHz. Cats hear up to about 64 kHz. Bats shout far above that. There is a whole layer of sound around us, all the time, and we are deaf to it.
The Predator from the movie sees heat. I wanted the audio version first: an extra sense. Walk around with headphones on and hear the part of the world that is normally silent.
Phase 1 is sound. Phase 2 is vision — an IR camera, one day.
The hardware stack
signal chain
Dodotronic Ultramic UM250K USB mic, 250 kHz sample rate
| (hears up to 125 kHz)
Raspberry Pi 5 real-time DSP in Python
| numpy + scipy, ~1,500 lines
AudioQuest DragonFly USB DAC, 48 kHz out
|
Headphones
Control: web GUI on the phone (FastAPI + websocket)
Power: powerbank. Boots straight into the engine (systemd).
The normal Pi audio input stops at 48 kHz. Useless here. The Ultramic is a USB mic that records at 250,000 samples per second. It plugs in like any sound card. It knows exactly one mode: 16-bit, mono, 250 kHz.
How you fold sound
The trick is borrowed from radio. Take a slice of the ultrasonic band. Slide it down so it starts at 0 Hz. Now it sits in the audible range. This is called heterodyning — the same move every radio receiver makes.
Cheap analog bat detectors do this too. But they also fold a mirror image on top of the signal, so you hear two things at once. My version filters the slice first and then shifts it. No mirror image.
three modes
FOLD Pick a 24 kHz window anywhere from 20 to 100 kHz.
Slide it down into the audible band.
Tune it live, like a radio dial.
MOVE FOLD, but the window sweeps up and down on its own.
A scanner. You hear the whole range pass by.
MAP Divide EVERY frequency by ~5.2. The whole 0-125 kHz
range squeezes into 0-24 kHz at once. Pitch ratios
survive, so a chirp still sounds like a chirp.
Experimental.
On top of that: a mix slider between normal hearing and the folded ultrasound. So you hear the room AND the hidden layer at the same time. Plus a noise gate and a denoiser. The ultrasonic world is about 40 dB quieter than the normal one. Boost it that much and the mic's own hiss gets loud. The denoiser learns the hiss and removes it. Short loud events — clicks, chirps — pass straight through.
Everything is processed in small blocks, live. The hard part is the block edges: every filter has to carry its state from one block to the next, or you hear a click 120 times a second. Every block-based piece is tested against processing the same audio in one go. 20 tests. They pass on the Mac and on the Pi.
What I heard
I took it out in Cyprus. Headphones on, Pi in the pocket, phone as the remote.
In the woods: weird alien noises. Clicking, everywhere, from things I could not see. At home: the electricity in the power sockets, suddenly audible. And somewhere, a strange repeating sound, like Morse code. Something was sending. I have no idea what.
Super cool. That is the entire review.
SCREENSHOTSThe remote control
web-gui-fold.jpeg
The web GUI, in FOLD mode. It runs on the Pi; the phone is the remote. Every slider retunes the live engine over a websocket. Tune at 25 kHz means the band from 25 to 49 kHz lands in your ears. Captured in 10/2026 from the same code running on my Mac — the Pi hasn't made it to Hamburg yet.
POSTLearnings · Afterthoughts · Timeline
learnings · timeline
Learnings:
- The mic decides everything. Without a 250 kHz mic there is
no project. Pick the sensor first, then the computer.
- Radio tricks work on sound. A heterodyne is a heterodyne.
Filter BEFORE you shift, and the mirror image is gone.
- Real-time audio is about the seams, not the math. Every
filter must carry its state across blocks, or it clicks.
- USB device numbers change on every reboot. Find devices by
NAME, never by number.
- The Raspberry Pi 5 has no headphone jack. Bring a USB DAC.
- The silent world isn't silent. It's just not for us.
Timeline:
- 2026-05-23: Ultramic on the Pi. Clean 250 kHz capture.
Fold engine, three modes, web GUI. 20 tests pass on the Pi.
- 2026-06-09: Field tests in Cyprus. Denoiser and noise gate.
systemd service: power on, and it's listening.
- Phase 2: IR camera. See the invisible, too.
Status: Phase 1 works. Phase 2 is waiting.
predator.html·250 kHz in · 48 kHz out · phase 1 of 2