I've been spending a lot of time recently listening to WSPR beacons. The recent picoballoons that I have launched all used WSPR for to transmit their location and altitude. WSPR is a great for solar-powered picoballoons because the transmit power is on the order of 10 dBm (10 milliwatts), which is extremely low.
One night, I was just passively watching the WSPR decodes while doing other things on my shack computer. Every once in a while, I would notice a WSPR beacon that was outside of the 200 Hz WSPR band, and therefore wasn't decoded by WSJT-X. I thought this was interesting, who was transmitting out of the band? The transmissions seemed to always be on the high side.
This waterfall plot shows the 200 Hz WSPR decoding band as 1400 to 1600 Hz, denoted by the green bar at the top. You can see the signal marked with the red arrow is just above this band. This signal is also tilted slightly to the left, indicating that as the transmitter heated up, the frequency decreases by a few Hertz. So this transmitter is probably not using a good frequency source.
After waiting for the right 2 minute period to arrive, manually tuning the receive knob, tuning too much in the wrong direction, then over-correcting again, I finally found out that the "offending" signal was transmitted by Owen KJ6HMV. He lives just down the block from me, which is why his signal is bright yellow in the waterfall display.
I sent him a message, and he said he was using the QRPi transmitter. This board mates to a Raspberry Pi, and uses the Pi's onboard PWM modulator for the WSPR packet generation. The board includes some filters and small-signal amplifier to make sure the signal is clean and doesn't radiate harmonics. There's no frequency adjustment possible on with this kit, and it's using the crappy crystal oscillator on the Raspberry Pi.
After seeing this WSPR packet show up in the WSPR database, showing that it was within the 200 Hz WSPR band and other stations successfully decoded it, I realized that my Kenwood TS-2000 transceiver is off frequency. This transceiver has a 0.5 parts per million (ppm) temperature compensated crystal oscillator (TCXO), but the radio was built over 10 years ago and is getting a little bit tired.
As crystals age, they drift lower in frequency, causing the apparent dial frequency to increase. For example, if I set the dial to 10 MHz, but the crystal is old and has slowed to 9 MHz, a signal that is actually at 10 MHz signal will appear as 11 MHz. This is the exact problem I saw, as Owen's signal was transmitted within the WSPR band but I saw it as 10 Hz too high.
The writer of WSJT-X knows that there are a lot of old off-frequency radios in use around the world, and those radios can't easily be calibrated or corrected. So included in WSJT-X is a whole frequency calibration routine, where you tune in to known calibrated signals, such as WWV or CHU, and measure how far off your receiver is. Then you can add a software frequency-dependent offset to correct for frequency errors.
The frequency calibration mode is very easy to use. If you have Computer-Aided Tuning (CAT) enabled then it automatically switches frequencies for you. The radio should be tuned 1500 Hz below the carrier frequency, so the carrier is at 1500 Hz in the audio waterfall. Measuring the AM carrier frequency is easy to do, as it's very powerful and not modulated.
This screenshot shows the frequency calibration in progress. Each horizontal band is a different AM radio stations, with frequency annotations on the right side. As you can see, the stations higher in frequency have bigger offsets from the 1500 Hz marker. At the bottom of the waterfall you can see the carrier is 50 dB stronger than the noise floor.
Clicking on the "Measure" checkbox will start writing the
fmt.all file in the log directory. The file is just a table of carrier frequency, measured frequency offsets, and power levels. Readings with low SNR (shown with an asterisk) should be deleted, and I also had to delete all the AM broadcast station data for some reason. If the
fmt.all file looks good, click "Solve for Calibration Parameters" and the results should pop up.
This measurement and calculation showed that the TCXO is approximately 1.9 ppm off. This is much more than the specified 0.5 ppm, but it's been 10+ years, so this is not surprising. If you click "Apply", WSJT-X will compensate for this error when tuning frequencies in the future. This correction brought Owen's WSPR signal back down into the decode passband of WSJT-X.
Hardware Calibration: Adjusting the TCXO
It's nice that there is a software way for frequency calibration, but this doesn't help me when I'm spinning the dial chasing Big DX. I know, I know, a 2 ppm frequency error is not big enough to be a problem at all, especially on SSB. But is there a way to modify the radio to get rid of this error? Luckily, the smart engineers at Kenwood included a hardware calibration feature.
I didn't have a plastic screwdriver, so I whittled one out of a thin wooden dowel. It's important not to use conductive tools when adjusting powered electronics, as the metal might add capacitance or inductance to the device you are adjusting, or the metal screwdriver might short something if it touches some other part of the circuit. I turned my radio over, pulled off the bottom cover, and quickly found the Kenwood X400 TCXO unit.
With the radio running and TCXO warmed up, I listened to the highest WWV station possible. In my case, I was doing this during the day and could receive 20 MHz WWV. Then slowly twiddle the trimmer until the offset is zero. I twisted my trimmer about 1/8th of a turn to zero out 2 ppm (40 Hz at 20 MHz). Within the frequency calibration mode of WSJT-X, the dial frequency is 19.9985 MHz, so the WWV carrier should be at 1500 Hz in the audio waterfall.
After the adjustment, I put the bottom cover back on and re-ran the calibration routine.
As you can see, all of the calibrated time signals are pretty close to 1500 Hz. The error was measured at -0.110 ppm, which is pretty good! I twisted the trimmer pot a bit too far, so as the crystal slows down even more it will drift thru 0 ppm then on to the positive numbers. If the frequency drift over time is linear, which it should be, I might need to re-calibrate in a few years.
Another interesting data point in this waterfall plot is the Lowest Usable Frequency. When I made this measurement at around 0130 UTC (630pm Pacific time) in the summer, the LUF was somewhere between 3.33 and 5.00 MHz. CHU at 3.33 MHz was not received, but WWV at 5.00 MHz is somewhat strong.
One more interesting data point on this waterfall plot is the frequency stability of the local AM broadcast station KFAX, which is pumping out 50 kW only 17 miles away. Now that my receiver is calibrated within 0.1 ppm, the plot shows that KFAX is approximately 4 ppm (or 4 Hz) high. This is not surprising because frequency stability is not important for AM broadcast stations.