DAB receiver - SDR-J DAB

SDR-J-DAB 0.98∗
Software for SDR: the DAB receiver(s)
Jan van Katwijk
Lazy Chair Computing
The Netherlands
[email protected]
February 17, 2015
©: 2015, Jan van Katwijk, Lazy Chair Computing
Differences between versions 0.97 and 0.96 Modifications to the DAB software when
compared to the 0.96 version are limited.
• One of the unresolved issus in the previous version(s) of the DAB receiver was that
the audio-outputbuffer tended to overflow regularly. This lead to ticking in the outputstream (when the - pretty large - buffers were full and then data was just thrown away).
Measurement showed that for each AAC segment in a DAB+ stream, a segment containing 120 msec, PCM samples good for not less than 127 msec audio were generated.
It seems that the faad software interprets the AAC960 code as AAC1024 code, which
would explain the difference. Since the faad library is borrowed and not under control,
we ”solved” this issue by extending the software pipeline by a downsampler from 51200
to 48000 samples per second1 . Obviously, there is the opportunity to switch off this
additional downsampler by a setting in the .ini file.
• A second modification was adding the interface to the Mirics sdrPlay. Thanks to the
Mirics people who made libraries available for both Windows and Linux, it was pretty
simple to interface to the sdrPlay.
• A third modification was re¨ımplementing the dumping facility. With the addition of
support for the Mirics device with more (at least 10) bits per sample, the dumping
facility was extended to generate common .wav files. (For backwards compatibility, the
possibility of reading in .raw files is maintained.)
• A fourth issue was the configuration selection between em ffmpeg and KJMP resp. ffmpeg
and faad in generating the executables. It was decided to simplify the building process
by eliminating the choice: now all DAB frames are processed using KJMP, all DAB+
frames are processed using faad2 .
• Finally - an implementation detail - the handling of the DABstick interface for Windows
and Linux was harmonized. The required functions from the ”.dll” under Windows
resp. ”.so” under Linux for both Mirics devices and DABsticks are loaded dynamically:
running the program in absence of the library for the device is certainly possible (using
the device is not).
Differences between versions 0.98 and 0.97 From a user’s perspective the main difference is that a second version of the DAB software with a very limited GUI - the mini - is
made part of the distribution. The difference between these two versions is the GUI and GUI
handling, they share all code for the actual data processing.
A second difference is the addition of the Airspy device in the list of supported devices.
As is well known, ExtioXXX.dll files are constrained to 32 bits Windows, and since the DAB
software requires 64 bit Windows, ExtioXXX.dll’s cannot be used in the interface.
Work is being done to look for the correct settings of the faad library
It is not too complicated to modify the code such that the ffmpeg library is used.
A third - minor - difference is the addition of a small colored field indicating the state of
time synchronization: green is OK, blue means that the signalstrength is low, but the software
is trying, and yellow means it is hopeless with this signal.
A fourth difference is that now for each of the selected devices a small frame will pop-up
when the device is selected, where settings specific to the device are handled.
The DAB software has been tested under Windows 7, and various 64 bits versions of both
Ubuntu and Fedora.
The DABreceiver software comes - as the other members of the SDR-J family - in two flavors:
for Windows 64 there is a single zipped folder containing the executables of the DAB receivers
as well as some of the required dlls. For Linux, sources are available and one has to create the
Installation under Windows
Just unpack the zipped file. A folder windows64-bin will be created that contains the executables and (almost) all required ”.dll”’s. For using either a Mirics sdrPlay or a DABstick, some
additional steps have to be taken.
Mirics sdrPlay One has to install a Mirics driver through a Mirics installer program. The
libraries and installation software for the Mirics sdrPlay can be obtained from the developers
http://www.sdrplay.com/downloads.html. If/when installation is successful, the appropriate
”.dll” will be found when running either of the dabreceivers.
DABsticks For successfully running the software with a DABstick, one has to obtain the
appropriate rtlsdr.dll file, and one needs to install another usb driver for the RTL2832 based
sticks. Installing the right USB driver is done by the Zadig program. There are many examples
on the internet how to run Zadig. Basically just run the Zadig program with the DABstick
inserted in one of the USB ports. The Zadig program (should) detect(s) the DABstick, and
will suggest WinUSB as a replacement.
Downloading the ”.dll” file is best done from the site of the developers http://sdr.osmocom.org/trac/wiki/rtlsdr. Pls ensure that you download the 64 bit version. Place the ”.dll” file in the windows64-bin
folder or adjust the searchpath.
Installation under Linux
For developing executables under Linux, the packed sources are available. A brief description
of building for Linux is given in section 4 of this manual. That section also contains some notes
on the installation of libraries required for the Mirics device and the DABstick under Linux.
Running the DABreceivers
Starting the program is by clicking on its icon or using a command line in a command window
with the (path)name of the program.
The DAB-mini
The first start of the DAB-mini program is to be done in a command line setting: one has to
specify the device that is being used. Open a command window, ”cd” to the folder where the
program is kept, and start the program with
sdr-j-dab-mini -D XXXXX
where XXX is to be replaced by either ”sdrplay” for the Mirics sdrplay, by ”dabstick” for
RT2832 based DABsticks, or ”airspy” for the airspy device.
By default the program will start up with as selected band ”Band III”, and will be configured to use DAB Mode 1. The band can be selected in the command line, as can the
dab-mini -D sdrplay -M "Mode 1" -B L_Band
will select the sdrPlay as device, Mode 1 as mode and the L Band for the channel selection.
For Mode one may use ”Mode 1”, ”Mode 2”, ”Mode 3” and ”Mode 4”, for the band one may
use ”L BAND” and ”MODE III”. Do not forget the quotes.
These parameter settings will be stored and used the next times the program is started.
So there is no need to specify the parameters once they are set. When a parameter is given in
the command line, it overrules previous choices.
The dab-mini will start automatically and will try to identify an ensemble.
Channel selection - in the selected band - is possible through the combobox on the bottom left
on the GUI, gain selection (actually selection of gain reduction) is possible using the spinbox
to the right of the channel selector. The indicator on the screen needs to be green, in which
case time synchronization is ok. If yellow or blue, no (time) synchronization has been achieved.
Output selection is by the remaining combobox.
It may take some time before an ensemble - and its constituents - can be
identified. In weak signal environments, it might be helpful to press the reset
button, such that the synchronization process is restarted. It also might be helpful
to find a suitable setting for the ”gain” selector, depending on the specific conditions.
The DAB receiver
Starting the program will set it in an idle state. Before processing can start, one has to select
a device through clicking on an entry on the appropriate combobox. Supported devices are:
• no device. No input device will be selected, input will consist of nothing;
• sdrPlay. A Mirics sdrPlay as input device is assumed to be connected to an USB port.
Output of the sdrPlay device - and thus program input - consists of a raw stream of 10
bit integer values, mapped onto complex I/Q samples by the software.
• DABstick. A DAB-stick as input device is assumed to be connected to an USB port.
DAB-stick output - and thus program input - consists of a raw byte stream, mapped
onto complex I/Q samples by the software.
• airspy. An airspy device as input is assumed to be connected to an USB port. ”.raw”
file input. A menu will be displayed for selecting a file. The raw bytes in this file will
be the input. Note that the format of the input is a raw stream of I/Q data bytes as
delivered by the DAB-stick. The filename should have an extension ”.raw”. Such a file
could have been generated by previous versions of the DABreceiver software. Current
”dumping” creates a ”.wav” file.
• ”.wav” file input. A menu will be displayed for selecting a file. The data in this file will
be used as input. ”.wav” files, suitable as input file, can be generated by the program
itself. Note that only ”.wav” files with the correct samplerate (2048000) and 2 channels
will be accepted.
If/when a device is selected a small window will apear with settings specific to the device, i.e.
gain, offsets etc.
The program will use an ”.ini” file, $(HOME)/.jsdr-dab.ini for obtaining some state information from previous sessions and for some general configuration data. Absence of the ”.ini”
file (as will be the case in most cases on a first invocation of the program) will not harm
the program, just some (seemingly) suitable default values will be chosen and - after normal
program termination - the ”.ini” file will be created.
It is common practice to just start the programs and quit it to obtain an ”.ini” files with
default values.
After having selected a device (selector labeled ”1”), the user of the DABreceiver may select
a Mode (selector labeled ”2”), a band (selector labeled ”3”), and a channel (selector labeled
”4”). The channels map onto the standardized frequencies for the DAB channels in the selected
Mode is by default set to Mode ”1”, band to ”III”.
Actual running of the program will start after pressing the ”START” button (labeled ”5”).
When started, the DABreceiver will to try to synchronize with the incoming data: this may
take (quite) some time, depending on the quality of the received signal. In general, one will
see the spectrum first, and, as soon as there is time synchronization, dots of the signal will
show in the black screen. The more the collection of dots resembles a large ’X’, the better the
quality of the signal. The execution of the program can be stopped by pressing the ”QUIT”
button (labeled ”6”) The button labeled ”15” selects between a spectrumview and a waterfall
view on the incoming data.
When synchronized, the program will try to identify the name of the ensemble and the
names of the programs encoded within the ensemble. As soon as correct data is found, the
names of the stations covered by the ensemble will be displayed (16). Selecting such a particular
station in the list by clicking with the mouse on it will start further decoding and might lead
to sound output.
When in sync, three numbers, right from the device and channel selector, are displayed in
larger digits:
• the detected offset in KHz. A simple mechanism is applied to try to correct for a possible
deviation of the oscillator of the device. When synchronized, the offset in KHz, as
found by the software, will be displayed. The number just below this Khz offset is the
instantaneous offset in Hz, which may vary during reception due to e.g. atmospheric
• the actual, detected, length of the frames in number of samples, which should be 196606.
• the actual samplerate, which should be 2048000
The bottom line of the GUI will show (technical) information on the selected station. The
display top-left shows one OFDM symbol of each frame in the complex plane. The more a
clear and large X is shown, the better the quality of the received signal. The spectrum display
shows the spectrum of the received signal, it has a width of app 2 MHz.
Dumping the raw input data will be initialized after pressing the ”dump” button (labeled
”7”) and the subsequent selection of a file through the file menu (and stopping after pressing
it again). Writing the PCM audio onto a file is initialized by clicking on the ”audioDump”
button (labeled ”8”) and selecting a file through the file menu that appears. Again, pressing
the button for a second time will stop dumping.
Audio output of the DABreceiver will be sent to a soundcard, the channel on the soundcard
is selected through the selector labeled ”9”. One must realize that after selecting a different
output device, output might have to be restarted by (re-)selecting a ”station”.
Pressing button labeled ”10” will cause a soft reset, i.e. the synchronization will start all
over again. Pressing on button ”MP2”a (labeled ”11”) will ask for selecting a file to which the
MP2 output (i.e. regular DAB output, if any) will be written. Pressing the button again will
close the output file and stop writing. The file then can be used as input to other decoders.
The same applies to button ”AAC” (labeled ”12”) for DAB + output.
Lowering the selected frequency is steps of 1 Khz is done by pressing the button labeled
”13”, similarly, increasing the frequency is steps of 1 Khz is done by pressing the button labeled
”14”. For experimental purposes, there are some more spin-boxes and selectors, these do not
relate to normal operation.
The ”.ini” file Many of the settings for the DABreceiver will be read from the ”.ini” file on
program startup. If no ”.ini” file exists (yet), suitable defaults for the various sliders and selectors are chosen. The default location for the ”.ini” file for the DABreceiver is $(HOME)/.jsdrdab.ini3 . The file contains entries
Concurrent is not settable through the GUI, it tells to run the MPEG decoder in a different
thread (value 1) or in the same thread as the rest of the dab decoding (value 0). On a machine
Calling the program with -i filename will make the file filename the ”.ini” file
with many computing cores, there is a slight gain in efficiency when concurrent execution is
displaySize cannot be set through the GUI, it is the number of elements in the spectrum
display. The smallest value with reasonable results is 128.
iqDisplaySize indicates the number of points used to create the X on the scope. This size
cannot be altered throug the GUI.
autoCorrector is a boolean value (0 : false, 1 : true). When set the program tries to detect
the correct coarse offset for the selected frequency. When not set, the GUI selectors have to
be used for course synchronization. This setting, default set to 1, cannot be altered through
the GUI.
overflowShown is a boolean value (0 : false, 1 :true). When set the program reports
periodically the amount of overflow in the input buffer. This setting, default set to 0, cannot
be altered through the GUI.
faadcorrect indicates whether or not an internal downconverter from 51200 to 48000 should
be used. The default is set to 1, i.e. a correction will be applied. This setting cannot be altered
through the GUI.
The ”.ini” file will also contain settings for the selected devices.
Building the executables under Linux
Unpacking the sources of the distribution is in a single directory sdr-j-dabreceiver-0.98 with as
• src, where the sources are kept, and
• includes, where the include files reside.
• large-gui, where sources specific to the regular DAB receiver are stored, and
• small-gui, where the sources, specific to the dab-mini are stored.
These latter two directories contain (a.o) a file CMakeLists.txt and a file sdr-j-dabreceiver098.pro. The former contains data for using cmake as generating device, the latter contains
data for QMake as generating device.
Required packages and Libraries
One needs, next to the GNU compiler suite (g++),
• Qt-4.7 or Qt-4.8 (No effort has been made as yet to use Qt-5)
• Qwt 6.x.x. The sources, developed under Fedora, are based on Qwt 6.1.0.
• libusb-1.0,
• libportaudio. Ubuntu 14.04 LTS still supports libportaudio-1.18, as standard package.
Replace this with 1.19, which is easy using the standard package handler.
• libsndfile and libsamplerate,
• libfftw3f, we use, different from previous releases, floats rather than doubles and therefore
the libfftw3f,
• libfaad,
• librtlsdr in case one wants to use a DABstick,
• libmirsdrapi-rsp.so, for the sdrPlay.
For these packages, one needs both the library and the development package.
For Ubuntu a validity check is given in the shell script below
echo "Preparing the environment for Ubuntu"
echo "ensure that the udev rules are adapted for the usb devices
echo " "
echo "install packages"
sudo apt-get install gcc g++ \
libqt4-dev libqwt6-qt4 libqwt6-qt4-dev \
libfftw3-3 libfftw3-dev \
alsa-base libasound2 libasound2-dev alsa-utils libasound2-plugins \
libportaudio2 libportaudio-dev \
libsndfile1 libsndfile1-dev \
libsamplerate0 libsamplerate0-dev \
libusb-1.0-0 libusb-1.0-0-dev \
librtlsdr librtlsdr-dev
libfaad libfaad-dev
Note that Ubuntu repositories provide for a package librtlsdr.
For Fedora, depending on the distribution, the following script might help
echo "Preparing the environment for Fedora"
echo " "
echo "install packages"
sudo yum install gcc gcc-c++ \
qt qt-devel qwt qwt-devel \
fftw fftw-devel \
alsa-lib alsa-lib-devel alsa-tools portaudio portaudio-devel \
libsndfile libsndfile-devel libsamplerate libsamplerate-devel alsa-plugins-samplerate \
libusb1 libusb1-devel \
rtlsdr rtlsdr-devel \
Note that Fedora (at least recent versions) provide for a package rtlsdr in their repositories.
Mirics sdrPlay Mirics Ltd provides on its sdrPlay site www.sdrplay.com a support program
for installing the shared object library, libmirsdrapi-rsp.so. The library will be installed in
librtlsdr In most cases librtlsdr is indeed available and can be installed through the mechanisms available with the Linux distribution. In case the library is not available, a description
of the library and how to build it is to be found on the osmocom site
Note that, under Ubuntu 14.04 the kerneldriver dvb usb rtl28xxu needs to be put on the blacklist.
Qmake and CMake The current distribution was built using qmake-qt4 as generator for
Makefiles. qmake will use the .pro file as basis. The ”dabreceiver.pro” file contains - thanks
to contributors - lines that have shown to be working on Fedora, Ubuntu systems and - by
default commented out - on freeBSD. Next to a ”.pro” file, a CMakeLists.txt is available for
use with CMake.
Other Linux distributions most likely will provide the full set of packages required for
building, probably on other locations, in which case the ”.pro” resp. or CMakeLists.txt files
may need to be adapted to the particularities of the different Linux distributions.
When all libraries (including the corresponding ”include” files) are in place, for use with
qmake, one executes in the directory small-gui or large-gui
to generate the executable, which will be put in the directory mentioned as value of the DEST
In case CMake is used for building an executable, one creates within either the small-gui
or large-gui directory an empty directory ”build” and calls ”cmake ..”.
mkdir build
cd build
cmake ..
sudo make install
The executable will then be created and installed in /usr/local/bin.
It it obviously wise to ensure rights for reading and writing usb port and soundcards before
running the program. One may use the instructions given on the aforementioned osmocom
page, installation instructions for the Mirics dongle or sdrPlay.
Final remarks
The SDR-J software uses a number of libraries, made available through (L)GPL style licenses
and parts of the code is based on ideas of others. In all cases attempts are made to indicate
the rightfull owner of the copyrights. The software itself is available as is, under a GPL V2
The SDR-J set of software is essentially the result of a hobby project. It is - obviously not finished, after all it is software and it is most likely that it never will be finished. Many
enhancements (and experiments) are still waiting to be done. Contributions in any form, e.g.
by suggestions for extensions, by contributing to code, or by donations for further development.