WSPR with a vector network analyzer

I’ve been playing a lot with my N2PK VNA lately. Not only learning how to measure things (using the wonderful VNA tutorials of PA4TIM), but also how it works internally, and how I can control it from an Arduino. I can already set the frequency and phase of the two frequency generators, and I can read out the ADC.

Meanwhile, at the Radio Club Leuven, there has been a huge interest in WSPR lately, a low-power beacon-like digital mode, ever since Wim ON3ZOE demonstrated running WSPR with a Raspberry Pi. By hooking up an I/O pin to an antenna, with only a filter in between to remove the harmonics, he has gotten all the way to Greenland, 3500km away from Belgium. Hmm…

Arduino controlling the VNA

Arduino controlling the VNA

This gave me the idea to try transmitting with my VNA. I first connected the instrument to my oscilloscope, and measured 0.3Vrms @10MHz over a 50 Ohm load. Unlike a capacitor or an inductor, a resistor has no way to temporarily store energy, it must ‘spend it all’. So we can simply calculate the power using the formula P=V^2/R, or (0.3V)^2/50Ω, or 1.8mW. That’s close to 3dBm.

Then I needed to generate the tones to transmit. I found a link describing some other experiments with an Arduino and a similar DDS to the one used in the VNA, but it turned out to be a bit out of date when it came to generating the list of tones. This is the command I used:
./wspr0 -X -t -c ON8VQ -g JO20 -d 3 -o /tmp/test.wav | awk '{print $2}'

With these codes, it’s just a matter of formatting then into an array and you can start generating tones, each number produces a signal 683ms long and 1.4648Hz times that number above your base frequency.

To start each frame at the even minute mark, I wrote a small program on my PC that sends a character ‘S’ to the Arduino when it’s time to start.

I’m very pleased with the results so far: I’ve been spotted up to Denmark(707 km or 439 miles) with my silly setup, sending 2mW into a G5RV tuned to 30m.


One weird effect I noticed: I can spot myself using my SDR transceiver, without using an antenna. Not only that, I also receive the signal 100Hz above the real signal. I think somehow the signal gets received through the power lines. Belgium has a 50Hz AC frequency, 100Hz is 2 times 50Hz. Somehow, there must be a connection. Further tests are required to determine if the second tone gets generated inside the VNA or somewhere else. In any case, the signal is 20dB below the noise floor of the receiver, but it still gets picked up and decoded correctly. I’m baffled.


In case anyone is interested, the source code is all available. You may find it useful if you want to do something similar (sending start signals to an Arduino at specific moments, e.g.), or if you also have an N2PK VNA (it’s a wonderful instrument – build one!).

VNAWSPR source code

Leave a Reply

Your email address will not be published. Required fields are marked *