-
EasyDRF is a Windows application program for sending files over radio using HamDRM format.
-
EasyDRF was created primarily to support shortwave broadcast use of HamDRM.
-
A 2.5kHz bandwidth allows EasyDRF to work over SSB, AM and FM radio channels.
-
HamDRM format was adapted from Digital Radio Mondiale to Amateur Radio use by Cesco, HB9TLK.
-
EasyDRF is based on the WinDRM application also by HB9TLK.
-
WinDRM is based on the Dream DRM encoder/decoder software.
-
EasyDRF also runs under Wine in Linux (tested and verified).
-
EasyDRF is a portable (self-contained) application. It does not need an installer, and makes no changes to the Windows Registry.*
* Some standard Windows library functions and compiler generated code *may* access the Windows Registry.
** Latest EasyDRF updates **
Back to Tech Menu
EasyDRF is on GitHub:
Main:
https://github.com/DazDSP/EasyDRF
Executable (updated at times*) Click file then use "Download RAW" to save.
https://github.com/DazDSP/EasyDRF/tree/master/Release
** INSTALLATION **
NOTE: Bare program executable file, no installer. To install, make a new folder called "EasyDRF" on C drive, and move the downloaded file into it. Make a shortcut to EasyDRF.exe and move the shortcut to somewhere convenient for launching the app. That's all!
Important: Do not install EasyDRF in or under a system folder such as Downloads, or it can cause security problems - such as failure to create folders or save files.
* EasyDRF is being updated less often now, as the performance is largely adequate and each update requires the executable to be submitted to various antivirus vendors for analysis.
Shortwave Radiogram and Radio Northern Europe International
EasyDRF is routinely used to encode playlist data for Radio Northern Europe International (RNEI), and was also used for the first Shortwave Radiogram HamDRM test broadcast on 21st, 25th and 28th April 2021.
The Shortwave Radiogram test showed how the simple carousel repeat method of error correction was inefficient, and could easily fail due to repeated errors in the same place.
Since that time, Reed-Solomon coding has been added to EasyDRF for vastly improved error performance. Some other protocol weaknesses have also been addressed.
These protocol improvements mean that EasyDRF is now the only program that can decode this content. The RS data is not EasyPal compatible.
Another test broadcast using these advances was produced, but was not broadcast due to the already busy schedule of the Shortwave Radiogram creator.
Instead, there was an RNEI Radiogram broadcast on February 3rd, 2022 (UTC). DETAILS HERE. RECORDING HERE.
There was another Shortwave Radiogram EasyDRF special broadcast from May 11-16, 2023.
Details are here: EasyDRF Shortwave Radiogram - May 2023.
Some videos of the decoding are here:
Part 1.
Part 2.
There was another Shortwave Radiogram EasyDRF special broadcast from November 17-20, 2023.
Details are here: EasyDRF Shortwave Radiogram - Nov 2023
Some videos of the decoding are here:
Part 1.
Part 2.
** Quick Setup for EasyDRF Radiogram Decoding from AM Broadcasts **
- Start EasyDRF.
- Feed receiver audio in using line input (analog) or VAC (SDR).
- Use a receiver with AM-Sync detection. If not available use SSB mode.
- Use at least 6kHz AM RF bandwidth or 3kHz SSB RF bandwidth on the receiver. (OFDM bandwidth: 350Hz to 2850Hz)
- Select audio input from "Soundcard" -> "RX Input" menu.
- Select EasyDRF "Input Level" display and set input level for about 60% indication with signal present:
- Select EasyDRF "Waterfall" display.
- Wait for the EasyDRF Radiogram program to start.
- If using SSB, ensure tuning is accurately ZERO-BEAT to the AM carrier. If tuning is off, the data will not decode.
- Correct tuning should put the pilot tones in the centre of the red markings (this is a rough indication only):
- EasyDRF State indicators should all turn green. Segment bargraph will show data progress.
- When the HTML file saves, click the "Rx Files" button to open the save folder.
- Open the HTML file in a web browser. Firefox preferred. If AVIF images do not display even though they saved, try a different browser.
- Images will load as they decode. Reception quality stats will display on the page.
- For RNEI and Radio Carpathia programs, there is HTML only. Reception quality stats will display at the bottom of the page.
EasyDRF adds some new features and removes others.
EasyDRF was based on an older version of the WinDRM source, merged with the HamDRM DLL source. The old WinDRM source lacked certain features, and contained bugs.
EasyDRF Main Features:
- Improved security.
- Automatic transparent LZMA data compression for selected filetypes: html, htm, css, js, xml, json, ico, svg, mid, txt.
- Bit-accurate file transfer, using error correction and CRCs.
- Four Reed-Solomon error correction selections for good speed and reliability.
- Ham-DRM protocol updates to reduce single points of failure.
- Peak to Average Power Ratio (PAPR) processing to reduce peak levels, increase average signal power and improve decoder SNR.
New features/bugfixes:
The EasyDRF RS data size protocol was updated on Nov 10th, 2021. This is not compatible with older versions. To decode recordings from older versions requires the old software dated Oct 31st. The new software has some degree of backwards compatibility, but this requires the old header to be received - and this can't be
guaranteed in variable shortwave conditions.
-
Radio Carpathia prefix added to stats logging, segment bargraph better scaled to window width, transmit frequency stability improvement. Aug 10, 2023.
- Mode B frequency tracking filter shortened, for improved decoding with rapidly fading signals. May 28, 2023.
- EasyDRF cleared by SecureAge AV. Mar 06, 2023.
- EasyDRF cleared by McAfee AV. Mar 01, 2023.
- EasyDRF submitted to McAfee AV for analysis. Feb 25, 2023.
- EasyDRF cleared by BitDefender. Feb 15, 2023.
- EasyDRF cleared by Microsoft. Feb 15, 2023.
- EasyDRF cleared by Symantec.
Feb 12, 2023.
- EasyDRF submitted to Symantec, Microsoft, BitDefender and SecureAge for analysis as a false-positive. Feb 12, 2023.
- Minor code cleanup and removed old exe version. Feb 10, 2023.
-
Stats display bugfix. Dec 12, 2022.
-
IIR speech filter bugfix. Nov 20, 2022.
-
Updated EasyDRF.exe
cleared by Microsoft as "Not malware". Nov 19, 2022.
-
Updated EasyDRF.exe submitted to Microsoft for analysis. Nov 18, 2022.
-
Digital Voice audio compressor updated. Nov 18, 2022.
-
Speex mode now locked out from attempting decode at low bitrates (a possible cause of previous crashes during errors caused by noise). Nov 14, 2022.
-
Audio compressor and noisegate added to Digital Voice mode input. Nov 14, 2022.
-
LPC-10 Digital Voice mode upgraded to work in all QAM mode combinations. EXPERIMENTAL
Nov
14, 2022.
-
Waterfall text scaled to better fit display. Nov 8, 2022.
-
Waterfall text now supports up to 20 characters. Nov 8, 2022.
-
"Voice Tx" is now displayed in Info when transmitting digital voice. Nov 8, 2022.
-
Slight waterfall text buffering improvements. Nov 8, 2022.
-
BSR filename is now shown on the BSR request window. Nov 6, 2022.
-
1 second PTT delay added to prevent cutting short transmit audio. Nov 6, 2022.
-
G, B, and ID buttons now generate waterfall text directly, using chirped IFFT. Nov 6, 2022.
-
TUNE button now uses OFDM IFFT for tone generation. Nov 6, 2022.
-
Digital Voice
mode Audio Scope added. Nov 6, 2022.
-
-12dB level setting added in Tx Settings menu. Nov 6, 2022.
- Updated EasyDRF.exe verified by Symantec. Oct 25, 2022.
-
Updated EasyDRF.exe
submitted
to Symantec as a false positive malware detection.
Oct 24, 2022.
-
PTT COM port control is now working. Oct 24, 2022.
-
LPC-10 glitches fixed.
Both
digital voice modes improved, using FIR antialiasing filters. Oct
24, 2022.
-
Updated EasyDRF.exe
cleared
by Microsoft as "Not malware". Oct
12,
2022.
-
Updated EasyDRF.exe
submitted
to Microsoft for analysis. Oct 11,
2022.
-
Automatic
PAPR
transmit processing added. PAPR performs Hilbert clipping, bandpass
filtering, and overshoot compensation. Oct
11, 2022.
-
Most transmit filters now run at a reduced samplerate of 12kHz to reduce CPU load and improve performance.
Oct
11, 2022.
-
Default search window
narrowed
to 5Hz to improve decoding on noisy AM signals. On SSB modes this may
need
to be set wider in "Rx Settings". Oct
11, 2022.
-
Channel equalizer range
widened.
Oct
11, 2022.
-
DC blocking filter
improved.
Oct
11, 2022.
-
SetMixerValues function
call
removed (a source of Linux crashes). Oct
11, 2022.
-
EasyDRF.exe cleared by
AVG and
Avast. Feb 22, 2022.
-
EasyDRF.exe submitted to
Avast
and AVG for analysis. Feb 22, 2022.
-
A special RNEI Radiogram broadcast was transmitted on
February 3rd, 2022 (UTC). Details here.
-
The updated EasyDRF.exe was cleared by Microsoft as "Not malware".
Jan 20, 2022.
-
DC blocking filter (1st order highpass) added to audio input, to prevent data errors when audio has DC offset. This now enables EasyDRF to work correctly with KiwiSDR
receivers in AM Sync modes. (A DC blocking filter has now been added to the KiwiSDRs to address the original problem.) Jan
20, 2022.
-
RNEI added to stats
logging.
Dec 05, 2021 - Uploaded to GitHub Dec 07, 2021.
-
EasyDRF.exe cleared by
Microsoft
as "Not malware". Dec 03, 2021.
-
EasyDRF.exe submitted to
Microsoft
for analysis. Dec 03, 2021.
-
Disabled debugging info in compiler. Dec 03, 2021.
-
Removed unused menu entry and minor code cleanup. Dec 03, 2021.
-
Erasure buffer and bargraph bugfixes. Dec 02, 2021.
-
Added "Build Date" in front of the build date in the titlebar.
Dec
02, 2021.
-
Application window position is now saved and restored. Dec 02, 2021.
-
Erasure code merged into segment buffer code and simplified. Dec 01,
2021.
-
Improved stats logging
reliability.
Nov
30, 2021.
-
Improved locking to
signals
with larger time error. LAMBDA_LOW_PASS_START changed from 0.99 to 0.9.
Nov
29, 2021.
-
-p mode (picture only) command-line option now also disables speech decoding, for better app stability.
This should prevent speech decoder exceptions (app crashes) from noisy/corrupt data. Nov 27, 2021.
-
Dual decoder RS buffers added.
Nov
27, 2021.
-
Small files percentage
computation
bug fixed. Nov 27, 2021.
-
Erasure data now uses cached segment data, instead of being written in parallel. This ensures the
bargraph display stays in sync with the cached segment data during file replays.
Nov
26, 2021.
-
Failed decode file state added. File state green/red background colour time-extended to 4 seconds to improve decoded file state visibility. Nov 26, 2021.
-
Improved active position count accuracy. Active position count is now +1 so it matches up with the
active segments and total segments counts. (Required because segment numbers start from zero.) Nov 26, 2021.
-
Improved file state logic - Ensures file state display is not stuck on "Try..." at the beginning of a file. Nov 26, 2021.
-
Improved stats logging for SWRG.
Nov 26, 2021.
-
State LEDs blank on transmit mode. Nov 25, 2021.
-
Segment bargraph moved to PaintWaveData function for improved performance on slower systems. Nov 25, 2021.
-
Fixed inaccurate active segment count. Nov 25, 2021.
-
Improved filename loading from old header. Nov 25, 2021. Improved further Nov 27, 2021.
-
Small files under 1kB now decode correctly in both RS and normal modes. Nov 25, 2021.
-
EasyDRF now compiled with heavy optimizations for speed. CPU usage greatly reduced. Unused Windows DLL
and static libraries removed. AV vendor false positives reduced. Nov
19, 2021.
-
Improved consistency of RS data size display. Displayed size in stats is now always the encoded
RS data size when in RS modes. Nov 12, 2021.
-
Protocol update!
In RS modes the number of RS blocks is now sent, instead of the RS data size in bytes. This improves efficiency, but breaks compatibility with old versions.
Nov 10, 2021.
-
Bargraph now runs in a new thread, to avoid any chance of stalling the main UI or modem.
Nov 10, 2021.
-
Transmit filter narrowed slightly to reduce COFDM sidelobes. Oct 28,
2021.
-
RS mode bugfix: When new file is received, previous received file is now removed from data cache if
it was successfully saved. (The segment caching code normally keeps good file segments until all segments are received - but RS coded files can be
saved without requiring complete data, leaving the incomplete data in the cache.)
Oct
27, 2021. Modified to work with File State function Dec 1, 2021.
-
Separated file stat box and added colour coded background. Improvements to decoding logic regarding
RS attempts and filename/size handling. Oct
27, 2021.
-
State indicators now
upgraded
to "LED" style. Oct 20, 2021.
-
RS buffer has been moved
into
heap memory to reduce stack use. Oct
1, 2021.
-
RS decoder now runs in it's own thread, to avoid stalling UI or modem during noisy decodes. Added Sep 29, 2021.
-
Signal quality stats
logging
for SWRG webpage integration. Added
Sep 26th, 2021.
-
Interleaved Reed-Solomon
error
correction (including erasure processing for best performance). Added
Sep 10th, 2021, expanded to all RS levels 1-4 on Sep 12th.
-
Red/Green
bargraph to show decoded data progress and segment CRC errors.
-
More robust coding
methods in
RS modes for critical information like: RS level, Filename, File size.
-
Transparent LZMA/GZIP
compression
of selected file types using LZMAlib/zlib (html, htm, css, js, xml,
json,
ico, svg, mid, txt). Maximum file size 512kB. LZMA added Sep 24, 2021. Gzip has now been removed from the latest version.
-
Automatic sequence add - Adds all files in a numbered sequence to the transmit list. Format: filename-nn.ext
(nn=number of file).
-
Changed transmit
bandpass filter
to correct bandwidth.
-
Changed frequency
offsets to
match new bandpass filter.
-
Extended switching delay
to
avoid transmit audio cutoff with new filter.
-
SNR time constants in
ChannelEstimation.h
shortened to 10% of original values.
-
Fixed audio device list
and
selection menu.
-
Added Mode E selection
to menus
and logic.
-
Modified GUI menus to
more closely
match the latest version of WinDRM.
-
Waterfall visual AGC
improved.
-
Updated mixer control
exe name
to sndvol.exe.
-
GUI Stats window added
(shows
incoming filename).
-
Added "Rx Files" button
to open
save folder.
-
Improved LPC10 speech
codec
buffer problem by adding additional buffer.
Removed features:
-
Disabled automatic opening or execution of received files and partial files for better security.
Future experimental features or improvements:
-
Other higher performance FEC modes like LDPC.
Some possible broadcasting uses of EasyDRF
-
Transmitting weather charts as SVG (XML) or
AVIF files
(as a replacement for HF WEFAX).
-
Transmitting satellite pictures as image files
(AVIF/WEBP/JPG)
(as a replacement for HF WEFAX).
-
Transmitting text or HTML coded information,
such
as radio program content lists or warnings and forecasts.
-
Transmitting information as webpages, using
HTML and
image files (AVIF/WEBP/JPG).
The encoded signals can be sent over standard 3kHz
SSB HF channels, or via standard AM broadcast transmitters on any
suitable
radio band.
The great efficiency in transmitting compressed
data, plus the heavy error correction and robust QAM4 mode makes the
system
able to cope with poor radio conditions.
For automated transmissions, the software would
ideally need to be made into a multi-platform command line program.
Broadcast Optimization
For best data decoding performance, some special steps are needed before transmission:
-
Optimize data for efficient transmission. Use
the
best data format to minimize data size, or to enable the highest
practical
compression ratio.
-
Select the best modes to suit the channel
conditions
(Mode A/B/E, QAM level etc).
-
Set the RS error correction level to the
maximum practical that will fit into the available transmission time.
-
Encode the data and save as an audio file.
Currently, this requires an external sound editor such as Audacity.
-
Process the encoded data signal using the correct PAPR level (clipping and filtering) to improve average signal power.
This is now a built-in automatic feature of EasyDRF.
-
Apply inverse transmitter equalization to flatten
the on-air signal power spectrum. For AM shortwave broadcast use, this
typically means something like 3 to 6 dB reduction slope at 300Hz and
3000Hz, and a broad peak at around 1500Hz. For SSB use, the opposite may be
needed - depending on how much filter droop there is around 300 and 3000Hz.
-
Apply phase shift compensation to undo the
phase shift effects of the transmission equipment. (Typically about 4mS at 100Hz,
sloping up towards 0mS at 3kHz for AM transmitters using Optimods. The
correction is the inverse of this. SSB transmitters may have 1 or 2mS of
group delay near the passband edges, and this is usually low enough not to
cause problems.)
-
Text data is often the most efficient to send.
Typical text files automatically compress to a ratio of between 2:1 and 4:1
with the inbuilt LZMA file compressor in EasyDRF.
-
The LZMA compressor automatically compresses
these file types: html, htm, css, js, xml, json, ico,
svg, mid, txt.
-
Image data can be best compressed with AVIF, WEBP or JPG formats. AVIF appears
to have the best compression ratio, and it is a very new format. All of
these formats can be displayed in web browsers.
-
Some VST tools for phase compensation will be added to this page in the future.
Update - PAPR processing added
PAPR = Peak to Average Power Ratio.
Automatic PAPR transmit processing has been
added to EasyDRF. PAPR clips and filters the data signal for higher average
power. This is done by converting the OFDM audio signal to a Weaver-mode SSB
0Hz
IF IQ signal, processing, then converting back to audio again.
-
6dB clipping in
QAM4
-
3dB clipping in
QAM16
-
<1dB clipping in QAM64
CESSB overshoot compensation methods are used to
prevent
filter overshoots. The peak output level is very well controlled.
Hilbert clipping and filtering is performed at
a reduced samplerate of 12kHz to make the filter performance better,
and
to reduce CPU load. Using multirate processing makes the output very
clean,
because the 12kHz rate allows sharper filters. All filters are FIR
types
for linear phase.
The peak audio output level is now set higher
at -3dBFS (previously was -12dBFS).
Output spectrum in QAM4 mode with 6dB clipping
at 48kHz samplerate:
Above: A decode from WRMI with low SNR, showing
a
good decode even with serious segment loss.
Via a Kuwait KiwiSDR - 11,680km on 7780kHz.
EasyDRF State:
IO:
Audio interface.
Freq:
Frequency sync.
Time: Time/Phase
sync.
Frame: Frame
sync.
FAC:
Fast Access Channel CRC status.
MSC:
Main Service Channel CRC status.
EasyDRF Displays:
Call:
Callsign setting of transmitting station.
SNR:
Decoder Signal-to-Noise level (signal quality).
Info:
Total data segments / Good data segments / Current data segment.
Codec:
RS mode of data (if used) and "Data" in Data mode, Speech codec type in
Voice mode.
DC:
DC (zero) frequency of COFDM signal (default 350Hz).
Mode:
HamDRM mode letter / Interleaving / QAM level / MSC protection level /
Bandwidth.
EasyDRF Stats:
[filename]:
Filename of file being sent. A .gz or .lz extension is added if the
data
was compressed for transmission. This is removed after decompression
and
before saving.
E:
The last RS error code for debugging purposes.
Bytes:
The data size of the (uncompressed/compressed and/or RS encoded) file
being
sent. In RS modes, this will be a multiple of 255, as the RS block size
is 255 bytes.
ID:
The transport ID of the data object.
Bfr:
The RS and Erasure buffer number being used (0 or 1).
EasyDRF Filestate:
-blank-
No signal. Decoder is not locked.
WAIT nn%: (Blue)
Waiting for adequate data - now with percent completed display. This is
the percent of total file or RS data that has arrived. RS data will
decode
before 100%.
Try... nnn: (Yellow)
RS decoding was attempted, and has failed with errors. More data is
needed.
Number shows decode attempt count.
SAVED: (Green)
Good decode. File has been saved. The green colour persists for four
seconds
minimum.
FAILED: (Red)
Failed
decode. In a transmitted file sequence this text may not be displayed,
due to the next file starting immediately after. The red colour
persists
for four seconds.
EasyDRF buttons:
RESET:
Reset the decoder and re-acquire the signal. Only use this if the
decoder
is taking too long to automatically reset at the start of a new
transmission.
BSR:
Bad Segment Request - (For amateur two-way communication only) - Send a
request to the other station to re-transmit the file segments the
decoder
missed. (The BSR function only works
for
files sent WITHOUT RS coding. With RS coding, there really is no need
for
BSR requests if the RS level is adequate for the radio conditions.) *
BSR now DOES work with on-the-fly LZMA compressed files. Nov 23, 2021.
SPA:
Show Picture Anyway - Save an incomplete file, even though it will be
corrupt.
This won't work if the header is missed. (For
uncompressed files and NON-RS modes only.)
Rx Files:
Open the folder where the received files are saved.
These buttons are for
sending
waterfall text. The buttons no longer need pre-recorded WAV files, and
can't play them anymore.
G:
"GOOD COPY". This is for showing the other station that you had a good
decode. Loads "good.txt" if present, for multilanguage support.
B:
"BAD COPY". This is for showing the other station that you had a bad
decode.
Loads "bad.txt" if present, for multilanguage support.
ID:
Sends the callsign. This is to ID using your callsign.
TUNE:
Send HamDRM tuning tones. This is for playing a tuning signal to help
the
other station tune accurately to you.
Transmit control buttons:
TX File:
Display the Transmit File selection dialog.
TX Voice:
Begin transmitting in digital voice mode. Digital
voice mode is now fixed - Oct 24th 2022.
EasyDRF instructions:
Receive:
Start the application and
set the audio input to the source. (To feed audio in from another
application,
you may need a "virtual audio cable".)
When a file is received,
it's filename will be displayed on the left side of the status bar. The
bargraph shows the data progress. SNR shows the signal-to-noise ratio
of
the incoming signal. If the SNR is high enough for the QAM mode used,
the
data will be good (green).
If the SNR falls too low, the data segments will get CRC errors (red).
In RS modes, the file
will
save before it reaches 100%, if there is enough good data recovered.
When
the file is saved, "SAVED" will appear on the right side of the status
bar.
Click "Rx Files" to
open the Rx Files folder where the file was saved. Compressible files
like
text or html are compressed on-the-fly using LZMA, and are then
automatically
decompressed before saving.
Received files can be
displayed
in various ways:
Web browsers are good
general
purpose viewers for text, html, jpg, webp, gif and png files.
If an html file is sent
before
some image files, it can include a javascript loader to automatically
load
the images as they are received. This is done on the Shortwave
Radiogram
HamDRM test broadcasts.
Important notes:
-
Avoid using the "Antifading" feature of SDR
Sharp
(SDR#), as it severely damages COFDM data.
-
Avoid using Noise Reduction, as it can
increase errors.
-
Avoid using extremely fast AGC, as it can
cause distortion.
This is more of a problem on the higher QAM modes.
-
Avoid using noise limiting (peak clipping)
unless
it is guaranteed not to cause audio distortion. This is more of a
problem
on the higher QAM modes.
-
Try to provide the cleanest signal by
minimizing receiver
noise sources, and selecting the best antenna for the signal being
received.
-
In AM Broadcast mode, if there is QRM on one
sideband
- receive the other sideband in Sync AM/ECSSB/SSB mode. This can
significantly
boost SNR.
Advanced
signal recovery methods for AM data broadcasts:
The multi-pass decoding method shown below is now largely
superseded
by the AM phase correction method:
-
Demodulate the AM signal using AM-Sync as independent LSB and USB
channels,
or as I and Q channels.
-
Automatically phase align the audio of each channel by splitting the
audio
into multiple bands, measuring the phase of each corresponding channel,
and rotating them both to match. This needs to be done using a DSP
plugin,
or an advanced SDR.
-
Phase correct the audio to compensate for all filter and phase rotator
delays in the transmit and receive processing. This typically requires
the higher frequencies to be delayed more than the lower frequencies.
An AM-Sync demodulator with these advanced methods is being developed.
Sometimes a weak or noisy AM signal is just
below the RS decoding threshold. In this case, it is possible to get
more
good data out of the signal by special processing. This requires an IQ
(IF) or ISB (demodulated) recording of the signal.
The signal must be demodulated into LSB and USB
using a carrier phase-locked ISB or ECSSB demodulator,
and
the LSB and USB audio is combined in the following ways in a sound
editor
(such as Audacity):
-
LSB+USB
-
LSB only
-
USB only
-
LSB-USB (flip the phase
of either
one)
The file audio is added by playing them
simultaneously
in a multitrack editor.
Play each audio combination into the decoder,
and
the good segment data will slowly accumulate. It's also worth making
more
than one pass, as this can recover additional data.
* NOTE: EasyDRF
only
uses the LEFT audio input. Sound file output should be made into mono
by
splitting stereo files into separate mono channels, and reducing the
gain
on each if needed to avoid clipping.
In really difficult cases, a 0.5 to 1 mS delay
can be added to the combined sidebands to move the selective fading
notches
and recover even more data:
-
LSB+Delayed USB
-
Delayed LSB+USB
-
LSB-Delayed USB (flip
the phase
of either one)
-
Delayed LSB-USB (flip
the phase
of either one)
One final trick is to use
audio
compression/limiting on the audio to reduce the fading severity and
recover
even more data. The recovery time of the compressor/limiter should be
around
100mS.
These methods can be used
to recover signals that are a long way below the decoding threshold,
but
they are tedious.
Transmit:
First, set your callsign under Setup -> Callsign.
Next, select transmit settings in "Settings" menu.
MODES
Mode A: Fastest. For
groundwave
or satellite use, where there is no multipath.
Mode B: Fast. For HF, where
there is some multipath.
Mode E: Slower. For HF,
where there is multipath and severe Doppler shift.
QAM4: Robust. Most resistant to noise and distortion.
QAM16: Faster. Will tolerate some noise and distortion.
QAM64: Fastest. Needs good SNR and low distortion.
MSC Protection: Normal.
Slower.
Maximum OFDM error correction. (Not functional in QAM4 mode.)
MSC Protection: Low. Faster. Less OFDM error correction.
Interleave Short 400mS: Lower latency.
Interleave Long 2s: Good for slower fading.
DC Offset: 350Hz is the standard lower limit of the OFDM signal.
Bandwidth 2.5kHz: Faster and slightly wider. Choose this for AM use.
Bandwidth 2.3kHz: Slightly slower but able to fit through narrower 2.4kHz SSB filters.
When transmit configuration is complete, click OK.
Click Tx File button.
Select number of repeats
(old) or RS error correction mode (new, and far better).
Select Long Leadin to
allow
the decoder more time to lock.
Select Sequence Add to
automatically
add a numbered file sequence to the transmit list.
Click Add File to open
the
file select dialog. Only one file
at
a time can be added by this method.
Click Return to cancel,
or
TX to transmit the files in the transmit list.
Files are automatically
compressed
using LZMA if they have any of the following extensions:
html, htm, css, js, xml,
json, ico, svg, mid, txt.
New features:
Work continues to improve
the reliability of EasyDRF in difficult shortwave conditions.
Previously, EasyDRF used
a repeat method to help ensure all file segments are decoded. This was
wasteful of bandwidth, and each pass could still lose the same segment
- making it fail.
Another common HamDRM
application
called "EasyPal" uses interleaved Reed-Solomon (RS) encoding to improve
this situation. Unfortunately, the protocol extension it uses is
unknown,
and it still has weaknesses.
The error correction
scheme
used on the HamDRM version of Shortwave Radiogram program 200 was to
send
the HTML 3 times, and the images 2 times each. This reduced the
throughput
for the HTML to 33%, and the images to 50%. Some files can still be
lost
due to data being lost in the same segments on each pass.
Interleaved Reed-Solomon
coding (with erasure data processing) can correct for certain amounts
of
data loss at any position in the data stream, with less overhead than
repeats:
RS
Level |
RS
Code |
Overhead |
Data Loss
Tolerance |
Transfer
Speed |
1 |
255,224 |
+14% |
11% |
88% |
2 |
255,192 |
+33% |
24% |
75% |
3 |
255,160 |
+59% |
36% |
63% |
4 |
255,128 |
+99% |
49% |
50% |
255 = Block size
224,192,160,128 = Data size
Parity size = Block size
- Data size
The
EasyDRF
RS modes are not compatible with EasyPal,
even
though
they are similar.
Data loss during reception
is mostly caused by interference or signal fades taking the SNR below a
usable level for some file segments. Even if the signal is at a usable
level for most of the time, the fading can make decoding
impossible
due to these missing file segments. RS coding can fully correct
this, up to a certain percentage of missing segments.
RS coding of the
transmitted
file data greatly improves the reliability of file transmission, but
the
file header information also needs to be made robust, as the header
contains
the filename and file size information. If this is lost, decoding is
impossible.
A new scheme has been
developed
for EasyDRF, where a new header is appended to the file before RS
coding
and transmission. This ensures the new header always decodes if the
file
decodes successfully.
After decoding, EasyDRF
removes
the new header from the incoming file before saving it.
New file header format:
-
--- Start of file ---
-
"EasyDRFHeader/|"
(Human-readable text ID with no spaces, and some non-text characters
added
to make it unique.)
-
Version Number - 1
byte (In
case the header structure needs to be revised later.)
-
Header size - byte1
(Size
in bytes from header beginning to the last filename character in the
header.)
* Adapts to different length filenames up to almost 64k bytes length.
-
Header size - byte2
-
File size - byte1
(size of
the file in bytes).
-
File size - byte2
-
File size - byte3
-
Filename - up to
65,514 bytes
long (the name of the file, plus an added .lz extension if compressed,
but no .rs extension).
-
--- End of header /
Start
of original file ---
The old header is still
sent,
but the new header is more robust and is guaranteed to decode if the
file
decodes. This avoids the problem of having no filename or size
information
to save the file with.
The RS data size in bytes
or total RS block count information is necessary to decide when to
attempt
the decode of the RS encoded data. The exact RS data size is required
for
the deinterleaving to work correctly.
But due to the
interleaved
RS coding, if this header is appended to the file it isn't possible to
read it until after RS decoding. Since the exact RS data size is needed
before
deinterleaving, the new header can't be used to send file size
information
in a timely way.
To get around this, the
number
of 255 byte RS data blocks is now sent in serial data form, using four
of the unused segment header bits in the "Repetition index" field. This
allows the data to arrive in only 4 segments time, and it continuously
repeats all through the file transmission in case any segments are
lost.
This RS data block count is multiplied by 255 in the decoder to get the
total RS data size in bytes, which is then used to compute the total
segment
count and to compute the proportion of correctly received segments.
This
allows a good decision to be made on when to attempt the RS decode, and
the RS data size allows correct deinterleaving of the RS data.
Also, the RS mode being
used
is signalled using the "Reserved for future addition" segment header
bits
in the "User access field", allowing the RS mode to be easily and
reliably
identified.
Modified signalling:
-
"CRC used" decoder field
is
locked in the always ON state, since it is always used.
This
eliminates a possible source of errors. Added
Sep 17th, 2021.
-
(Previously
unused)
"Repetition index" field = 4 bits of file size data sent in serial
form,
timing locked to the segment number in Modulo 7 (LOW nibble first).
Old method, pre Nov 10, 2021.
-
(Previously unused)
"Repetition
index" field = 4 bits of RS block count data sent in serial form,
timing
locked to the segment number in Modulo 4 (LOW nibble first). Updated
Nov 10, 2021.
-
(Previously unused)
"Reserved
for future addition" field = 3 bits to indicate the RS mode being sent.
#2 updated to #3:
Since the RS block size
is 255 bytes, the RS data size is always a multiple of 255. This means
it is wasteful to send the exact RS data size in bytes via the 4-bit
"Repetition
index" field, as it takes longer to send this 28 bit value (7 segments
time).
Instead, the number of RS
data blocks is now sent, and this number is multiplied by 255 after
decoding
to compute the RS data size in bytes. This only takes 4 segments time
to
send. The particular nibble being sent is computed by the segment
number
Modulo 4 (LOW nibble first).
Using less segments to
send
the data increases the chance of this information being correctly
received.
12 bits (3 segments x 4 bits) would only allow a data size of 1M, which
is slightly inadequate. 16 bits (4 segments x 4 bits) allows an RS data
size of 16.7M, which is more than adequate - and still an improvement
over
sending the byte total (4 segments instead of 7).
Unfortunately, this change breaks compatibility with older versions (Oct 31, 2021 and prior).
The Oct 31, 2021 version is still available using the GitHub file history in case it is needed to decode old broadcast recordings.
4-bit "Repetition
Index"
field reassignment (now sends RS block count):
Bit Mask |
Segment #
Sequence (MOD
4) |
0000000000001111 |
0 |
0000000011110000 |
1 |
0000111100000000 |
2 |
1111000000000000 |
3 |
3-bit "Reserved for
Future
Addition" field reassignment (now sends RS mode):
RFA#
|
Bits
|
RS Mode
|
0
|
000
|
None
|
1
|
001
|
RS1
|
2
|
010
|
RS2
|
3
|
011
|
RS3
|
4
|
100
|
RS4
|
5
|
101
|
future
|
6
|
110
|
future
|
7
|
111
|
future
|
The Dream/WinDRM
limitation:
EasyDRF is based on
WinDRM
which is based on Dream, using the MOT data function to send files. The
Dream MOT function divides files into segments for transmission, and
requires
all segments to be received before the file can be saved. It also
requires
the file header information in segment 0 to know the filename and
filesize.
The Dream MOT code saves the incoming DRM modem serial data into a
buffer
array for each segment, and when the header is received it copies all
these
buffers into a new buffer in byte form.
Even if the filename and
size information is sent by alternate means, and the file segment data
is sent using RS coding to make it resistant to data loss, the byte
data
is not normally made available if the header data fails to decode.
This required a
work-around
to allow the serial segment data to be directly converted into byte
data
and sent out to the RS decoder routine.
The work-around was to
add new code to read out the existing serial buffers, decode the serial
data to byte format, and save into a new buffer.
Summary of changes:
-
RS encoding level is
signalled
using the 3 reserved bits in every segment header. This allows 4x RS
modes
plus 3 other future ECC modes to be signalled in real-time.
-
Number of RS encoded
blocks
(transmitted data size) is sent in a secondary and more timely way in
serial
data mode using 4 reserved segment header bits.
-
All RS modes are
available:
-
RS1 (255,224), RS2
(255,192),
RS3 (255,160), RS4 (255,128)
-
Interleaving and RS
erasure
processing have also been added for best performance.
SNR Stats logging:
Added Sep 26th, 2021.
Received signal data is saved to a separate Javascript file if filenames have an "SWRG", "RNEI" or "RCAR" prefix. The stats filename is in the form "SWRG*.js", "RNEI*.js" or "RCAR*.js". This is included to allow easy collection of stats for shortwave broadcasting applications. The .js file is a set of Javascript objects, with variables for each file denoting the SNR and segment counts.
The following data stats are saved for each file:
- File number (in object name)
- File saved confirmation
- Average SNR
- Maximum SNR
- Total data segment count
(how many RS-coded segments are in the file)
- Good data segment count (how many RS-coded segments of the file have been successfully decoded)
- Last RS-coded segment number received
The filenames must be in this form:
SWRG - Shortwave Radiogram program
HTML file: SWRG-nnn-00.html
Main text file including Javascript image loader and SNR loader.
Image files: SWRG-nnn-nn.ext
Image files - WEBP, SVG and AVIF have been used. JPG and GIF are also possible.
RNEI - Radio Northern Europe International - Music Program
HTML file: RNEI*.html
Main text file including SNR loader. RNEI typically sends only one HTML file for the program playlist.
RCAR - Radio Carpathia - Music Program
HTML file: RCAR*.html
Main text file including SNR loader. RCAR typically sends only one HTML file for the program playlist.
The file SNR and segment data is only saved if the file is saved. If the file doesn't
decode, there is no data saved for the file.
Updated Nov 27th, 2021:
Stats logging is now done for each incoming good file segment. This allows the webpage display to show real-time SNR and file progress, and to save stats even if a file fails to decode. To display stats, the first file must be HTML and it must contain Javascript code to display the stats on the page. This also means the HTML file must successfully save before stats can be shown.
NOTE: If the old header (segment 0) is missed, the filename will be unknown until either the last segment is received, or until RS decoding takes place. No stats can be saved for unknown files unless the file successfully decodes so the filename is known. This is because the file number is derived from the filename.
Internal tone and waterfall text generation:
The G, B, and ID buttons now generate waterfall text without requiring external audio files. The
TUNE button also no longer requires an external audio file.
When these buttons are clicked, the corresponding text message is sent (or tones in the case of the
TUNE button).
-
If present, the "good.txt" or "bad.txt" files are loaded, and their text is used. This is to support
other languages. Currently, only one line of 1 to 20 characters can be sent.
- The width and height of the waterfall text auto-scales, depending on text length in characters.
- The text is converted from ASCII code to bitmap patterns using a 64 bit wide hexadecimal lookup table.
This was converted from the ChirpHel binary ASCII table.
- Eventually the ASCII lookup table will be replaced by a Windows font.
- The bitmapped pattern is scaled for best fit by resampling the rows. The IFFT length is also scaled up
on longer text for better resolution.
- The bitmapped data is chirped, by rotating it's phase using the cosine and sine of a multiple of the
squared IFFT bin number for each pixel. This rapidly sweeps the frequency of the IFFT bin inputs, causing them to smoothly pulse in sequence. This
greatly improves waterfall text quality by reducing peak levels.
- The chirped spectrum data is converted to audio tones using the IFFT function from the OFDM code
block. The TUNE tones are directly generated in the OFDM modulator by setting the 3 IFFT bins directly.
-
The IQ output of the
IFFT is
frequency converted to a 0Hz IF and fed through the PAPR processing
block
to improve average power level and remove peaks.
* Please note: On
Linux
systems using Wine, the default location for the "good.txt" and
"bad.txt"
files could be the user home directory, and not the directory EasyDRF
is
installed in.
Digital
Voice Audio Scope:
An Audio Scope has been
added
for Digital Voice modes. The scope displays incoming and outgoing voice
waveforms, and in transmit mode the trace turns red when the level is
nearing
overload. The scope only displays voice input and output, and not the
OFDM
signal.
Experimental
update to LPC-10 Digital Voice mode:
The LPC-10 Digital voice
mode has been updated to work on all HamDRM data modes. This allows
Digital
Voice to use the robust QAM4 mode, but at lower quality.
Unfortunately, the LPC-10
CODEC is designed for a fixed samplerate of 8kHz, so running it at
other
rates causes problems, such as aliasing and poor speech quality.
The aliasing has been
fixed
by modifying the code to adjust the LPC-10 sample blocksize over the
largest
range it will run at. This has made significant improvements to
quality,
but caused problems with CODEC stability and accuracy. Some of the
LPC-10
buffers have been made larger, and various filters and parameters have
been tuned to improve stability and sound quality.
Most of these errors and
glitches at low rates have now been fixed. At higher rates (QAM64) the
LPC-10 CODEC performs poorly, as the samplerate is too high and the
speech
parameters scale incorrectly. At lower rates, performance is better,
but
varies at each bitrate.
Performance has
been
optimized at these two mode combinations:
Normal:
Mode B, QAM16, Normal Protection, 2.5kHz.
Robust:
Mode B, QAM4, 2.3kHz.
An advanced quality audio
compressor and noise gate have also been added to the Digital Voice
mode
audio input. This amplifies the audio input for a consistent speech
level,
while suppressing background noise which causes severe CODEC artifacts.
The audio compressor and noisegate feature delayed adaptive recovery
time,
and lookahead limiting for extremely low distortion levels.
The audio compressor can
be enabled and disabled in the Settings menu:
Work is ongoing to
improve
performance...
Known bugs and
limitations:
-
Files are truncated at and beyond 512kB.
(Files that
large are probably too big to be practical to send on HF.)
-
In RS modes, cached file data can't be deleted
until
the Transport ID changes. If there is only one file sent, the data
stays
in the cache. This can cause confusing behaviour if replaying multiple
recordings, as the file will only save once, and after that it will
appear
to ignore the decode. Closing and restarting the app fixes this
problem.
Cached file data is deleted when the file has been saved, and the
Transport
ID changes.
-
Small files less than about 1k may not
decode
in RS modes when QAM64 or QAM16 is used. Currently, at least 4 segments
are needed to send the file size information before RS decoding is
possible
(unless the old header is received). Using QAM4 largely avoids this
problem
by making the segments smaller. Problem was due to the fact
that
when there are very few segments, each one is a large percentage of the
total data. This means that for example, if a file has only 2 segments
and is in RS1 mode, it can only be decoded when ALL segments have
arrived.
Fixed
Nov 25, 2021. Improved further Nov 27, 2021. Now, even zero-byte files
can be sent in RS mode. Zero-byte files are rounded up to one RS block
= 255 bytes. This includes the new header with the filename data in it.
-
The decoder caches incoming data by
it's transport
ID. If the same file is sent using a different RS or QAM mode (in an
attempt
to resend it), the app needs to be quit and restarted to clear the
cache
and prevent a failed decode. TODO: Buffer file data is supposed to
be
deleted on a mode change...
Fixed October 2021 - A "Modehash" is now added to the Transport ID
number.
This
may break BSR use. Modehash is now disabled in non-RS modes,
so
that BSR can function. Oct 17, 2021.
-
Repeated RS mode decoding attempts
appear
to have failures on the first and sometimes the second files. This
appears
to be due to some kind of data buffering problem, a resource lock, or a
thread conflict of some kind. Restarting the app fixes it.
This was due to incorrect buffer addressing code. Fixed
Sep 17th, 2021.
-
LZMA on-the-fly
compression
broke BSR function. Fixed
Nov
23, 2021.
-
Voice mode has
dropouts
after recent updates. LPC10 codec packet size does not match the
existing
buffer sizes, causing data loss. LPC-10
digital voice mode fixed Oct 24, 2022.
-
The SPEEX codec has
lower quality
than LPC10.
-
RS modes prevent BSR
working.
RS transmit encoding must be disabled to send or receive BSRs.
-
TUNE button now
generates HamDRM
tuning tones using program code. No WAV file is needed, and WAV
playback
is no longer supported from the TUNE button. Added
Nov 6, 2022.
-
G, B, and ID buttons now
generate
waterfall text directly, and WAV file playback is no longer supported.
Added
Nov 6, 2022.
Ideas for improvements:
-
Add a checkbox
to set
the transmit output level to the original WinDRM level of -12dB.
Added Nov 6, 2022.
-
Add an audio
Audio Scope
display for digital speech modes.
Added Nov 6, 2022.
-
Add automatic backup of
incoming
files to prevent overwriting. Move old files to an \old folder. Rename
duplicates to filename(1).ext similar to Windows.
-
Generate Transport ID at
file
loading, and ensure it never sends two consecutive Transport IDs that
are
the same (this is unlikely, but possible). Transport ID needs to be
unique
for each file, and it needs to change if there are any changes to the
data
being sent. Some of these include: filename, file size, file data,
modulation
settings (QAM type, bandwidth etc) and RS mode.
-
Modify QAM4 mode to make
protection
level work. If working, it should change the data sending speed.
(EasyPal
doesn't change protection level on QAM4 mode either - regardless of the
ErrFix setting.) Protection level changes the low-level error
correction
mode in the modem. It is independent of the RS file data coding layer.
-
Add diversity mode.
Stereo input
allows two audio channels to be processed. This could allow audio from
the same signal heard by two different receivers (or LSB/USB from one
receiver)
to be decoded for diversity benefits.
-
Add IQ AM Sync ISB
demodulator.
This would allow AM diversity to be used, where the LSB and USB were
demodulated
in various matrix combinations for diversity benefits. These
combinations
are typically: LSB+USB, LSB, USB, LSB-USB.
-
Look at the possibility
of adding
LDPC ECC to the HamDRM modem code (difficult).
-
Investigate why recorded
audio
decodes slightly differently each time it is played. Shouldn't it
decode
*exactly* the same each time? **
This
appears to be due to phase shift during transmission taking the encoded
data signal out of range of the HamDRM delay equalizer. Phase
correcting
the data signal before decoding improves decoding quality, and allows
the
majority of data to be decoded in the first pass of a playback. The
phase
shift on AM signals is in two parts: From the transmit audio processing
(Optimod), and from the propagation shifting the relative phase of the
LSB and USB - causing frequency selective cancellation. Both can be
corrected
before decoding using DSP methods.
-
RS mode prevents BSR
working.
Perhaps RS modes can be temporarily disabled when BSR is in use?
-
Write new
functions
to make G, B, and IDENT buttons directly encode text to waterfall
images
using ChirpPix, Spectrum Painter or similar code. Load text to send
from
an external text file to support customization. Include default
messages
in English if files are not present. G,
B, ID and TUNE buttons are now functional using code only (no WAV files
needed). Nov 6, 2022.
Any thoughts or suggestions
on these topics can be made to: