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)
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.
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
W 100mm x H 60mm x D 28mm
Stylus pen holder, strap hole,
Switch button, etc.
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
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
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.)
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.
JL1BDL /AJ1KA
コメント
コメントを投稿