DTMF decoder

Feed it telephone dial tones, from an audio file or the microphone, and it reads the digits back. Full 16-key grid (0-9, *, #, A-D). Runs entirely in your browser; audio never leaves your machine.

Input

or drop an audio file anywhere on this card

Detected digits

Live tone levels

The tick is the detection floor. A digit needs one bar from each group clearly above its neighbours at the same time.

Test keypad

Pressing a key synthesizes the real tone pair and runs it through the decoder, so you can watch the meter and the output react. If the digits come back wrong, the bug is yours to keep.

How it works

Every ~26 ms the decoder runs a Goertzel filter at the eight DTMF frequencies: rows 697 770 852 941, columns 1209 1336 1477 1633 Hz. A digit is accepted only when one row and one column clearly dominate their groups, the two levels are within 12 dB of each other (the "twist" rule from telephony specs), the pair carries most of the frame's energy, and all of that holds for two consecutive frames. Repeated digits need a short gap between presses, exactly like real dialing.

Files are decoded in one pass; the microphone path is the same math in real time (with browser noise suppression turned off, since it eats sine waves for breakfast). Nothing is uploaded anywhere; there is no server to upload to.

This tool exists because a CTF challenge was once fifty seconds of beeping and I wanted the flag in forty-nine. That story is in the CTF archive.