Let’s make a CW Decoder!

 

Essential for contests!  Make CW even more fun!

Affordable, Compact, High-performance CW Decoder

Yet another CW Decoder?  Yes, but this is different!

What you hear is What you get!

Kunio Ajika, JL1BDL / AJ1KA

Last June, I held a workshop at the Funabashi City Amateur Radio Club (FARC: JJ1YNA, Chiba, Japan) on making a CW Decoder I developed. After that, an article on this workshop and CW Decoder was published on HAM world magazine in Japan. (Mar/2026) This CW Decoder was well received by many CW beginners and CW fans in Japan, so I'd like to introduce it to you.

This CW Decoder aims to support CW beginners to intermediate operators, and also to invigorate local club activities through making a practical CW Decoder together. To enable anyone to make it at a low cost, I have made all the information and software required to build it available for free.

 

1. Let’s make a CW Decoder!

  CW Decoders are a great help for CW beginners (like me), but there are some issues with them.

Commercially available CW Decoders are susceptible to noise and have smaller screens. They also require tuning the receiving audio to the (semi-)fixed filter frequency.

PC versions offer good performance, but its window overlaps with logging software and browsers. They're difficult to use for mobile operation.

So, I developed a compact, high-performance CW Decoder comparable to the PC version by using an inexpensive, high-performance microcontroller (RP2350), and by digitally processing the signal.

 

Features

1. High Performance

l  High-performance microcontroller (RP2350)

l  Noise resistance by adopting FFT method
Achieves high performance equivalent to PC-based decoder software

l  Decoding speed: up to 45 WPM

2. Easy to Use

l  No need to adjust the receiving frequency to match the filter
What you hear is what you get. (It decodes the strongest signal between 300 Hz and 900 Hz)

l  Easy-to-read 2.8-inch color LCD with touch panel
(20 characters x 7 lines full-screen display and graph display)

l  Easy volume adjustment
Uses branched speaker/headphone output for the operator

l  Decoded characters are memorized, so you don't have to worry if they disappear from the screen

3. Compact

Easy-to-use size for desk top or mobile operation

4. Other Features

l  CW Keyer (for CW transmission practice)

l  Built-in clock function (with battery backup)

5. Affordable

l  Parts cost 4,800 JPY (about 30+ USD)

 Table 1. Main specifications.

 

2. How to Use

It's easy to use. Simply insert it between your rig and headphone/speaker. (Figure 1) It decodes and displays both the received CW and your own transmitted content.

Connect a power source and audio input to CW Decoder, and turn on the power switch. The main menu (Figure 2, center) will appear. Tap "Decoder" to start the decoding function.

The decoder has a full-screen display (top left) and a graph screen display (top right). You can switch these displays by tapping the right side of the screen (touch panel).

While the tapping area are not displayed, tapping the "?" in the lower left will bring up a guide screen (Figure 3), so tap there. You can also switch screens by tapping panel without displaying the guide.

 This unit has many other functions; please refer to User’s manual for details.

 

Figure 2: Features and Menu
Turn on the power, and the main menu (center) will be displayed.


Figure 3 Touch Panel Operation
Tap the guide button "?" in the lower left corner of the decoder screen to display the guide.

3. Making a CW Decoder

Figure 7 shows the circuit diagram for this device. Because signals are processed by software, the circuit is very simple, allowing for experiments on a breadboard.

(Figure 7) Circuit Diagram
A very simple circuit.

(Fig. 4) Pattern diagram (86mm x 52mm)

(Fig. 5) Implementation example



(Figure 6) Case made with a 3D printer
W 100mm x H 60mm x D 28mm
Stylus pen holder, strap hole,
Switch button, etc.

(Figure 8) Wiring example
Using an RTC unit other than the RT8025


The KiCAD circuit diagram and PCB layout are also available on the website (support site). Please modify the PCB layout (footprint) to match available components. Software supports RTC unit with DS3231, RX8025, or RX8900.

The support site also provides 3D data for making a dedicated case with a 3D printer.

 

(Table 2) Bill of Materials

MCU board used in this kit is compatible with the Raspberry Pi Pico2 (with USB C connector)

Note for BOM

Note1: As for 240x320 pixel 2.8inch TFT LCD (with ILI9341 and Resistive Touch Panel), 50mmx86mm and PCB Ver 1.2 is recommended.

Note2: DigiKey parts (listed) are not the same one I used. (foot prints are different.)

Note3: As for RTC Unit, you can use DS3231M, RX8900CE in addition to RX8025NB such as available at Aliexpress. (Auto-detect by the software)

Note4: You can use Raspberry Pi Pico2 (USB mini-B) or WeAct Studio’s RP2350A-V20 (4MB) (USB-C).
Other RP2350 boards may not work for this circuit.



4. Writing Software

Writing software from a PC is extremely easy, simply “drag and drop” the object file on the PC screen. (Figure 9)

 

(Figure 9) How to write software

5. Decoder Mechanism and Performance Evaluation

 

5.1 Decoder Software Mechanism

CW Decoder's signal processing is fully digital. Processing consists of the "signal input section," "signal shaping section," and "Morse code analysis process section." These tasks are shared between the RP2350's two cores. (Figure 10)

 

(Figure 10) Software Composition
The software is broadly composed of three parts: the signal input section, the signal shaping section, and the Morse code analysis process.

First, the "signal input section" amplifies the audio signal from the rig (approximately 100 mVpp) to approximately 500 mVpp, converts the level (DC offset), and inputs it into the MCU's ADC. The ADC sampling frequency is set to 2560 Hz (0-1280 Hz can be analyzed according to the sampling theorem).

 

The next section, the "signal shaping section," is the crucial part that converts the input signal into Morse code (key on/off signal).

First, the audio is decomposed into an audio spectrum at 20 Hz intervals using FFT calculations (128 samples/FFT @ 2560 samples/sec).

The number of FFT calculations per second is also an important factor in determining decoding speed and noise suppression. In CW Decoder, this interval is set to approximately 2 milliseconds (1/512 seconds). (Figure 11)

 

Figure 11: Input signal FFT calculation (image)
The input signal broken down by frequency using FFT calculation

Next, background noise and unwanted frequencies (below 300 Hz and above 900 Hz) are removed. (Figure 12)


Figure 12: After removing noise and unwanted bands (image)
The result after removing noise across the entire frequency range and removing unwanted bands outside the 300Hz to 900Hz range.

The strongest frequency is selected from the remaining data as the CW signal for analysis.

→ Displayed as an audio spectrum graph ( left side of Decoder graphs in Figure 2)

 

The data to be analyzed contains level fluctuations such as QSB. The signal itself also has its own strength (average value), so ALC (automatic level control) is applied, and then the On level (Hi level), Off level (Low level), and intermediate On/Off determination level (Threshold level) are calculated.

→ Displayed as audio levels graph (right side of Decoder graph in Figure 2)

This will be the output of key On/Off status every 2 milliseconds.

 

Finally, the "Morse Code Analysis Process" decodes the On/Off data and displays the results.

 

Morse Code Analysis Process (Decoding Function)

The "signal shaping process" automatically selects the strongest audio signal when receiving the CW signal, which eliminate the need to tune to a filter. Therefore, the decoder decodes the signal as you listen.

The Morse Code Analysis Process determines Dots, Dashes, Character spacing, and Word spacing based on the key On/Off data output by the signal shaping process. The decoding speed automatically tracks up to 45 WPM, depending on the noise level.

Prosigns (Concatenated character symbols) are displayed in brackets [].

 

5.2 Auxiliary Functions of Decoder

* Log Display Function
Displayed characters are recorded, so you won't have to worry about the displayed characters disappearing.

* PC Output Function
You can display the characters being decoded on your PC's terminal software (such as TeraTerm).

 

5.3 Decoding Performance Evaluation

Conditions for actual radio waves vary. Therefore, decoding performance was evaluated on a PC.


(Figures 13-16) Tested the performance against noise by decoding the nixed audio of a CW signal and recorded noise at different volume ratios.

Figure 13 shows the audio output from the CW training software (A1ABreaker) on PC. Figure 14 shows the waveform of a 10-minute recording of actual 7 MHz band noise. For performance measurements, the recorded noise was mixed with the CW audio to measure the decoding performance at each signal and noise level.

Figure 15 shows the waveform when CW audio and noise were played simultaneously at a ratio of 5:8. (The CW signal was still discernible visually.) Under these conditions, decoding was nearly flawless.

Figure 16 shows the waveform when CW audio and noise were played simultaneously at a ratio of 5:10. (The CW signal became more difficult to distinguish visually.) Under these conditions, decoding errors increased.

 

For more details, please see the performance evaluation on the support site. Videos and audio from the performance test are available.

 

Although decoding performance does not match that of the human ear, the decoding rate is roughly equivalent to that of the PC version. I will continue improving the software and increase the decoding rate.

 

6. Conclusion

Are you intrigued? Do you think this would be easy to make?

 

The members who made it shared the following feedback:

- The decoding performance is sufficient and I'm satisfied.

- I'm glad it was cheap to make.

- It's small, convenient, and easy to read.

- I use it all the time.

- I like that it doesn't require a PC and can be used right away.

- The keyer code detection is quite strict, so it's good for sending practice.

- I made a case in my favorite color using a 3D printer.

 

Why not hold a workshop at your club or try making one together with a group?

 


 

  CW Decoder support site

https://CW Decoder.blogspot.com/2025/09/CW Decoder-by-jl1bdl-home.html

(Or Google search with “JL1BDL CW Decoder”)

This site is written in Japanese. However, Translator in browser (Chrome, etc.) gives a good English translation. (User’s manual is available in English.)

Parts sets are available at cost price for those who find it difficult to buy and collect the parts themselves. Check the CW Decoder support site.

 

Disclaimer

l  This product has been created and is provided for the purpose of supplementary use by individuals who enjoy CW communications. Please note that no warranty is given for any defects or other issues resulting from the use of this device.

l  Changes and modifications may be made without notice to improve performance and functionality.

l  The software (source code) is not currently publicly available. All rights belong to JJ1YNA and JL1BDL. (see Appendix)

 

About the Author

Name: Kunio Ajika

Call Sign:  JL1BDL / AJ1KA (Extra)

Address: Funabashi City, Chiba, Japan 

E-mail: eCraftJL1BDL@gmail.com

Bio: Kunio Ajika started in amateur radio in 1971. After 40+ years of QRT, resumed HAM activities in 2024 after retirement under the new callsign JL1BDL. Finding deteriorated CW capability of himself, he decided to make a usable CW Decoder. He is curious in new digital mode FT8 and VarAC, in addition to old digital mode CW.

Appendix

 

Now Version 3.5.3 is available. (March, 2026)

 

Please install Ver 3.5.3 as many Bags are fixed and new feature are available.

If you find this software is “Good!”, or “Like it!”, please send me a donation for a hamburger😊

 

New Features

1)       New Digital Clock
A digital clock (with alarm/timer) has been added for 24-hour use as a desktop accessory.

2)       Extended mode for advanced users (Parameter adjustment without recompiling)
CW Decoder is designed for beginner to intermediate CW users, with various parameters optimized for 20-30 WPM.
However, in response to requests from advanced CW users who want to customize the parameters to their own environment, I have added “Extended” mode that allows you to change various decoder parameters.
Furthermore, as a developer feature, more detailed parameter settings are now possible.

3)       Customizable
Customizing World Clock Cities and Decoding Frequency Range
By recompiling with the Arduino IDE (development environment), you can now change World Clock cities and the decoding frequency range. (The standard frequency range is 300Hz-900Hz, but it can be adjusted between 20Hz-1260Hz for special applications. Results/performance are at your own risk.)

4)       Source Code available
Now source code is available on request in accordance with GPL V3.  Please see detail below “About Source code”.

 

About Source code

The software (source code) is not publicly available at this moment. However, I can provide it on request (under GPL V3 and free of charge), and you are welcome to help me for further improvement.
 
But before you request it, please consider blow;
 
There are two ways to write the program on MCU.
1)  Copy Object file from PC (Arduino IDE is not required, but you need to press BOOTSEL button on the MCU board.)
2)  Using Arduino IDE, compile and install. (That does not need to press the BOOTSEL button nor need to open the case.)
 
Therefore, firstly, please prepare Arduino IDE on your PC and check if you can compile “Object code for Arduino IDE” you downloaded from the site and install it.
You will find setup code (source code: CW_Decoder_Vxxx.ino) and some object libraries with Applications’ header files (*.h) under /src directory. Please check if those modules meet your expectation.
 
For example, to change the World Clock city data (world_cities.h), you need to use Arduino IDE to compile it. Also, you can modify some settings by yourself, such as GPIO pin and some parameters of CW Decoder.
 
Program is written on Arduino platform, using only standard libraries so that we can transplant (port) it to another platform in the future. Please note famous graphic libraries (such as Adafruit) cannot be used due to performance reason and real-time display control (graphs and indicators).
 
In providing source code, please understand following points: a) The source code contains many experimental codes, testing codes here and there and it needs to be tiding up and re-organized. b) It is still evolving to add some functions. c) There are few comments and those are mostly written in Japanese. d) It will be about 800k Byte in total (including graphic libraries I wrote) or 10 folders with 64 files. e) I will not have enough time to answer your questions. (Therefore, please refer to the Support Site for understanding program structure, using Copilot and Google translate.)
 
Appreciate your kind understanding.
JL1BDL /AJ1KA

コメント

このブログの人気の投稿

Support Site of CW Decoder by JL1BDL