Before we dig deeper into the nuts and bolts, I thought I should provide a Morse Decoder demonstration. Watch the video and read all about it!
Controls for my decoder are as follows, as shown above. In section “A”, you can choose between three decoding algorithms. I will describe and demonstrate the adaptive variable ratio and tone period (AVRTP) algorithm in a future article.
As shown in “B”, you have the choice of filtering the incoming receiver audio further. The LMS algorithm, implemented as a adaptive line enhancer, is particularly useful in getting rid of noise and leaving pure tones.
At the top left “C”, the built in scope shows a variety of program parameters. In this display, the green trace is the actual Morse signal being sampled by the front-end Goertzel filter every 2.5 milliseconds. You will see the actual DC pulse train for decoding shown in yellow, after the edge-detection on the raw pulses.
Finally, in section “D” we have some controls to fine tune the algorithms. The “Learn” control tailors how fast the program adapts when code speed changes. The decoding threshold can be set manually, or best yet automatically by the program itself.
Morse Decoder Demonstration Video
In the video, you will see decoding at 35 WPM from W1AW one afternoon on 14,047.5 kHz. Pretty smooth with few glitches. There are some dropouts from signal fading. I could improve on this if I turned on the audio filters.
In the lower status bar, you can see the key parameters. Unit Tone and Space durations are both shown as 34 milliseconds. This is what you would expect from perfect machine-sent code, i.e. 1200 ÷ 35 WPM = 34 milliseconds.
This is version 3 of my Morse Decoder, written in Delphi, and using PortAudio to stream audio from the Flex 6300 or other receivers.