Difference between revisions of "Notes on Soundmodem"

From HacDC Wiki

(→‎So, how is this supposed to work, anyway?: clarification and simplification, naming consistency and trimming of linguistic cruft.)
Line 159: Line 159:
**Has some notes on how to tune your laptop's sound levels for optimal operation.
**Has some notes on how to tune your laptop's sound levels for optimal operation.
*[ Amateur radio nodes] in the [ Arch Linux wiki]
*[ Amateur radio nodes] in the [ Arch Linux wiki]
* Alternatives
** hardware [[HAM_TNC|TNC]]

Revision as of 07:45, 10 June 2013

Soundmodem emulates a hardware TNC in software, vis a vis a daemon running in userspace.

v0.18 is the latest (as of June 2013), I recommend using that. It now only depends on two things, audiofile and gtk2.

Soundmodem will either turn your soundcard into a KISS radiomodem (serial modem) or an AX.25 network interface. We're going to be using it to create AX.25 network interfaces (/sm[0-9]*/ or /ax[0-9]*/).


From Source: Ubuntu Karmic and Lucid

sudo apt-get install libasound2-dev libxml2-dev libgtk2.0-dev libaudiofile-dev

tar xvzf soundmodem-0.18.tar.gz
cd soundmodem-0.18
./configure && sudo make install
sudo mkdir /etc/ax25  ## or else it won't be able to save your configurations

Configure it by running (as root) /usr/local/bin/soundmodemconfig. It will open a window on your desktop with nothing in it. Click File, New, Configuration. Give your configuration a name (I used 'sm0').

Apt-Get: Ubuntu Lucid and Up

Gets you version 0.13 on Lucid, and 0.15 on Maverick and Natty

As root do the following

apt-get install soundmodem
mkdir /etc/ax25
soundmodemconfig /etc/ax25/soundmodem.conf #see below for configs
soundmodem /etc/ax25/soundmodem.conf -R -M >/dev/null 2>/dev/null& #this makes an awful noise when it works

On Fedora


Arch Linux

sudo packer -S soundmodem ax25-apps ax25-tools

On Slackware (current?)


if [[ "$ARCH" == "x86_64" ]] ;then
mkdir soundmodem-0.18-pkg

tar xvzf soundmodem-0.18.tar.gz
cd soundmodem-0.18
./configure --prefix=/usr --libdir=/usr/lib${LIBDIRSUFFIX}
sudo make install DESTDIR=../soundmodem-0.18-pkg
cd ../soundmodem-0.18-pkg
makepkg -l y -c n /tmp/soundmodem-0.18-$ARCH-1_local.tgz
sudo mkdir /etc/ax25  ## or else it won't be able to save your configurations


IO Tab

On the I/O tab, choose your sound driver (out of soundcard, file, simulation, and alsa, I picked alsa). You'll have to play around with the value of the ALSA Audio Driver field to get one that works. On Windbringer, I used plughw:0,0. Check half duplex for now. Leave the Capture Channel field set to 'mono'. I don't know what to set the PTT Driver field to yet, so I left it set to 'none'. My radios do VOX so I've been experimenting with that.

Haxwithaxe, Dan, and Mirage are working on PTT circuits for our radios. It hasn't been an easy process because the Baofengs seem to kick out just enough EMI to make the circuits act weird as-is. We have a few partial solutions at this time.

Channel Access Tab

Don't change the settings on the Channel Access tab.

Channel 0

Right below the name of your configuration in the tree you will see a new entry, Channel 0. If you select it you'll be presented with three new tabs on the right.

Modulator Tab

The possible values for the Mode selector are Off, fsk, afsk, pam, psk, and newqpsk. I picked fsk because it grants the highest effective bit rate (9600 bps). The values for Frequency 0 (1200), Frequency 1 (2200), and Filter (df9ic/g3ruh) were left set to defaults. Leave Differential Encoding checked.

Demodulator Tab

On the Demodulator tab (which governs decoding audio signals into bits) the options are much the same because they match the modulation scheme by default. This is what we want.

Packet IO Tab

On the Packet IO tab, the network/non-serial side of soundmodem is configured. Pick an IP address, netmask, and broadcast addres for a regular network interface. There are two options in the Mode selector, KISS and MKISS. I went with the default (MKISS). The network settings we used are:

  • IP address: 44.x.y.z (pick something)
  • Netmask:
  • Broadcast:

We're using the AMPRnet IP block which was set aside for amateur radio use. We should probably use the private subnet of that, 44.128/16 because it's akin to the RFC-1918 subnets and is used for experimentation in this area.

Audio settings

From alsamixer:

  • Master: 13
  • Headphone: 100
  • Speaker: 94
  • PCM: 76
  • Mic: 37
  • Mic Boost: 0


When running the soundmodem utility (soundmodem /etc/ax25/soundmodem.conf &), the daemon configures the sound card to send and receive bitstreams encoded as audio through the jacks in the soundcard. It allocates a virtual network interface (sm0) which has a callsign associated with it which serves as the MAC address (relevant for ham radio, not so much for other applications) as well as an IP address, network mask, and broadcast address. The idea is that whatever packets are sent through that network interface will be transparently converted into sound and transmitted using whatever device is connected to the headphone and microphone jacks of the computer. Conversely, any data received by the broadcast device (ham radio, laser, etc) is demodulated into bits, encapsulated into network frames, and made available to the OS.

In theory, it's just like a regular network connection, with all of the dynamics you'd expect from IPv4. This means that we can do things like IP multicasting over these links. We discovered, through analyzing the code for a utility called easypacket that the Linux kernel treats AX.25 interfaces as real network interfaces, so much so that it sets up some iptables rules to prevent arbitrary traffic from being routed over them because there isn't much bandwidth. We'll have to add that to our rules. We tried setting up IPv6 addressing on some AX.25 interfaces and weren't able to.

Diagnostics, Testing, and Configuration

As root:

Note: you can connect two computers mic->headset to help check things are working before they hit the radio. ping and netcat (with -u option) are decent options for quick checks on rough sanity (the config not you :P). Keep the volume low at first to avoid accidental overload of the other machine.

Here's where you debug your configuration. It's going to take some flipping back and forth between tabs to get right the first time.

soundmodemconfig now pops open windows with error output.

The Diagnostics menu only appears when you have a channel (Channel 0) highlighted.

The first option is Scope, for oscilloscope. To get a test signal, click the PTT button (make sure your speakers are turned down!)

The second option is Spectrum, for spectrum analyzer of the signal being send to the sound card. To get a test signal, click the PTT button (again, make sure your speakers are turned down!)

The third option, Modem, dumps the raw bitstreams that your soundcard-emulating-a-modem is sending and receiving. Seeing strings of bits (even when disconnected) means that you have probably configured soundmodem correctly.

I do not know what the AO40-P3D option does. (It's an amateur satellite protocol thingy. We don't need it?)

To save your config file, use the File, Quit option. It'll save it automagically to /etc/ax25/soundmodem.conf.

So, how is this supposed to work, anyway?


  • Assume that you have a computer running Linux (or Windows if you dare) and soundmodem (aka PC). That has a pair of audio i/o:
    • headphone (PC speaker)
    • microphone/line in (PC mic)
  • Assume that soundmodem is configured correctly.
  • Assume that you have a transceiver (aka radio) - a black box that:
    • That can receive and broadcast signals
    • Has a pair of audio i/o:
      • speaker/headphone (aka radio speaker)
      • microphone (aka radio mic)
  • Assume a method of PTT as described below is setup.


Further assume that there is a mechanism to switch the radio from receive to transmit. Known here as PTT circuit for the purposes of brevity. This may be:

  • the built in VOX circuit
  • an external VOX circuit
  • or a serial PTT circuit

Whenever a signal is sent to the PTT circuit, the black box stops receiving and transmits whatever signal it gets through its microphone jack. Alternatively two radios one transmitting only and one receiving only (possibly on different channels) such that there is no need for drivers or a switching mechanism.


  • Connect radio speaker to PC mic.
  • Then connect PC speaker to radio mic.
  • If applicable: Attach the PTT circuit as appropriate.

Whenever a packet (say an ICMP4 echo request) is transmitted to the IP address of the AX.25 interface on PC, it is converted by soundmodem into modulated sound (aka audio data) which goes out through PC speaker to the radio mic. The PTT circuit engages and the radio stops receiving and begins transmitting. The radio receives the audio data and transmits it. When the transmission is done the PTT circuit disengages and the radio stops transmitting and begins receiving. Conversely, whenever the radio receives a signal, it converts it into audio data, which then goes through radio speaker into PC mic. After the audio data is received by the PC soundmodem demodulates it into bits, packages them into IP packets, and drops it into the networking subsystem of the kernel.

By using soundmodem we'll be setting up an AX.25 network interface that, insofar as we're concerned, acts just like an ethernet interface (just crazy slow, 9600bps at best 1200bps likely). We can use ifconfig, route, and ip to configure it, IPtables to filter traffic, and /proc/net/ipv4/* to tweak it (and set up packet forwarding). IPv6 is not currently supported on AX.25 in the linux kernel (~v3.8.x).

Other resources