After building a text-to-Morse generator, I assumed decoding would basically be the same problem run in reverse. It's not. Generating a signal means you control every timing boundary exactly. Decoding means figuring out where those boundaries actually are in someone else's imperfect signal — and "imperfect" turns out to be the normal case, not the exception.

*Why decoding is a genuinely different problem

*

When you generate Morse code, every dot, dash, and gap comes from the same clean base unit. There's no ambiguity — a dash is exactly 3 units, always, because you defined it that way.

When you're decoding, you're working backward from raw signal data (audio amplitude over time, or pixel positions in an image) and trying to answer two separate questions for every pulse: