martedì 27 luglio 2021

PiFmMorse: A Morse Code FM Radio Transmitter for the Raspberry Pi by dotimothy

Shared Link:


1. Run sudo (If not it will ask for sudo password during program)
2. Type Input in Morse Code (Refer to this chart for all possible characters)
3. After Audio Compilation, Select Frequency to Broadcast On.
4. You're done, tune an FM-Frequency on the Radio to listen to your input!


  1. This only works for Raspberry Pis with GPIO pins
  2. You need sudo permissions to run this program, as the FM transmitter requires you to have them. Please run sudo beforehand.
  3. Without any antenna, the broadcast is limited to an area of around 10 cm. To extend your coverage, please attach a wire (~10 cm) to GPIO 4 (Pin 7), to extend your range to upto a few meters!

4. When doing FM Transmissions, always apply a Band-Pass Filter to prevent transmission leaks in the harmonics.
5. Last but not least, make sure to follow FM transmissions guidelines for unlicensed transmission. If you are from the United States, read the FCC guidelines on Low Power Radio, Part 15. In essence, don't interfere with occupied frequencies and make sure your transmissions doesn't extend over 200 ft (~60 meters).

When trasmitting FM Signals, always use a Band Pass Filter!

Credits: Used the FM Transmitter Program created by markendoej to transmit the output wav file compiled in

Disclaimer: Please follow the guidelines in your country when broadcasting FM Signals and Morse Code. Use your Raspberry Pi legally and responsibly.

TAG: #GiammaIoT @GiammaIoT #SoftwareDefinedRadio #SoftwareDefinedRadios #SDR #RaspBerry #CW #Morse #RpiTx #Ham #HamRadio #Transceiver #Transmitter

xaVNA 135MHz to 3.5GHz a full featured, low cost 2 port, simple and cheap vector network analyzer, including support software by xaxaxa-dev

Shared Link:

A simple and cheap vector network analyzer, including support software.

As seen on kickstarter:

Directory layout

  • libxavna: C & C++ library for accessing the hardware, see in subdirectory for more info
  • vna_qt: QT GUI
  • pcb: schematics, pcb layouts, and simulation files
  • vhdl: circuitry implemented on the fpga


  • Frequency range: guaranteed 137MHz - 2500MHz, typical 135MHz - 3500MHz
  • Output signal level (configurable in software): -20dBm to 10dBm, with 1dB increments


  • The main board connects to a PC through usb and communicates via a virtual serial port device; the PC software sets the frequency and other parameters by sending two-byte register write commands, and the device sends averaged vector values representing magnitude and phase of measured waves.

Table of Contents


For pre-compiled executables go to:

Building the software

Building on linux

Build libxavna (required for QT GUI):

sudo apt-get install automake libtool make g++ libeigen3-dev libfftw3-dev
cd /PATH/TO/vna
autoreconf --install
cd libxavna/xavna_mock_ui/

Build & run QT GUI:

sudo apt-get install libqt5charts5-dev
cd /PATH/TO/vna
cd vna_qt
export QT=/PATH/TO/QT # e.g. ~/qt/5.10.1/gcc_64
../run ./vna_qt

Building on mac os

brew install automake libtool make eigen fftw
cd /PATH/TO/vna
# result is in ./vna_qt/

Cross-compile for windows (from linux)

Download and build MXE:

cd ~/
git clone
cd mxe
export QT_MXE_ARCH=386
make qt5 qtcharts cc eigen fftw pthreads

Edit mxe/ and add i686-w64-mingw32.shared to MXE_TARGETS.


cd /PATH/TO/vna
export PATH="/PATH/TO/MXE/usr/bin:$PATH"


Main board (release 2)

Calibration standards (Short, Open, Load)


Open circuited coax stub


Time to fault (measuring coax cable)

Block diagram

Overall architecture

Receivers & interfacing

Signal generator

FPGA logic

Parts selection

T/R version

  • fpga: XC6SLX9-2TQG144C
  • adc: AD9200
  • mixer: AD8342
  • synthesizers: ADF4350
  • rf switches: BGS14GA14
  • programmable attenuator: PE4312

Full two port version

  • fpga: XC6SLX9-2TQG144C
  • adc: ADC10080
  • adc driver: ADA4932-1
  • mixer: AD8342
  • synthesizers: ADF4351
  • rf switches: RFSW6024, BGS12PL6
  • programmable attenuator: PE4312

TAG: #GiammaIoT @GiammaIoT #SoftwareDefinedRadio #SoftwareDefinedRadios #SDR #xaVNA #VNA #Vector #Network #Analyzer #Antenna #Impedance #FPGA

lunedì 26 luglio 2021

directTDoA: python 2/3 GUI designed to compute TDoA runs on shortwave radio transmissions using remote (GPS enabled) KiwiSDR receivers around the World iwth Windows, Linux and Mac


Shared Link:

directTDoA 6.20 screenshot 

  To Install and run, visit
   Refer to here for the installation procedure
   Here are some TDoA runs i've made so far using the GUI : runs
   Here are the code evolution screenshots: screenshots
DirectTDoA v5.10 video demo from YouTube: 
Here are the code evolution screenshots preview :

DirectTDoA v7.02

Shared Link from GitHub:

This software is JUST a python 2/3 GUI designed to compute TDoA runs on shortwave radio transmissions using remote (GPS enabled) KiwiSDR receivers around the World.

TDoA = Time Difference of Arrival .. (in this case: the Arrival of shortwave radio transmissions)


The decision was made not to support installation from the repository.

Download, unzip and extract it

Then double-click on directTDoA.bat

IMPORTANT: You must use only this method to launch the program to avoid file path issues.

Info: this archive contains all the necessary files already patched and compiled and also includes light versions of GNU Octave and python, so no need to install the full versions of the last two on your machine. The unzipped archive is 272 MB, compared to ~2 GB in the other installer way.


Install python 3 and python-pip using your package manager

Install GNU octave

Install git, patch, gcc, base-devel, ttf-dejavu, gcc-fortran, tk, portaudio, xdg-utils, epdfview, fltk

git clone --recursive

cd directTDoA

./ (this script will install python modules, compile the necessary .oct file and apply some files patchs)

IMPORTANT: The octave files compilation process takes a lot of time, be patient, ignore warnings and don't stop the script


NOTE: on some distros you may need to install liboctave-dev


Install Homebrew, in terminal : /usr/bin/ruby -e "$(curl -fsSL"

Install Python, in terminal : brew install python@2 or brew install python@3

Install GNU Octave in Terminal : brew install octave

git clone --recursive

cd directTDoA

./ (this script will install python modules, compile the necessary .oct file and apply patches to some files. Check errors but Ignore warnings)



  • This python GUI code has been written and released under the "do what the f$ck you want with it" license


  • v1.00-1.50 : first working version, basic, static map, manual host adding, hardcoded coordinates, manual octave code run etc...
  • v2.00 : current work, update & dynamic maps full of GPS enabled nodes, auto octave code run, easier to use
  • v2.10beta : adding differents maps that can be choosed by the user, early work on SNR and tiny waterfall for nodes
  • v2.20: adding favorite/blacklist node management, popup menu when clicking a node gives: add for TDoA proc + Open KiwiSDR in browser
  • v2.21: reducing the map boundaries red rectangle 'sensivity' when mouse is near main window borders
  • v2.30: adding node color change possible + code clean-up + adding a popup window telling you forgot to choose your map boundaries before starting the IQ recording + Popup menus are now disabled (Add/Open) if the node has no slot available + Added a gray scale map more brighter
  • v2.31: bugfix on checkfilesize process
  • v2.32: adding a restart GUI button
  • v2.33: adding MacOS X compatibility, thx Nicolas M.
  • v2.40: known points (world capitals) listing is now a file, format is 'name,lat,lon' - easier for you to add yours :-)
  • v2.41: update process modified due to missing tags for some nodes in page
  • v2.42: forgot some conditions for MacOS compatibility oops thanks Nicolas M. again :-)
  • v2.43: auto create the directTDoA_server_list.db file at 1st start, file does not need to be in the repo anymore
  • v2.44: MacOS tested OK, code cleanup + warning about missing GPS timestamps in IQ recordings -uglymaps +kickass NASA maps
  • v2.50: some TODO list items coded or fixed
  • v2.60: map update now based on John's json listing + GPS fix/min map filter + nodes are identified by IDs, no hosts anymore + no .png file creation (patch) + no more gnss_pos.txt backup and no more TDoA/gnss_pos/ purge
  • v2.70: Octave subprocess management modified (no more octave defunct remaining in "ps aux" now) + stdout & stderr saved in the same "TDoA/iq//TDoA_.txt" file
  • v2.71: each node color brightness is now based on its latest GPS fix/min value, it will become darker when fix/min will go towards "0" + my own kiwiSDR coordinates more accurate
  • v2.72: Adding the SNR values of each node from linkfanel's (JSON) database + Color points (nodes) change in brightness according to the SNR, minimum=0 <darker - brighter> maximum=35? (version not released)
  • v2.80: Listing update is now made from both linkfanel's (JSON) databases only (GPS enabled nodes list + SNR values) + adding regexp to create TDoA_id (parsing callsigns), IPs and node various coordinates format (version not released)
  • v2.90: Code clean-up + SNR values are now only from IS0KYB (JSON) database + count TDoA runs at start + adding a ./ script to backup dir + directTDoA node db now in JSON format + add map legend + popup menu font color managed for more readibility + new maps
  • v3.00: More code clean-up and as the GUI has changed a lot recently, it's now entering the v.3xx version range
  • v3.10: Removed "20 kHz wide audio bandwidth mode" set KiwiSDRs from the node list, incompatible with TDoA at this time (2jan19) + reachability & GPS_good, fixes_min, user, users_max values are now dynamic when node is clicked on map (timeout/host not found/obsolete proxy data)
  • v3.20: Better management of clicked nodes (checking offline=yes/no + TDoA_ch>=1 + fixes_min>0) + default IQ rec BW in config file added + possibility to restart the IQ rec process + Marco/Pierre websites checked before update process start + current release version check menu added
  • v3.21: the popup when map boundaries are set has been removed - adding mode informations in the TDoA map result title - minor bug fixes with the bandwidth default/current setting
  • v3.22: map boundaries informations back, as label..
  • v3.23: bug fixes with add/remove fav/black process..
  • v3.24: allowing the possibility to "Open" a node in browser even if 0 GPS fixes were reported at instant T + minor date modification on TDoA output file title + minor text corrections
  • v4.00: no more GUI restart after TDoA runs (node list is kept intact) + Listen/Demod mode added, requires python modules pygame (for all) + scipy (for MacOS X), new file also required + possibility to remove a single node from the list + purge button added + check version runned on software start + minor fixes on many routines
  • v4.10: "Restart Rec" is now "Stop Rec" instead (it saves IQ files and generate .m file only) + added "Abort TDoA" routine so you can stop a previewed bad result octave process w/o having to restart full GUI + minor mods on checkversion(), float(frequency) and restart/close GUI + 200Hz high pass filter block commented out and empty known point block added in proc.m files
  • v4.18: early ultimateTDoA mode dev, adding a necessary patch for TDoA/kiwiclient/ to bypass returned errors causing full IQ recording process freezes (KiwiBadPasswordError & KiwiDownError) to apply run: patch -i kiwiworker_patch.diff ./TDoA/kiwiclient/
  • v4.19: adding another patch for TDoA/m/tdoa_plot_map.m to display the 'most likely position' string in the final pdf title + exchanging lon and lat values position for better reading - Note: that patch already contains the nopng patch previously released
  • v4.20: introducing new ultimateTDoA mode (massive IQ recordings without octave run from the GUI), nodes selection using the same way as defining TDoA map boundaries, all IQ files saved and dynamic bash script created in same ./TDoA/iq/subdirectory + recomputed pdf files now containing a timestamp so you'll keep all of them (instead of overwriting the only ./TDoA/pdf one)
  • v5.00: big code optimization + adding waterfall/SNR measurement + removing Marco website source + keyboard shortcuts + filter/color/icon/add rem fav/blk changes w/o restart - better precision on map (coordinates with decimals) + highlight on selected nodes + script (plotting IQ spectrograms w/o GPS ticks) + GUI colors management + world maps in final results + script to modify the recorded IQ files + Sorcerer TCP client for ALE auto-detect & auto-compute TDoAs
  • v5.10: removed KiwiSDR nodes "names" from .db files + compute_ultimate script has been transformed into GUI with plot_iq now only displaying the selected nodes + adding command arguments to script (./ -h ,for help)
  • v5.20: "directTDoA_v5.xx" now displayed on the KiwiSDR target's userlist when connected + simplification of the node rec-list management + adding a checkbox to automatically start (or not) script when "Stop Rec" button is clicked + extra command on KiwiSDR first line popup to add the node even if it has fixes_min=0 + new has_gps routine in both & + bug fix: regexp wrongly detecting LON + bug fix: if Sorcerer TCP client checkbox is unchecked while recording, no more endless record session.
  • v6.00: Listen mode (AM/LSB/USB) is back, to get it working you must apply a patch: patch -i kiwirecorder_patch.diff ./kiwiclient/ from directTDoA dir and install sounddevice + samplerate python modules with python -m pip install sounddevice samplerate + some python 2 Vs. python 3 bug fixes + bug fixed on map update process + .desktop files creation removed
  • v6.10: Restart GUI routine modified + less CMD windows for Windows OS users (using pythonw instead of python) + bug fix that caused the map to move suddenly far away when selecting a node (problem only noticed on Windows OS) + no more auto-PlotIQ() start on ultimateTDoA runs + modifications of the .bat files for Windows OS users (CPU affinity of the python processes now set towards a single one, the allocation on several generated a delay in the starting of the IQ records)
  • v6.20: User demand and personal use: added functionality to manage the overlapping of icons on the map. Now when you click near a cluster of multiple nodes, a menu will appear and allow you to choose the one you really want + some GUI design changes + bug fix on map locations search (avoid multiple displayed)
  • v7.00: Adding USB/LSB/CW/AM/2kHz/4kHz/6kHz/8kHz IQ BW presets + display bug fix for known places on map + adding recorded nodes Vs selected nodes counter + recording time in file size window + IQ rec length max limit set to 120 seconds (just in case) + TCP client modified, possibility to change the trigger word (regexp supported) + PDF title mods + remember GUI size & position on close + MAP & SNR update only via now + script added, to remove GNSS ticks from the IQs so files can get opened and demodulated fine
  • v7.01: Bug fix on map update because of a single KiwiSDR node using https (ofc it just happened after the v7.00 release - haha)
  • v7.02: Small but important fix


Special Thanks

  • Daniel Ekmann, naturally designated as a beta tester, for the help on coding, feedbacks and suggestions since the beginning.


TAG: #GiammaIoT @GiammaIoT #SoftwareDefinedRadio #SoftwareDefinedRadios #SDR #KiwiSDR #TDoA