The "KA9Q Radio software suit" is a an ingenious sort of a SDR program suite. It is capable of receiving a huge number of frequencies simultaneously. I believe that this is a unique feature of this applications. It seems to go back to the original *nix philosophy of "small is beautiful" e.g. small well written applications that do one job and do this one job very well. Because there is no graphical ballast, it will perform its task on the most modest comput-hardware. Meaning it will run on a Raspberry Pi system starting with the Pi3. Note, that there is no need for an expensive GPU nor the need to use virtual audio cables or a Soundcard for that matter.
Because of the "multiple frequencies simultaneously" capability I've set up a WSPR receiver for my QTH so that during times that I do not operate I can at least monitor band activity and/or propagation. Initially I will monitor from LF (136kHz) to the end of HF (28MHz). If this is going to workout well I will also start building a system for VHF/UHF.
Depending on the SDR one is going to use there is a requirement for a fast to really fast USB port. In my case I'm going to use the RX888M2, which needs a really fast USB3 port to stream 32 MHz of bandwidth in one go across the port. However, if I would use my Pluto or RSPdx and any of the TV-Dongles I can get away with a speedy USB2 port and for the SDR-IQ with it max 192kHz a slow USB port will do.
I can't stress this enough, the use of good usb cables is a requirement (not to long and it should have good shielding). Additionally, even though all my cables come with a molded choke, I do add additional choke(s) to all of my cables. I've had good success with that however, if that doesn't help reducing the noise from the USB/PC connection then "these" are apparently very good in suppressing CMC noise (EMI).
Below are the steps that I used to get the system up and running. And I believe that if you follow those steps you will be able to get a working "Multi Frequency WSPR receiving System" up and running in no time.
I've had a spare little PC (NUC) lying around (I7-4765) with 8GB of memory and a 250GB SSD which I bought second hand for about A$250. My installation is based on Debian Version 11.7 (Bullseye) and all following steps are based on this OS. The reason to use the NUC was to have both the SDR and the WSPR decoder running on a single host. The WSPR decoder is chewing up all the available CPU resources.
If you go with the Pi solution I recommend at least a Pi4-4GB and to install Debian Bullseye.
WARNING: If you are going to use a Raspberry PI as the compute resource make absolutely sure that you have enough current available to support the Pi and the RX888! I use a home made 5V 10A Power-supply which is feed of the shacks 12V rail. I've tried with a powered USB-HUB to no avail!
INFO: I have highlighted text in bold, this is so one can copy and then paste the copied text into a terminal instead of typing everything into the terminal. Don't forget to press <Enter> at the end. Command returns are displayed in courier.
NOTE: sudo didn't work for me out of the box.
There are many ways to fix this issue however, I did it this way:
$ su -# echo "$(who am i | awk '{print $1}') ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(who am i | awk '{print $1}')# chmod 440 /etc/sudoers.d/$(who am i | awk '{print $1}')# ls /etc/sudoers.d/$(who am i | awk '{print $1}')-r--r----- 1 root root 27 May 28 20:21 /etc/sudoers.d/<your username>
$ echo "build-essentiallibusb-1.0-0-devlibusb-devlibncurses5-devlibfftw3-devlibbsd-devlibhackrf-devlibopus-devlibairspy-devlibairspyhf-devlibrtlsdr-devlibiniparser-devlibavahi-client-devportaudio19-devlibopus-dev" > /tmp/required
$ for _required in $(cat /tmp/required); do sudo apt install $_required -y; done
$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
I find it much easier to work with names rather then with ip-addresses and port-numbers, as such I'd use the Multicast DNS function of the AVAHI Daemon. Your mileage may vary though!
$ sudo systemctl start avahi-daemon.service$ sudo systemctl status avahi-daemon.service
avahi-daemon.service - Avahi mDNS/DNS-SD StackLoaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)Active: active (running) since Sun 2023-06-11 22:16:53 ACST; 3 days agoTriggeredBy: ● avahi-daemon.socketMain PID: 548 (avahi-daemon)Status: "avahi-daemon 0.8 starting up."Tasks: 2 (limit: 9342)Memory: 1.3MCPU: 15.899sCGroup: /system.slice/avahi-daemon.service├─548 avahi-daemon: running [sun.local]└─566 avahi-daemon: chroot helper
Not needed in the use case.
First check:
$ locale -aCC.UTF-8en_AU.utf8POSIX
$ sudo dpkg-reconfigure locales
Generating locales (this might take a while...)en_AU.UTF-8... doneen_US.UTF-8... doneGeneration complete.
$ locale -aCC.UTF-8en_AU.utf8en_US.utf8 <-- requiredPOSIX
$ mkdir tmp
$ cd tmp$ wget https://github.com/ka9q/ka9q-radio/archive/refs/heads/main.zip
$ unzip main.zip$ ls -ltotal 2.4Mdrwxr-xr-x 4 hw hw 4.0K May 28 16:15 ka9q-radio-main-rw-r--r-- 1 hw hw 2.4M May 28 18:16 main.zip
$ export LANG=en_US.UTF-8
$ cd ka9q-radio-main
NOTE: There are two (2) Makefiles, Makefile.linux and Makefile.pi. If you use a RaPi you need to link Makefile.pi to Makefile
$ ln -s Makefile.linux Makefile$ sudo make install
NOTE: Depending on your system this can take a while. Creating a wisdom file on a RaPi took a while. I cooked a meal, ate the meal, check the RaPi .... not yet .... went and watch a movie ... check again and voila done! So be patience grasshopper.
$ fftwf-wisdom -v -T 1 -o /tmp/wisdom rof500000 cof36480 cob1920 cob1200 cob960 cob800 cob600 cob480 cob320 cob300 cob200 cob160
Or if you are keen and like to know how long it took to create your wisdom file you could run the below.
$ time fftwf-wisdom -v -T 1 -o /tmp/wisdom rof500000 cof36480 cob1920 cob1200 cob960 cob800 cob600 cob480 cob320 cob300 cob200 cob160
fftw-wisdom: system-wisdom import failedPlanning transform: cob160Planning transform: cob200Planning transform: cob300Planning transform: cob320Planning transform: cob480Planning transform: cob600Planning transform: cob800Planning transform: cob960Planning transform: cob1200Planning transform: cob1920Planning transform: cof36480Planning transform: rof500000real 4m14.131suser 4m8.088ssys 0m0.048s
$ test -s /var/lib/ka9q-radio/wisdom && sudo mv /var/lib/ka9q-radio/wisdom /var/lib/ka9q-radio/wisdom.old
$ sudo mv /tmp/wisdom /var/lib/ka9q-radio/wisdom$ sudo chown $(who am i | awk '{print $1}').radio /var/lib/ka9q-radio/wisdom
$ sudo apt install wsjtx -y
After that is finished it's time .... to configure/setup KA9Q-Radio for our intended purpose.
There are lots of config files and to work through all off them you'll want/need to read the documentation from here however, since I'm going to use the RX888 to do WSPR only as such I've created a new rx888.conf config file. The # and ; a comment markers. You can either modify this file with a text editor like vi or nano.
Before you copy and paste the next configuration item (below, you need to establish what the active network interface is being named! In the rx888.conf file we has a statement starting with iface. This value is system dependent and you need to find that name before you can progress any further.
On a RaPi it is most likely eth0, but on other systems it could be something else. E.g. on my system it is eno1.
You'll be able to check using the following:
$ ip a | grep "mtu 1500" | grep UP | awk '{print $2}'eno1: <- This is what the NIC is called on my system
Whatever the above command output shows, you'll might need to change the iface value in the below script. E.g. if it shows eth0 your iface line should read iface = eth0.
The below will create a backup of the /etc/radio/rx888d.conf file first, before creating a new /etc/radio/rx888d.conf file.
$ sudo mv /etc/radio/rx888d.conf /etc/radio/rx888d.conf.bck$ sudo cat << __EOF__ > /etc/radio/rx888d.conf[rx888-loop]# VK5HW customizeddescription = "RX888 40m Delta-Loop"firmware = SDDC_FX3.imgsamprate = 64800000 ; 2^8 * 3^4 * 5^5iface = eth0 ; replace this with your iface namestatus = rx888-status.localdata = rx888-pcm.localssrc = 10;gain = 1.5 ; dBgain = 10 ;dB - close to the Noise Floor, might have to increasegainmode = high ; higher gain range
__EOF__
Next we need to configure the virtual receivers. These we do with the radiod@wspr.conf file.
$ sudo mv /etc/radio/radiod@wspr.conf /etc/radio/radiod@wspr.conf.old$ sudo cat << __EOF__ > /etc/radio/radiod@wspr.conf[global]overlap = 5blocktime = 20input = rx888-status.localsamprate = 12000mode = usbstatus = hf.localfft-threads = 2[WSPR]# Bottom of 200 Hz WSPR segments on each band. Center is 1500 Hz higher# sample rate must be 12 kHz as required by wsprddata = wspr-pcm.localfreq = "136k000 474k200 1m836600 3m568600 5m287200 7m038600 10m138700 14m095600 18m104600 21m094600 24m924600 28m124600"__EOF__
That's it folks, we are ready to start KA9Q-Radio! Make sure the RX888 is plug into the correct USB Port and then to be sure to be sure REBOOT the system.
$ sudo reboot
After the reboot, login to the system and start the rx888d(river) using the rx888-loop configuration.
$ /usr/local/sbin/rx888d rx888-loop &
NOTE: The & indicates that we would like the program (job) to run in the background.
If everything is OK the following output can be seen:
$ Using config file /etc/radio/rx888d.confLoading firmware file /usr/local/share/ka9q-radio//SDDC_FX3.imgFirmware already loadedUSB speed: 4Successfully claimed interfaceSamprate 64,800,000, Gain 10.0 dB, Attenuation 0.0 dB, Dithering 0, Randomizer 0, USB Queue depth 16, USB Request size 8 * pktsize 16384 = 131,072 bytesservice 'RX888 40m Delta-Loop._ka9q-ctl._udp' -> rx888-status.local (239.132.105.12) establishedservice 'RX888 40m Delta-Loop._rtp._udp' -> rx888-pcm.local (239.10.102.92) establishedRX888 40m Delta-Loop: iface eno1; status -> 239.132.105.12:5006, data -> 239.10.102.92:5004 (TTL 0, TOS 48, 24576 samples/packet)
If this all looks ok the PC is talking to the SDR and it is time to start the demodulators.
$ /usr/local/sbin/radiod /etc/radio/radiod@wspr.conf &
$ KA9Q Multichannel SDRCopyright 2018-2022 by Phil Karn, KA9Q; may be used under the terms of the GNU General Public LicenseLoading config file /etc/radio/radiod@wspr.conf...Acquired front end control stream rx888-status.local (239.132.105.12)Acquired front end data stream 239.10.102.92:5004 (239.10.102.92)Front end sample rate 64,800,000 Hz, real; block time 20.0 ms, 50.0 Hzfftwf_import_system_wisdom() failedfftwf_import_wisdom_from_filename(/var/lib/ka9q-radio/wisdom) succeededservice 'wspr._ka9q-ctl._udp' -> hf.local (239.83.95.156) establishedProcessing [wspr]service 'wspr._rtp._udp' -> wspr-pcm.local (239.72.24.12) established12 demodulators started12 total demodulators started
Next start start the wspr-decoder:
$ wspr-decoded wspr-pcm.local
And voila we are starting to see decodes:
$ <DecodeFinished><DecodeFinished><DecodeFinished><DecodeFinished><DecodeFinished><DecodeFinished>1518 -19 0.7 0.475683 0 VK6LX OF88 30<DecodeFinished><DecodeFinished><DecodeFinished>1518 -17 0.3 7.040113 0 RU0LL PN53 33<DecodeFinished>1518 -27 0.4 14.096975 0 WS5L EM13 371518 -12 0.2 14.096984 0 WB7AJP CN87 331518 -23 0.3 14.097017 0 <KR6RG> DM13EM 23<DecodeFinished><DecodeFinished>
Looking at our home directory we can see that we have a few new directories. These are the directories of the individual virtual receivers where all the WSPR files go.
$ ls -ltotal 104Kdrwxr-xr-x 2 hw hw 4.0K May 29 00:54 10138700drwxr-xr-x 2 hw hw 4.0K May 29 00:54 136000drwxr-xr-x 2 hw hw 4.0K May 29 00:54 14095600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 18104600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 1836600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 21094600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 24924600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 28124600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 3568600drwxr-xr-x 2 hw hw 4.0K May 29 00:54 474200drwxr-xr-x 2 hw hw 4.0K May 29 00:54 5287200drwxr-xr-x 2 hw hw 4.0K May 29 00:54 7038600
Lets have a look what's inside these directories:
$ ls -l 5287200total 8.7M-rwxr-xr-x 1 hw hw 2.1M May 28 00:01 230527_1430.wav-rwxr-xr-x 1 hw hw 1.9M May 28 01:17 230527_1546.wav-rwxr-xr-x 1 hw hw 1.4M May 28 09:05 230527_2334.wav-rwxr-xr-x 1 hw hw 2.6M May 29 00:47 230528_1516.wav-rwxr-xr-x 1 hw hw 2.1M May 29 00:57 230528_1526.wav-rw-r--r-- 1 hw hw 0 May 28 00:33 ALL_WSPR.TXT-rw-r--r-- 1 hw hw 0 May 29 00:55 hashtable.txt-rw-r--r-- 1 hw hw 0 May 29 00:55 wspr_spots.txt-rw-r--r-- 1 hw hw 452 May 29 00:55 wspr_timer.out-rw-r--r-- 1 hw hw 2.0K May 29 00:55 wspr_wisdom.dat
$ ls -l 14095600total 8.8M-rwxr-xr-x 1 hw hw 2.1M May 28 00:01 230527_1430.wav-rwxr-xr-x 1 hw hw 1.9M May 28 01:17 230527_1546.wav-rwxr-xr-x 1 hw hw 1.4M May 28 09:05 230527_2334.wav-rwxr-xr-x 1 hw hw 2.6M May 29 00:47 230528_1516.wav-rwxr-xr-x 1 hw hw 2.1M May 29 00:59 230528_1528.wav-rw-r--r-- 1 hw hw 36K May 28 23:34 all_wspr.bck-rw-r--r-- 1 hw hw 3.0K May 29 00:57 ALL_WSPR.TXT-rw-r--r-- 1 hw hw 3.6K May 29 00:57 hashtable.txt-rw-r--r-- 1 hw hw 45K May 28 23:34 upload.log-rw-r--r-- 1 hw hw 74 May 29 00:57 wspr_spots.txt-rw-r--r-- 1 hw hw 452 May 29 00:57 wspr_timer.out-rw-r--r-- 1 hw hw 2.0K May 29 00:57 wspr_wisdom.dat
In the 14095600 directory we find two additional files, all_wspr.bck and upload.log. These are files that my upload script is producing. The .bck file is an archive of ALL_WSPR.TXT and the .log file is for error checking.
$ cat 14095600/ALL_WSPR.TXT230528 1508 -18 -0.91 14.0969794 DP0POL JQ26 37 0 0.12 3 1 0 0 34 33 -120230528 1508 -15 0.19 14.0969838 WB7AJP CN87 33 1 0.28 1 1 0 0 39 20 16
As it stands you now have a MULTI BAND WSPR DECODING SYSTEM.
And now to upload the results to WSPRNet, that is also quite easy. It is done with a one-liner:
$ curl -F allmept=@ALL_WSPR.TXT -F call=<your call> -F grid=<your grid> http://wsprnet.org/meptspots.php
There is a very similar site, PSKREPORTER which not only has a database for WSPR but for a lot of other digital modes. However, I've not (yet) found a way how to upload my results to that repository.
I have automated this on my system using the *nix cron facility. I first created a script to archive the reports and create a log file for error checking. If you like to use the script, it can be found here.
And here is my crontab: (copy the below to your crontab)
1,7,13,19,25,31,37,43,49,55 * * * * ~/scripts/upload_wspr_data.sh VK5HW PF94hk
It basically runs every 6 minutes, a minute after or before a WSPR decode.
Oh, and if you like to see if I received you go to WSPR rocks, which is an excellent tool for mapping, charting and other visualisation.
So that's basically it.
PLEASE NOTE, that this is NOT a how to use KA9Q-Radio, rather a quick way to show how easy it is to setup a multiple frequency WSPR receiving system using parts of the KA9Q-Radio suite.
There are other modes that can be setup and monitored, if you like to use other modes or even would like to manually tune through the bands and listen you'd need either a sound card or understand how to use "MULTICAST" streaming. The options are not quite endless but ...
Next on the list, get some horizontal antenna for a 2m/70cm/23cm installed and setup a WSPR VHF/UHF receive system.
Oh and a little bragging ...
No comments:
Post a Comment