About FT8
Matt Roberts - matt-at-kk5jy-dot-net
Published: 2023-01-31
Updated: 2023-06-28
FT8 is unquestionably popular in the amateur radio world. Among
some, zealously so. My experiences with these modes are not typical
of most operators, so I want to share some thoughts on the mode—some
technical, and some not.
When I speak of FT8, this also relates to the majority of modes in the
WSJT-X collection
of modes — including FT4 and JT65 — as well as the reference
software for these modes, WSJT-X.
An honest evaluation of FT8 as a mode doesn’t reveal any significant
technical innovation. Narrow
DSP
digital modes
existed long before FT8, and its popular predecessor, JT65.
This is also true of other design features, such as
wave-shaped
MFSK,
forward error correction,
in-stream
synchronization patterns,
data whitening,
interleaving,
deep-searching decoders,
a priori
decoding assistance,
presynchronized data clocks,
etc.
Further, the
Shannon Limit
wasn't changed with the release of FT8. Modes with performance
approaching that limit have existed for many years. So FT8's
modulation design is not intrinsically more capable of digging signals
out of noise than many other encoding schemes that preceded it.
So what makes this mode so popular among hobbyists?
The one "innovation" that seems to be key to the success
of FT8 is the restriction of message format and content. That
is, the mode is explicitly not intended for normal
conversational text.
Most earlier digital modes in the hobby world used asynchronous
messages of arbitrary length, while FT8 uses fixed time slots of
fixed-length messages that are too short for typical conversation.
When that is combined with the reference software’s strong emphasis
on macro messages, and message sequence automation, the mode
effectively limits typical operations to brief
contest-like
exchanges.
Such contest-like operation has been around for decades with other modes, as well, but what makes FT8 different is that it uniquely limited to such operation. Thus, FT8 operation is a 24/7/365 contest, and it operates with very similar on-air "rules."
This appeals to operators who want to make contacts and chase DX,
but aren’t interested in "rag chewing" with strangers.
In fact, the rise in popularity of these modes roughly coincides with
the growth of usage of short-message services such as
Twitter and
SMS.
So it is no surprise that a cultural shift encouraged WSJT-X style
operation.
And that’s not a criticism.
After all, radio contesting is also very popular. What the WSJT-X team brought to the air was a family of modes — and associated reference software — that are useful for little else besides contest-style operations: Call CQ, trade reports, roger and 73.
As with any contest, removing any expectation of conversation allows one to focus exclusively on making more contacts to more locations in the time available.
The restriction of messages to fixed formats is even leveraged
by the software's a priori decoding assistance, to help deduce
the content of messages too weak to copy completely. This gives
the illusion of SNR
performance beyond the Shannon Limit. By sticking to a few short
messages of fixed format, the decoder can get extra hints on the
content, even if the error correction can’t dig out all the bits.
Man Meets Machine
My own experiences with FT8 started long after it was already popular.
At first, I found it disinteresting, and some of the technical details mildly
distasteful.
In particular, I dislike having to pre-synchronize the computer clock
in order for the demodulator to function. I don't object to
synchronizing clocks, but I do object to the fact that the demodulator
can't function without it. The WSJT-X modes uniquely have this
restriction. Existing modes like
RTTY
and
Olivia
extract the clock information
from the data stream.
This means that all of the information needed to decode them comes
from their own transmission. The FT8 family lacks this ability.
It may seem like a small thing, but requiring use of a separate
communication channel to operate, whether it is
NTP,
WWV,
GPS,
or anything else outside the radio channel, doesn't seem very
"amateur radio."
However, the restricted message content that makes FT8 so popular means
that it is easy to automate contacts, making large numbers of contacts
with very little operating effort. So I decided to pursue FT8 as
a challenge for my automation and software skills:
convert(lemons) -> lemonade;
...or something like that.
Automated Amateur
The release of FT8 came with a new feature to WSJT-X, called
"auto-sequencing," where the software chooses the next message
to send, based on what the other station sends. Because FT8 used
tighter timing than its predecessor (and FT4 used tighter timing,
still), the team decided that auto-sequencing was necessary, since
humans would struggle to operate the UI in the roughly one second per
slot available to read the prior message and select the next one to
send. Further, when calling CQ, the software even decides
which station to answer when multiple replies are received.
This feature makes the stock software a "QSO robot," of
sorts. Since the operator only decides to start or search for
a contact, and the software makes all the subsequent decisions, the
human is mostly removed from the decision logic.
Thus, the WSJT-X team has implemented most of the automation in
their software that is needed to make contacts without significant
human intervention. While they strongly discourage
unattended robots, they have implemented most of the
needed automation logic to do so.
Even without auto-sequencing, the nature of fixed messages of
predictable content is ready-made for automation. The
WSJT-X software isn’t a completely automated system on its own,
nor is its API particularly well-suited for attaching additional
automation. However, there are some improvements that can be
made to increase efficiency and QSO rate, while reducing operator
workload.
It’s also important to define some terms here. When I speak
of "automation" in this context, I’m referring to the
automation of the user interface (UI) task sequence. Whether
and how that relates to "automatic" operation — which
is a specific technical term used in some regulatory rules — is
a question that I will touch on below. However, it is important
to note that these are distinct terms used in distinct contexts.
Improving the Stock Automation
The stock WSJT-X software already implements automation of the message
sequence of each contact, but by default, the automation stops after
each contact. So the main improvement that can be made is automating
the sequence of making multiple contacts.
For that task, there are two two basic automation schemes that can
be implemented: "pouncing" and "running."
These are also the two basic modes of any contest operation.
I experimented with "run" and "pounce" implemented as distinct modes within a single software project. It is also possible to run a combined mode where the software calls CQ, but opportunistically pounces stations in the absence of CQ replies. This combined mode is only a very small change to the run mode, so I will still treat the two as distinct modes.
First is the "run" automation. This enables the
software to call CQ over some period of time, making contacts as
other stations reply. When a contact is completed, the software
resumes the run. The main task here is clicking "Enable TX"
whenever it is disabled by WSJT-X. Otherwise, the
auto-sequencing logic within WSJT-X is a reasonably complete
implementation of the automation rules needed.
The second scheme is "pounce" automation. This enables
the software to quietly watch decodes, the selectively attempt to
reply to stations calling CQ. This was a somewhat more interesting
mode to implement, as there are some custom rules that can be used
for pouncing that don’t apply to running. Such rules might include
only calling stations that are unique in the log, or located outside a
certain geographic radius, or only calling DX stations.
Nonetheless, most of the logic for running also applies here.
Again, both modes of automation will be familiar to contest operators,
as these are essentially identical to how contesting is done in any
other mode.
Nuts and Bolts
There are two ways to implement additional automation — either within WSJT-X’s C++ UI code, or "outboard" as a separate application that interacts with WSJT-X. For simplicity and licensing considerations, I chose the latter.
I chose C#
as the language for the outboard automation module, mostly because
I have C# libraries for geography calculations and ADIF files.
In retrospect, another language like
Ruby
or
Python
might have provided better library support overall, and eliminated
a lot of compile steps during debugging. Also,
Mono
support for the CLR on Linux can be a little buggy for lesser-used
features. But after 9,000 lines of code, I'm not going to
change now. CLI languages do have the advantage of being
JIT-able,
which should make them run faster, even on modest hardware like a
RasPi.
WSJT-X provides decoded message text via two interfaces: the
UDP API, and the ALL.TXT file. This allows the outboard
application to watch both transmitted and received messages in
real time. In practice, I found that the UDP reporting of
decodes and encodes was unreliable, occasionally dropping a
message. So I decided to
tail
the ALL.TXT file for message updates, which works quite well.
The UDP API also provides some control functions, but unfortunately,
it does not allow complete control of the UI. There are
still a few commands that can only be sent to WSJT-X via GUI elements
such as buttons and text boxes. As a Linux user, I chose to use
the
XDO
interface to accomplish this. Windows has a similar but distinct
interface for UI interaction.
The UDP API has good support for automatic pouncing of stations by user
software. I was pleasantly surprised by this, since the WSJT-X team
has in the past shyed away from features that could be used to increase
the automation of operation.
The stream of FT8 messages is the main input to the outboard automation
logic. As the automation sees messages come and go, it makes
decisions on how to steer the operation of WSJT-X. When actions
are needed, they are sent to WSJT-X via UDP or XDO. UDP is
preferred for speed where it works properly, but XDO is used where
needed.
The automation module mostly alows WSJT-X to "just do its thing,"
intervening only when needed. Think of it like a spacecraft... WSJT-X
is the main engine doing the heavy lifting, with the outboard automation
module providing small thruster or gimbal inputs, to keep the main engine
pointed in the best direction.
Well-Behaved Automation
Getting the basic logic for running and pouncing was the easy part.
Again, the stock WSJT-X does most of the work. However, there’s
a well-known military adage that no plan survives contact with the
enemy. In this case, even well-planned code stumbles when
making real contacts on the air.
While a naive implementation of either automation variant is almost trivial to code, not all FT8 participants follow a predicable or helpful recipe. There are also malicious and/or careless operators who send messages that easily confuse simple automation rules.
One common interference technique is where the attacker sends a grid square repeatedly to another station, in order to prevent that station from working others. This approach completely fouls WSJT-X’s auto-sequencing.
If grid square frames are interleaved with signal report frames, the watchdog timer can also be rendered useless as a countermeasure.
Either of these scenarios are essentially a denial-of-service attack. Such situations can be caused by ignorant or careless users, or by poorly written "robots." There are plenty of each on the air.
Because of such things, the first task for writing well-behaved automation is to implement a list of blocked calls. These are call signs that the automation will never try to call, and their frames are always ignored. The list should be easily updated with new calls as the automation operates.
The automation itself needs to watch for errant behavior, and block calls of misbehaving stations. This allows it to quickly deal with problems by just ignoring them. When the operator sees behavior that the automation can’t cope with, manual blocking of calls is also useful to help the automation to "just move on."
A related task for resilient automation is proper timeouts. We want to detect when the station we are working unexpectedly disappears (or gets stuck). The stock software opts for a single "watchdog" timer, which shuts down the automation if too many identical frames are sent. Just because a station vanishes in the fade, we don’t want to send and send until the transmitter times out. We want to work others, and hopefully the lost station will come back later.
The cousin of proper timeouts is state caching. We want to keep all the information we receive from other stations, such as grid squares and reports, in case a contact takes place piecemeal. It’s not unusual for a station to fade out before sending a final "roger" frame. If he comes back later, after we have worked someone else, and send only a "roger" frame to complete the contact, we want to log the entire contact with all the information without relying on unnecessary repeats. It’s also not unusual for a station to call CQ with their grid square, but when he calls us later, he may send only a signal report. If we keep the grid square from his CQ call, we can use that when logging his later abbreviated call. All of this should be done automatically.
Speaking of logging, there is no reason for a human to interact with logging. The FT8 messages are the same with every contact, including at most a call sign, grid square, and signal reports. Once the stations trade "roger" frames, the DX should be logged, without duplication. Although distinct from automating the contact sequence itself, this task is another good fit for automation.
Frequency Discipline
It’s important for us to avoid interfering with other stations, but
one feature that isn’t really supported by the WSJT-X software is
automatic frequency selection for "run" operation.
It is an exercise for the operator to find a clear frequency to
call. It is also one of the reasons FT8 can’t be completely
automated; more on this later.
The WSJT-X software does provide help when selecting transmit
frequency for pounce operations. When requesting the
software to reply to a CQ, the default behavior is to move the
transmit frequency to that of the CQ station. This helps avoid
clobbering someone else when pouncing, and makes "pounce"
automation easier to tame with respect to frequency discipline.
One task that outboard automation can perform is detection of
when another station is clobbering our CQ frequency. At a
minimum, this should be reported as a warning for the operator to
deal with.
Some operators advocate calling CQ where somebody else is calling CQ,
but on the opposite time slot. They claim that this improves
channel efficiency. Unfortunately, such claims ignore the fact
that others will be replying in that other slot, so calling CQ on
someone else’s frequency almost guarantees interference.
The fixed timing of messages adds some complexity to the question
of deconflicting stations. If two stations are calling CQ in
the same time slot, they will not hear each other. If they are
half-overlapping in frequency, they are always clobbering each
other. Since they always start and stop transmitting at the
same time, there is no good way for them to deconflict with each
other. If you then reply to one, the other may think you
are clobbering "his" frequency, when the conflict is
between the runners, not with the caller.
Experiences
Use of extended automation over ~5800 hours of operation
yielded 50,000 contacts between FT8 and FT4, on the HF and 6m
bands, giving a QSO rate of about 8.6 per hour.
Roughly 48% of contacts were unique calls, and 93% were unique to
the combination of call, band, and mode (i.e., "unique"
in the contesting sense). That means that each
call was worked twice, on average. In general, I don't do
FT8 contests, but those numbers do include a couple of
Field Day events,
which accounts for some of the duplicated calls.
Rather than spending time trying to quickly scan decodes and pick
stations to contact, I write the logic, and let the PC do the work.
Writing and maintaining the automation rules was a far more
interesting hobby activity than mindlessly double-clicking
on decodes. Many times, I can write or adjust the automation
while the automation is busy making contacts. It's almost
like having a second operator in the room.
It is strangely rewarding to watch software rake in one DX call
after another without my help. It is a much
more relaxing way to operate.
When running FT4, automation becomes even more powerful, since
there is very little time to make decisions between decodes.
Since FT4 was intended as a contest mode, having maximum automation
helps maximize QSO rate, which is the point of contesting.
My preferred operation mode is "pounce." This is
particularly helpful on a very busy frequency where calling
stations are wall-to-wall. Rather than adding to the
clutter by calling CQ, the software calls stations already
running. On a busy channel, this can easily outperform
running.
A combined operating mode, where the automation is running, but
occasionally pouncing along the way, is a good way to keep
the QSO rate up. Some operators only run, while some only
pounce, so allowing the software to do both is handy for catching
stations that would otherwise be missed. The complement of
this mode is also useful — where the automation focuses on
S&P, but occasionally sends a single CQ when the Q rate
starts to fall.
Automated logging is the only way to fly. Once both
stations have traded "roger" frames, the QSO is logged
automatically. Some people prefer to only log after trading
"73" but to each his own. The really helpful thing
about automating the decision to log a call is that many times the
waterfall is cluttered with multiple people calling, and often a
blocked call or two." The auto-logging sorts it all out
perfectly, every time.
Once one's FT8 logfile accumulates a few hundred contacts, the data
can be used for some interesting things. We can look at the
mean differential signal reports, to get a (rough) sense of how
antenna systems are performing. When I say "mean
differential," I'm talking about computing the difference in
SNR estimates for each contact — the received report less the
sent report — then averaging those differences across many
conatacts.
The signal reports traded are SNR estimates, computed from within the
necessary bandwidth of each received signal, and as such, they are
subject to a lot of variation due to congestion,
IMD,
local
noise sources,
etc. Further, beacuse of the way the SNR values are calculated,
and then "adjusted" to reference a 2500Hz noise bandwidth, the
estimate values
are unrealistically optimisitc.
However, even with these issues, they are still far more consistent
and uniform than the older
RST system
of reporting. This makes them more useful for spotting trends
in the data.
Distance and bearing information from
grid squares
also provides some interesting statistics. When combined with
the differential signal reports, it allows you to
compute stats
within (or outside) specific distances. Since nearly all QSOs
include grid squares, the data is fairly complete, even for relatively
small
samples.
Most people on FT8 use "contest rules," where each station
is worked only once per band and mode. A scan of my log shows
that fully 91% of contacts were unique across call, band, and mode,
while 52% of contacts had a unique call. So each call in the
log was present twice, on average; but fewer than one in ten was a
duplicate contact.
On the downside, I find that there is a lot of poor behavior on
FT8 and FT4. There is frequent deliberate interference
that can be easily verified by looking at
PSKreporter.
People will report my signal with a very high SNR, but then
start a long run right on top of me.
Broken robots are common, and some of their
transmitted message sequences are downright comical. After
sending 52 grid squares, even the dumbest robot should know to
give up. My favorites are the ones who send "RR73"
frames for several minutes. How many times does somebody
really need to say "goodbye," anyway?
I'm amazed how often somebody will reply to my CQ with a high SNR
report, then repeat that report over and over. So did you
really copy me at +15dB?
Then there's that guy who occasionally pirates a
P5
call...
"Tail-callers" are frequent, where someone will work
a running station, then start calling CQ or other callers without
changing frequency; this blocks other people from working the
runner indefinitely. Fortunately, this is one behavior
that seems to be slowly declining. Automation can also
help here, by quickly moving the frequency before doing the
tail-call, so that the original runner is undisturbed.
QSO-busting is more widespread than
bronco-busting.
One expects a certain number of busted QSOs just from fading, weak
signals, etc. But I'm amazed how many stations there are
who make dozens or hundreds of contacts, but never send more than
a single SNR frame, and never send an "R" frame.
I used a script to scan my decode log, and there are literally
hundreds of stations who never complete a QSO — one SNR
report is all you get from them. I drop these guys in the
blocked-call list, too.
The number of calls in the blocked list drifts between 8% and 12%
of the total number of unique calls in my FT8 logbook. It seems
unfortunate that one in ten licensed operators either can't figure
out how to run a mode that is already mostly automated, or just
don't care to do so in a minimally friendly way. I suppose
it does help explain why online social media is such a mess.
In fairness, my operation isn't perfect, and both I and the
software do make mistakes. At the very least, I do try
to operate kindly...
On the bright side, the outboard automation is very helpful when
it comes to dealing with misbehaving stations. Instead of
me having to handle each and every malfunctioning caller, the
automation does it for me, usually by blocking the call.
Writing automation rules to detect such things is simple, and it
really does help keep the QSO rate up. My "robot"
earns his money.
I would not have done FT8 without the extra automation. To be
honest, with all the "liddy" behavior, I don't see how
people operate without extra automation. Some
have described FT8 as "watching paint dry," and I tend
to agree. Automating the WSJT-X user interface is definitely
"working smarter, not harder."
Now let's talk about more mundane subjects...
Aren’t "Robots" Against the Rules?
As with many things, permissible operation depends on the regulator issuing your license, and how you operate. So there is no single nor simple answer to this.
In the US,
FCC rules
only address "automatic" operation
as used to ensure rules-compliance without a control operator
present at the control point (see
47 CFR 97.3(a)(6)).
Operation without a control operator is restricted to specific
frequencies, and, in the case of digital modes, to specific bandwidths and related technical
considerations (see
47 CFR 97.221).
However, the US rules appear to be silent regarding the level of automation employed while a control operator is present. And this makes sense, even in terms of older modes, such as RTTY or CW. If you visit any serious contest station, you will find very high levels of automation of transmitted signals. Software macros are an obvious example, controlling not only content, but the timing of T/R switching.
Other modes, such as ALE, actually require such high levels of automation, and these modes can even do automated frequency selection, in addition to timing and content decisions.
WSJT-X itself takes this a step further, automating the content and timing of entire sequences of messages, which it calls "auto-sequence."
Nobody seriously questions whether such operation is permissible in
the presence of a control operator. In fact,
ARRL itself has
repeatedly endorsed
the use of software, including WSJT-X, with these features.
They even endorse the use of the mode and software for
logbook stuffing.
As long as a control operator is present at the control point during transmission, the discussion of whether high levels of UI automation are permissible under US rules appears to be moot.
If you live or operate outside of US FCC jurisdiction, you should consult the regulator(s) there, of course.
Things get a bit different when referring to contesting
rules...
E.g., the ARRL contest rules make a half-hearted
attempt to disqualify contest contacts where the control
operator didn’t explicitly initiate each contact. Even
here, the rule text is poorly written. Here's an example
from the
RTTY Roundup rules,
fetched February 2023:
Each contact must include
contemporaneous direct initiation by both operators making a
contact...
This language doesn't do anything to prevent robots — even
by operators who intend to follow the rules. If a robot
calls CQ for four minutes, and makes four contacts, how is the
human starting that CQ run any less "contemporaneous"
than a human operator initiating a CQ run that lasts four four
minutes and makes one contact? In both cases, the human
started an automation sequence that did the rest of the work.
More importantly, distinguishing a well-written FT8 "robot"
from someone using only stock WSJT-X is impossible, since the message
timing and content could easily be identical between the two cases.
What ARRL has missed is that robotic communications are part
of the design of FT8. When they endorsed such modes for use
in their contests, the horse has left the gate — there will
be robots in all FT8 contests, because WSJT-X is already a robot.
Aren’t "Robots" Still a Bad Idea?
A frequent objection to "FT8 robots" is centered around
how much automation is being used. WSJT-X by itself is already
highly automated — I would estimate that WSJT-X contains 95%
of the automation needed to make multiple contacts without operator
intervention. It does not provide enough interface for 100%
automation of operations, since tasks like band and frequency
selection still have to be done by hand.
In normal FT8 operation, the difference between the "stock"
automation and the popular idea of a "robot" is, at most,
a double-click action per contact. A double-click from the mouse
initiates a "pounce" operation, while a single click
initiates a CQ run. As a result, objections to automation
of FT8 operation are nothing more than a matter of degree, and
a small degree at that. People can object to 90%, 92%,
or 99% automation, but such distinctions are essentially
subjective.
Without complete automation of all needed tasks, unattended
operation is not advisable, even where regulations permit. In
the US, the allowed frequencies for unatteneded operation overlap
with typical FT8 "watering holes" on the VHF bands
only. But increasing the level of automation can make
attended operation more smooth and efficient.
Another common objection to "FT8 robots" is that the
typical 3kHz-wide "watering hole" frequencies used by
FT8 may become congested if people run automation over long
periods of time. The assumption is that requiring a human
to click something for each contact will somehow introduce enough
delay between contact attempts to prevent congestion.
The problem with the "congestion" argument is that it just doesn’t scale. What’s the difference between ten robots and twelve humans? At some point, popularity will cause the same issues, even if no "robots" are running amok on the bands.
The solution to congestion is the same as for all other modes — hams need to learn to spread out in the band, and not rely on a single 3kHz voice channel on each band. Does this require hams with older radios to "spin the dial" now and then? Of course it does, but blaming "robots" for congestion caused by popularity does a disservice to everybody on the air.
Newer receivers will likely solve the "congestion" quesiton
for us. A
$30 RTL-SDR can gulp
down dozens of kiloherz and even present them to the decoder software;
so as long as WSJT-X can decode more than 3kHz at a time, the "watering
hole" can be as large as needed.
Final Thoughts
The exercise of improving the automation of WSJT-X was unexpectedly rewarding. It also helped me understand the popularity of the mode a bit better.
I still prefer modes that allow proper conversation. There are some some very capable modes that perform very well in poor SNR conditions, such as Olivia and PSK-R, among many others.
Then again, in the age of Twitter, I’m going to have to make the most
of short-message modes, because they are certainly
en vogue.
But I’m going to make it easy on myself, and on my mouse hand, to do so.
—
Copyright (C) 2023 by Matt Roberts, KK5JY.
All Rights Reserved.