1.
Introduction
Currently Hermes2 is mainly a project intended for teaching myself
the development of Software Defined Radio functions and Digital
Signal Processing. I have built into Hermes2 an FFT-based Spectrum
Display for the Receiver with a maximum frequency range equal to
the DDC sampling rate (normally 192kHz). Hermes2 has de-modulators
for Frequency Modulated, Amplitude Modulated, Single Side band
(USB/LSB) and for CW (Morse code) transmissions. Hermes2 also has
corresponding Modulators for AM, FM, SSB and CW modes. There are
Controls in Hermes2 for setting up HPSDR Protocol I compatible SDR
Transceivers for Transmission and Reception on the HF amateur
bands. Hermes2 has functions for displaying a Wide band Receive
frequency spectrum from 0 to 38.4 MHz, using the Wide band (raw)
sample streaming feature of HPSDR Protocol I Transceivers.
Please note though, I only have access to a Hermes Lite 2
transceiver and Hermes2 is tested on this device only.
Receiver Controls include the Center Frequency "Spin Dial" for entering the Center Frequency, a Band Combobox for selecting one of the available Amateur Bands, selectable Automatic Frequency Control (AFC), Signal Strength Indicator (of level bar type), Combo Boxes for selecting ADC Sampling Rate, ADC Buffer Size, FFT/Spectrum Bandwidth, Modulation Mode, Weaver Frequency and Demodulator Bandwidth. The decay rate of the Audio Derived AGC (ADAGC system) can be set by a Slider Control, from very slow to very fast as needed. A selectable Noise Activated Squelch with a Slider Control is available but in FM mode only. Sound Volume can be controlled using another Slider Control. The Bookmarks button opens a tree-view window form which the user can select a Station with its associated Frequency and Modulation Mode. The user can also save a favorite Frequency and Mode combination in the Bookmarks under a Station name.
Transmitter Controls include the Center Frequency "Spin Dial" for entering the Center Frequency, a Band Combobox for selecting one of the available Amateur Bands, Combo Boxes for selecting Modulation Mode, Weaver Frequency and Modulator Bandwidth. For Voice modes (SSB, AM and FM) a Slider allows the control of Microphone Level, and for CW modes a Slider allows the control of Side tone level, and another one the control of Keying speed in Iambic modes.
Hermes2 includes a Chebyshev Low Pass Filter which is used as a Low Pass "Roofing Filter" of the Sample Stream from the SDR device and also for setting the bandwidth of the FFT-based Spectrum Display. Individual Demodulator functions also use Chebyshev filters to set the Demodulator Bandwidth according to the user's selection of Modulation Mode and for narrowing signal input to the AFC function. Similarly, Chebyshev LPF's are used in Modulator functions to control transmitted bandwidth. Play Back of demodulated signals is via the computer's Sound Card and by using the ALSA sound system API.
As of version 0.7-alpha, Hermes2 includes functions for receiving and decoding Time Signal stations on VLF and Long Wave. Currently Hermes2 can receive time and date data from MSF on 60kHz, RBU on 66.667kHz, DCF77 on 77.5kHz and TDF/Allouis on 162kHz. The detection of data bits and synchronization signals is done by pattern matching rather than hard thresholding, so that Hermes2 can successfully copy weak time station signals even well outside the official range. For example, the MSF signal on 60kHz can quite often be received and decoded here in Cyprus, even though it is about 3500km away! Development of time station receiving and decoding functions was done using a Perseus SDR receiver and a 1/4L GP antenna for the 30m amateur band (7.5m high).
As of version 1.1-alpha, Hermes2 has support for what I called "Guest Modes", e.g. Amateur operating modes other than the basic SSB, CW and FM modes. These "guest" modes include (in Transmit/Receive mode) Hellschreiber, Olivia, PSK31, and RTTY. An SSTV Guest mode is under development and as of version 2.1 Hermes2 has a Receive-mode capability that works well and can decode the more commonly used SSTV formats. Transmit capability is under development and once successful will likely conclude development of Hermes2.
Besides the above two-way communication modes, Hermes2 has Receive-only Guest modes for CW/Morse decoding, VLF/LW Time and Frequency standard transmissions, HF WEFAX transmissions and a Decoder for the WSPR low-power global beacon network. And as of version 2.2-Beta, Hermes2 has full support for the Reed-Solomon Identifier system. Both TxID and RxID functionality is now available.
2.
Compilation
Please note that I use Void Linux
AMD64 which is a "bleeding edge" type distribution, so there
may be compilation and/or run time difficulties, if you are using a
relatively old distro. This is mostly true of the basic
dependencies like GTK+-3.22, Glade-3 and possibly the ALSA library.
The following libraries are also needed: libasound, libmath,
libgmodule-2.0, libpthread and libcurl.
To compile the package, it may be preferable to first run the included "autogen.sh" script in the package's top directory, to produce a fresh build environment. Then the "configure" script can be run with optional parameters to override the default settings and compiler flags, e.g: ./configure --prefix=/usr CFLAGS="-g -O2" will override the default /usr/local installation prefix and the "-Wall -O2" compiler flags.
Running "make" in the package's top directory should produce the executable binary in src/. Running "sudo make install" will use /usr/local/ as the default prefix or one specified by the user during configuration (normally /usr). The "Hermes2" binary will install into <prefix>/bin. The .hermes2/ working directory will be installed in <prefix>/share/examples/hermes2 and the doc/ documentation directory in <prefix>/share/doc/hermes2. Finally a short manual doc/hermes2.1.gz will be installed in <prefix>/share/man/man1/
After installation, when Hermes2 is run for the first time, it will create its working directory in the user's home and copy necessary files from the examples/ directory. The ~/.hermes2/hermes2/hermes2.glade file can be edited using Glade-3, if cosmetic changes are desired to Hermes2's Graphical User Interface, but only if the user knows what he is doing! ;-).
3. Operation
When Hermes2 is started for the first time, it will look for its
configuration file "hermes2.config" in its ~/.hermes2/ working
directory. If the config file is missing or is of an older version,
then Hermes2 will ask the user to create a new default config file
by opening a Configuration Dialog and using the Tabs below:
In the GEN tab, the user can specify the HPSDR Transceiver Device from the available supported types, the TCXO frequency Error in ppm, the ALSA PCM device for PC Sound output (normally hw:0,0 or hw:1,0), the Local (PC Sound) Enable flag, the DDC buffer size (normally 2k Samples) and the "Beep" signal volume.
In the RX tab, the user can specify the Sound Volume setting, the default receiver Frequency Band on start up, the DDC Sample rate (normally 192 kS/s) and the FFT/Spectrum frame rate in Frames/sec.
In the TX tab, the user can specify the Tx default Frequency Band at start up, the power output level for Tuning as a percentage of maximum, the PTT Hang time in mSec, the CW Hang time in mSec, the Tx Buffer Latency in mSec and the RF Delay in mSec (the time delay before RF is generated, after transmission is initiated). Once this default configuration is applied, it will be updated each time Hermes2 is quit by the user.
The geometry of open windows (e.g. window size and position) for the Main window, the Receiver window(s), the Station list, the Spectrum display window(s) and any Guest Mode windows are saved in the config file also. The settings of many of the controls in the Main and Receiver window(s) are also saved in the config. When Hermes2 is started, it will open and place the Main, Transceiver and Bookmarks windows as they were on quit and will restore the saved settings.
The GTK+-3 user interface4. Spectrum
Displays
As of version 0.4-alpha, Hermes2 has an FFT-derived Spectrum
display using the samples streams from the DDC's or the raw Wide
band stream. The Frequency range (bandwidth) of the Spectrum
display is selectable from the "B.Width" Combo box and the Frame
rate from the "Rate" Combo box. For the Wide band spectrum display,
the bandwidth is fixed at 1/2 the sampling rate of the ADC which in
the Hermes Lite 2 is 76.8 MHz, so the bandwidth is 0-38.4 MHz. The
source sample stream (Receiver DDC or Wide band) is selected by the
"Receiver" or "Wide band" Radio buttons and the display can be
stopped (frozen) using the "Stop" Radio button.
In this particular Spectrum display, the output bins of the FFT are normalized frame by frame so that the peak of the spectrum "Oscilloscope" trace will always be at the top 0 dB reticle line. The rest of the bins will be below this, depending on their value, which is effectively in relative dB's with a range from 0 to -90 dB. Therefore the Oscilloscope display is always a relative display rather than an absolute display, more common in other SDR Receiver clients.
The Waterfall display is produced from the same normalized FFT bins and uses some simple pseudo-colorization to indicate bin levels. The reticle lines represent elapsed time in seconds, as indicated in the left hand side scale. The Spectrum Display can be used to tune the Receiver to the frequency of any point of interest in it. This is done by clicking with the pointer on either the Oscilloscope or the Waterfall display and the click-tune functions will look a short distance either side of the click X coordinate and the point of highest value will be selected to calculate the desired frequency.
5. Bookmarks
List
As of version 0.8, Hermes2 includes a "Bookmarks" window, which can
be opened by clicking the "Bookmarks" Button in the Hermes2 main
window. The various entries are grouped by Mode or other common
characteristics and the display is in Tree mode. This window can be
used to select a Station that is already saved in the
~/.hermes2/bookmarks file, make and save a new Bookmarks entry,
edit an existing entry and delete it if so desired. Clicking on a
row in this window will enter the Frequency and Mode of the Station
into the Frequency control widgets of the Receiver. Also, clicking
the "Up" or "Down" buttons will move the selection accordingly, to
the next or previous row, again entering Station data into Hermes2
and the Receiver. The "Delete" button removes the selected row from
the List, while the "New" button enters a new blank row into the
list, to be edited by the user. This can be done manually, by
selecting the blank row and entering the Station Name, the
Frequency and the Mode. It is also possible to enter the latter two
from the current settings of Hermes2, by clicking with the middle
button on to the blank row. The Name of the Station will still have
to be entered manually. Finally, clicking the "Save" button will
save all entries in the Bookmarks window to the
~/.hermes2/bookmarks file in the user's directory. NOTE: The
Bookmarks window will "attach" to a Receiver instance when the
Start button is activated or if the Bands combo box setting is
changed. The Receiver and ADC index to which the Bookmarks List is
attached will show in the title of the Bookmarks window.
6. Time Signal
Reception:
As of version 0.7, Hermes2 has functions to receive, decode and
display the Date, Time, Summer Time in Effect, Leap Second, DUT1,
Parity Bit status and other data as transmitted by Time and
Frequency Reference stations on VLF frequencies. Currently Hermes2
can receive such data from the German DCF77 on 77.5kHz, the Russian
RBU on 66.667kHz, the British MSF on 60kHz and the French TDF on
162kHz. Please Note that the Hermes Lite 2 has little if any
sensitivity at VLF so unfortunately with a standard unit, reception
would be near impossible.
The time decoding function is activated by selecting TIME in the Guest Modes popup menu, which opens the Time Stations window for further action. In this window, the Time Station Combo Box allows selection of the Time station, while the Receive toggle button starts the relevant receiving and decoding functions. The Time Stations window has a display for the Date and Time, as well as many indicators for Status decodes and error conditions, depending on the Time Station. Some stations (e.g. RBU and MSF) transmit DUT1 too, while RBU transmits Julian Day and DUT data also. Please note that even in good conditions, it takes a few minutes for Hermes2 to sync with the time station and correctly decode date and time data.
After successful discovery, Hermes2 opens its Main Window from which "Transceiver" windows may be launched to work with the ADC. This is ADC0, since HL2 only has one ADC. By clicking the "Add TRx" button, a "Transceiver" window will open, up to a maximum of four. The Main window provides a combo box to select the desired HPSDR device, if there is more than one discovered. It also provides a "Configure" button to open the Configuration window and a "Quit" button to terminate Hermes2. In the Main window there are some widgets for the control of some basic features and displays of some parameters.
Receiving: With a "Transceiver" window open, receiving involves setting up the required frequency on the Receiver "Spin Dial" in the top row of controls, selecting Modulation mode and Bandwidth using the Combo boxes in the left column, then starting the Receiver using the "Rx Start" button. The sound volume can be adjusted using the "VOL" slider and the Audio Derived AGC decay rate can be adjusted using the "AGC" slider. In FM operation, the noise-derived no-signal Squelch can be adjusted using the "SQL" slider.
There are three ways to set the Receive Frequency:
(1) Using the mouse or track ball and setting the pointer over one
of the digits in the Receiver frequency spin dial. Then the scroll
wheel can be used to increase or decrease the value of that digit,
which in turn will increase or decrease the value of digits to its
left, as needed. Also clicking on a digit with the left or right
pointer button will increase or decrease the value of that digit
and clicking with the middle button will zero the digit.
(2) Using the "Band" combo box, one of the available Amateur Radio
bands can be selected and a preset frequency for the band will be
set in the Receiver's frequency spin dial. Then the frequency can
be adjusted as above to the required value.
(3) The Receiver Frequency and Mode can be set from the Bookmarks
window, by clicking on the required entry. The Up/Down button in
the bottom row of this window can also be used to go from one entry
to the next, as needed.
In some receiving modes (Synchronous AM, SSB, CW) the "AFC" check button enables the Automatic Frequency Control functions that can lock the receiver frequency to a steady carrier, within +/- 200Hz of the receiver center frequency. This is useful in Synchronous AM for locking the receive frequency to the AM signal's carrier and in CW mode can be used to lock the receive frequency to a reference transmitter on the air, such as WWV on 5, 10, 15 and 20MHz. The transceiver's error in its reference oscillator can then be determined and corrected by specifying this error in the Configuration window.
The "Zero Right" toggle button, when activated, causes the value of digits in the Receiver's frequency dial, to the right of a digit that is changed by the user, to be zeroed. This helps to keep the Receive frequency rounded to the digit the user is changing and is useful, since now radio amateurs appear to favor frequencies rounded to 1kHz is voice (SSB) modes and 100Hz in narrow band modes (CW etc). And finally, the "->Tx" toggle button enables the synchronization of the Transmitter's frequency and modulation mode with the Receiver's. This is useful for the more common Simplex type single-frequency Transmit/Receive operation on the bands. Any change to the Receiver frequency will be reflected in the Transmit frequency but Transmit mode will follow only for Receiver modes that are common to both.
Transmit Power o/p and VSWR are displayed by progress bars in the upper right of the top row of widgets. O/P power indication is from 0-100W and VSWR from 1:1 to 3:1. Output power can be controlled by using the horizontal slider under the P/O indicator. This slider sets up the maximum (peak) power in Watts for the ALC functions in Hermes2 and is effective in all modes. Power Amplifier (PA) control widgets are in the column to the right of the Spectrum display and they include the MOX toggle button and the Tune toggle button. The "Tune" toggle button causes the Transmitter to output a CW signal at the power level that was specified in the Configuration window (usually 50%). If needed, this power level can be changed using the power O/P control slider.
Operating Mode can be selected with the "Mode" combo box and for each mode family (SSB, AM, FM, CW), relevant control widgets will appear and can be used to change the built-in default parameters. For SSB, the bandwidth of the Low Pass Filter, used in the Weaver SSB generator, can be changed using the "B/W" combo box but this will affect the speech frequency range. The "CFO" combo box controls the Carrier Frequency Offset, e.g. the distance of the Weaver local "oscillator" from the cut off frequency of the LPF. This affects the range of speech frequencies generated by the Weaver SSB generator. An example: For SSB mode "USB-M" (USB Medium Bandwidth), the default cut-off frequency of the LPF is 2.6kHz and the CFO is 3.2kHz. But, due to the way the Weaver SSB generator works, the actual cut-off frequency of the two LPF's used will be 1.3kHz and the frequency of the Weaver "oscillator" will be 1.6kHz. This effectively means that the modulation frequencies will be in the range of (1.6 - 1.3)kHz to (2 x 1.3 + 0.3)kHz, e.g. from 0.3 to 2.9 kHz.
For the CW mode, there is some choice of sub-modes to use. "CW EXTERNAL" refers to CW transmission generated by functions built into Hermes2. The "CW INTERNAL" choice refers to a CW function built into the HPSDR firmware, which generates CW signals in response to a CW key plugged into the 3.5mm "KEY" socket. Please not though the HL2 does not generate a side tone.
8. Bugs and annoyances
I have fixed whatever bugs I came across testing Hermes2 but there
may be some hiding, waiting for the right conditions to appear.
Hermes2 is generally simplistic because my knowledge of modern DSP
theory and application is limited. In fact this project is more of
an effort to teach myself SDR transceiver techniques so there is no
advance "DSP Magic" here as there would be in professionally
developed software.
9. Version history
Please Note that the Hermes2 SDR client application for the
Hermes Lite 2 was based on Lhpsdr, a similar SDR client originally
developed for the ANAN-7000DLE MkII. The ANAN-7000DLE MkII uses the
HPSDR Protocol II for communication with its client application. It
was necessary to make extensive changes to the original source code
to make it work with the HL2, which uses Protocol I and its also
quite different (simpler) in hardware than the 7000DLE MkII. But
since this application is based on Lhpsdr and uses a lot of the
code in it, the version history of Lhpsdr is retained here.
Version 0.1-alpha: This was a simple console program to develop the basic HPSDR device discovery functions over the Ethernet connection.
Version 0.2-alpha: Added functions for sending and receiving data to the HPSDR device for basic set up (e.g. the General Packet and DDC Specific Packet).
Version 0.3-alpha: Added functions for configuring DDC's and receiving ADC sample streams from the device.
Version 0.4-alpha: Imported Digital filters and FFT Spectrum analysis functions from my "sdrx" SDR Receiver application, for processing incoming DDC sample streams.
Version 0.5-alpha: Imported Demodulator functions from my "sdrx" SDR Receiver application and adapted them for the HPSDR device protocols. These functions provide demodulation for FM (wide band or narrow band), SSB (USB or LSB), CW, AM and Synchronous AM.
Version 0.6-alpha: Produced an initial Graphical User Interface based on GTK+-3 and Glade-3.9999 This provided the Discovery Messages window, the Hermes2 Main window, which provides some control over the HPSDR device and a basic Window for a single Receiver instance.
Version 0.7-alpha: Added widgets to the Transceiver Window for the FFT DDC spectrum and Wide band spectrum displays and added a window for the Time Signal decoder functions. These were also imported from the "sdrx" application.
Version 0.8-alpha: Added a Window for the Bookmarks List display, also imported from "sdrx" and adapted for Hermes2.
Version 0.9-alpha: After much effort and difficulty, I modified the initial code base of Hermes2 to allow multiple instances of DDC Receiver objects and associated Windows. This led to many complications and bugs but eventually, after much effort, Hermes2 now has support for multiple receivers and FFT spectrum displays.
Version 1.0-alpha: Added some Transmit functionality (Modulators) for basic Ham Radio modes (SSB, CW, FM, AM) and some widgets to run and control the Transmitter. Still, overall Hermes2 is rather simplistic e.g. there is no Microphone compressor or support for Adaptive Pre-Distortion (PureSignal). Hopefully in later version I may find ways to add some DSP Magic to Hermes2!
Version 1.1-alpha: Added support for what I call "Guest Modes". Basically these are either Receive-only or Transmit/Receive programs that support reception or operation on some specific Amateur Radio mode like PSK31, Hell Schreiber etc. Most of these Guest modes have been adapted and incorporated into Hermes2 from existing applications I had written for these modes, when using a "traditional" transceiver like my Yaesu FT-847 or Elecraft K3. In this version I added a Morse Code Decoder mode which is receive-only and decodes Morse code from the samples stream of the CW Demodulator. It was imported and adapted from my xdemorse application.
Version 1.2-alpha: Added a Guest mode to decode the time and date from VLF Time/Frequency Standard transmitters. This mode can decode signals from MSF60 on 60kHz, RBU on 66.667kHz, DCF77 on 77.5kHz and TDF on 162kHz.
Version 1.3-alpha: Added a WEFAX decoder Guest mode which can demodulate standard WEFAX transmissions on HF and produce an image of the weather map or (unfortunately not any more) of news broadcasts from the now (apparently) defunct Kyoto News agency HF transmissions.
Version 1.4-alpha: Added a transmit/receive Guest mode for the amateur PSK31 operating mode. The code was imported and adapted from my xpsk31 application.
Version 1.5-alpha: Added a transmit/receive Guest mode for the amateur RTTY operating mode. The code was imported and adapted from my xritty application.
Version 1.6-alpha: Added a transmit/receive Guest mode for the amateur Hell Schreiber operating mode. The code was imported and adapted from my xfhell application.
Version 1.7-alpha: Added a transmit/receive Guest mode for the amateur Olivia operating mode. The code was imported and adapted from Pawel Jalocha's original C++ sample code which I translated to C and adapted for Hermes2.
Version 1.8-beta: Changed the installation commands in Makefile.am so that all the relevant files (desktop file, application pixmap, configuration file, executable binary etc) are installed under any location specified to the configure script by the --prefix= option. Also modified the program so that on first start up after installation, the application will create its working directory by copying files from the relevant directories under the installation prefix. First hopeful beta release!
Version 1.9-beta: Fixed a few bugs that caused segmentation faults when Hermes2 was quit with some Guest windows open (like PSK31, RTTY etc). Also replaced the IQ frequency discriminator in the WEFAX guest mode with a zero-crossing discriminator because the former was not working well.
Version 2.0-beta: Added a WSPR (Whisper) Guest Decoder for the Weak Signal Propagation Reporter beacons. This Decoder was adapted and imported into Hermes2 from the rtlsdr-wsprd application by Guenael, VA2GKA and WSJT-X application by Joe, K1JT. I had to make a number of changes to the code to remove the FFTW dependency (replaced by the built-in FFT function of Hermes2) and to modify the CIC decimator and its FIR filter.
Version 2.1-beta: Started an attempt to build a Guest mode for a favorite communication mode - SSTV! So far a fairly successful Receive mode is available and work is in progress to try and build SSTV Transmit ability.
Version 2.2-beta: Added RSID functionality for both RxID and TxID decoding and encoding. The source code for RSID was adapted from the C++ RSID code in fldigi, after manual translation to C.
Version 2.3-beta: Made a very large number of changes to the original Lhpsdr source code to make it compatible with the HL2 hardware feature and the Protocol I that it uses. Much bug fixing was needed to make Hermes2 work stably, but it is still a beta level program.
9. Copying
This software package is released under the GNU Public License.
Please see the COPYING file for more details.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details