JT65 is a slow protocol for propagation reports. In short it takes 60 seconds to send 13 characters. Then you wait 60 seconds for a reply, and repeat.

The 60 seconds are actually 1 second silence, 46.872 second of signal, then another 12.128 seconds of silence, allowing for clock drifts and for a human to choose the reply.

The mode is this slow in order to add a lot of redundancy and to make it easier for the receiver to dig out a signal way below the noise floor. It was originally meant for making contacts by bouncing signals off the moon, which has a path loss of ~250dB. Someone even managed a JT65 moonbounce on 10 Watts using JT65 with gear you and I could buy/build! That’s the power of a low energy light bulb!

I wanted to do propagation experiments with SDR, with low power in various frequency bands, but couldn’t find a GNURadio module for JT65. So I made one.

The JT65 specification is very well written, except for the parts it says “the code is the specification”. Which would normally be fine, but the code is in Fortran and Fortran is terrible.

JT65A is under 200Hz wide, which means that with an SDR you can put many many channels in parallel. You could run Codec2 at the highest quality in 500kHz, if you don’t mind the 60 second delay. Sure, half a MHz is a lot, but the signal can be picked up way below the noise floor with a good receiver. (my receiver is not yet good)

And with everything in GNURadio you can speed up transmissions arbitrarily, or more accurately as far as SNR will allow. This is also why simply taking the output of WSJT-X as audio was sufficient. I want to be able to play with all the parameters fully.

Successful decode of JT65C sent from BladeRF x40 to USRP B200 on 2.3GHz: