Morse Code Decoder & Trainer

Morse Code Decoder & Trainer โ€” free, instant, no signup.

Decode from the air

Hold your receiver's speaker near the microphone. The decoder locks onto the strongest tone in the passband and learns the sending speed as it goes.

Tone: โ€” Speed: โ€” Signal: โ€”
โ€”
decoded
Stuck on a callsign, or want a speed check?

Post what you copied on the Operating board at the Ham Radio Forum โ€” real operators, real signals.

How it works

Morse timing is defined relative to one unit, the dit. A dah is three dits, the gap inside a character is one dit, between characters three, and between words seven. Speed follows from that single unit: the standard word PARIS is exactly 50 dits long, so at 20 WPM a dit lasts 1.2 / 20 = 60 milliseconds. Farnsworth timing sends each character at the higher speed but stretches the gaps between them, which is why it is the usual way to learn โ€” you hear the real rhythm of a character from the start instead of a slowed-down version you later have to unlearn.

The decoder works on envelope timing rather than on pitch alone. It takes an FFT of the microphone input, finds the strongest bin inside the passband you set, and tracks that one bin's energy over time. An adaptive threshold sits between the running noise floor and the running peak, so it keeps working as the signal fades. Every mark and space is measured, and the dit length is estimated continuously from the shortest marks seen โ€” which is what lets it follow a hand key that drifts, rather than assuming a fixed speed.

FAQ

Why does the decoder struggle on a hand-sent signal?

Because it is measuring real durations, and hand sending varies them. A slightly long dit or a short gap between characters is easy for a human to hear through and hard for a threshold to classify. Machine-sent CW decodes almost perfectly; a heavy fist may not. That is a limitation of every timing-based decoder, not a bug in this one, and it is the main reason experienced operators still copy by ear.

Does it work with QRM or a fading signal?

Partly. Narrowing the passband to bracket just the tone you want helps a lot, because the decoder only tracks the strongest bin inside that range. Deep QSB will drop characters as the signal goes under the adaptive threshold. Two signals close in frequency will confuse it โ€” narrow your receiver's filter first, then narrow the range here.

What speed should I learn at?

Learn characters at 18โ€“20 WPM or faster and slow the gaps instead, using the Farnsworth field above. If you learn characters at 5 WPM you memorise a count of dots and dashes, and that habit has to be broken before you can copy at speed. Learning the sound of a character at full speed from the beginning avoids that.

Why is my microphone not picking anything up?

The browser needs permission and a secure connection, and it will only prompt once per site. Check that the tone you are feeding it falls inside the range you set โ€” a 600 Hz sidetone with the range set to 800โ€“1200 Hz will never be seen. The signal meter moves whenever energy is detected in range, so use it to confirm the decoder is hearing anything at all.

Is anything sent to a server?

No. The audio is processed in your browser and never leaves the machine. The share link encodes only the text and settings you typed, in the URL itself.