MFSK16 is an Amateur-designed digital mode intended for keyboard conversation on the upper HF bands. It was specifically designed to provide good performance on long-path and trans-polar DX paths. It is a half-duplex non-ARQ continuous-phase MFSK synchronous mode with full-time Forward Error Correction (FEC). Operation is modestly slick (less than 5s latency), and typing speed (at about 42 WPM) is faster than most typists.
MFSK16 is intended for computer use, and is generated and received using the standard PC sound facility, for use with an SSB transceiver. Two modes are offered, MFSK16 (15.625 baud 16-FSK, 15.625Hz spaced tones) and MFSK8 (7.8125 baud 32-FSK, 7.8125Hz spaced tones). Both modes use FEC, employing the standard NASA convolutional coding algorithms with R=1/2, K=7, L=10 (L = interleaver length, 10 symbols or 40 bits), and the output mapped to the tranmitted tones via a gray coder. The interleaver is a 'diagonal' matrix interleaver, and is self-synchronizing. A binary varicode alphabet is used.
When the keyboard is idle, and no characters are waiting in the buffer for transmission, an idle character is stuffed into the coding stream (i.e. before the FEC coder) in order to maintain the transmission clock sync. Provision has been made for a 'secondary channel' alternative alphabet, to be used for ID purposes, although this has not as yet been implemented (see DominoEX mode).
Transmission always starts with a short burst of the lowest transmitted tone, which is intended as a tuning aid. It also helps to identify which sideband the transmitter is operated on, since this mode is sideband sensitive.
The transmitted tones are spaced by exactly the baud rate, so the integrate-and-dump detection technique in the receiver is able to determine the transmitted tones with maximum sensitivity and minimum cross-talk. The decision function after the detector determines which of the tone bins is most likely to contain the tone for each symbol period, and assigns it a weight according to that likelihood (i.e. is a 'soft decision' detector). This information is passed to the 'soft decision' Viterbi decoder, for maximum FEC performance.
Symbol sync, which defines which data is included in each symbol decision function, is recovered from the transmitted carrier phase and tone transition information, as no separate sync information is transmitted.
Technical Specs Varicode FEC Coder Interleaver
Transmitting MFSK is relatively straightforward. The data (say from the keyboard) is stored in a buffer, and once the transmitter is started, is sent on via a series of coders to the transmit modulator, which generates digital representation of the 16 tones used in a phase-synchronous manner, then sent to the sound card for conversion to audio.
When the transmitter keyboard buffer is empty, non-printing idle characters are stuffed into the transmitter via the coder, as it is important that the transmitter continues to operate without pause in order for synchronism to be maintained at the receiver.
The keyboard data and idle characters are sent through the transmitter at a constant rate, first going to the Varicoder, which uses a look-up table to convert the fixed-length ASCII text into a binary bitstream, where the code length depends on how frequently it is used. This is just like Morse code, and has three advantages:
- It is more efficient than ASCII (fewer data bits per word in plain text).
- It turns a byte-oriented text into a bit-stream, easily transmitted no matter how many bits-per-symbol are involved.
- It allows the data to be handled by a sequential convolutional coder and decoder used for error correction.
- It provides a virtually unlimited character set - extended ASCII with accented characters, plus non-printing control codes.
The Varicoder used for MFSK16 is similar to, but not the same as that used for PSK31. In particular, the need for continuous '00' signals to identify idle is not required, and so a more efficient code utilising combinations with repeated zeros is possible. Other codes outside the 256 character ASCII set are used for control purposes.
Convolutional FEC Coder
MFSK16 always uses FEC, so the next stage is a Binary Convolutional Coder, which generates extra data bits in such a way that the original data can be reconstructed in most cases, even with errors in reception. Two standard polynomial algorithms define the value of two output data bits for every input data bit. A standard NASA R=1/2 K=7 coder is used. The output is a bit stream at twice the input data rate.
The convolutional coder is followed by an Interleaver which jumbles up the order of the data bits. The effect of this is that when the data is received and 'unjumbled', the errors caused by bursts of noise are spread out, and have a less serious effect on the FEC decoder.
Of course the data must be mixed up in a standardised way, so that it can be recovered correctly. The MFSK16 Interleaver is unusual - while a conventional matrix technique is used, because it is based on rearranging the bits in 10 sequential nibbles (groups of four bits), it is possible to reconstruct the original order automatically, without the need to transmit extra synchronizing information. This is especially important where reception can be very poor and synchronism can be lost.
The tone generator is relatively straighforward, but hard to describe in simple terms. It operates with nibbles of coded data from the Interleaver as input. The MFSK signal is a series of phase synchronous sine wave tone segments, all the same length, 64ms, with no gaps. The tones always start and end with the same phase, and so have an integer number of cycles each (because they are spaced apart by the baud rate frequency difference). The simplest way to achieve this is to use a sine-wave Look-up Table (a large table defining many points on one sine wave period). A technique called a Numerically Controlled Oscillator (NCO) is used to sample the wave table over and over at a constant rate, but skipping a fixed number of table entries between samples.
Finally, the stream of values is sent to the PC sound card for conversion to audio tones to be sent to the transmitter. There is no variation in amplitude in the MFSK signal - only the frequency changes. The signal consists only of sine waves and needs no further filtering.
Matching Data Bits to Tones
The data bits to be transmitted don't have any particular relationship to the characters being transmitted, so it does not matter how many bits are transmitted at a time, so long as they are transmitted in the order they arrive. One of the advantages of MFSK16 is that each tone burst or symbol represents four bits of data, since there are 16 (24) possible combinations of four bits.
In order to evenly spread the potential for errors, a 'Gray Code' table is used to assign each of the 16 tones to a bit value:16 Tones: Tone Weight Tone Weight 0 (lowest) 0000 8 1100 1 0001 9 1101 2 0011 10 1111 3 0010 11 1110 4 0110 12 1010 5 0111 13 1011 6 0101 14 1001 7 0100 15 (highest) 1000
Unlike previous MFSK modes (Piccolo, Coquelet), no specific information is transmitted to provide the receiver with information regarding when to sample the received symbols. This important advance, since copied in other modes, relies on a special DSP technique in the receiver which can determine the sync from a power spectrum.
The receiver used in MFSK16 was, at the time, the most major departure from conventional technology in the whole project. In earlier MFSK designs such as Piccolo, the receiver was entirely electronic or electro-mechanical, and used a series of high gain filters, virtually oscillators, which were reset and allowed to generate output that built up during the whole of the following symbol period. This technique leads to very narrow, very sensitive, and very robust receivers for each tone. The output with the greatest response at the end of the symbol period was considered to be the one representing the transmitted data.
The problem is that it was electrically complex, expensive, required maintenance, and required some separate means for determining synchronism (Piccolo used AM modulation of the first 10% of each symbol, Coquelet used two separate tone sets). There had to be a better way!
The DSP equivalent of this 'integrate and dump' technique is the symbol-synchronous overlapping Discrete Fourier Transform (DFT). It is used in such a way that the samples of received audio for the duration of each symbol generate a time-integrated output similar to the Piccolo integrate and dump technique. The DFT is an excellent way to simulate the integrate and dump filter, because it has excellent filter response without ringing, accurate and very stable performance, can be designed to exactly match the transmitted tones, and its pulse response is also a good match for the transmitted data pulses. The outputs (the DFT bin power measurements) are also 'soft', i.e. effectively analog numbers, and also contain phase information not available with the Piccolo analog hardware technique.
The audio from the receiver can contain energy up to several kHz, and to avoid problems with the higher frequency energy causing interference (like an 'image' in a superhet receiver), the digitised audio from the sound card is passed through a digital low pass filter. The filter simply averages several samples together, limiting the high frequency response. It has the further advantage that it reduces the sample rate from the 8000 / sec coming from the sound card to something more manageable. This process is often called 'decimation'.
To bring the received signal into the correct range for the demodulator, the signal is frequency shifted, using a mixer as in a superhet receiver. In this case the mixer is a mathematical multiplier, multiplying the incoming samples with a stream of sinewave samples from a Numerically Controlled Oscillator (NCO). The NCO frequency is adjusted as the signal is tuned in, say using a waterfall display, and the same adjustment can tune the transmitting NCO. The mixer output is another stream of data samples.
FFT Filter / Demodulator
This is the heart of the receiver. A set of samples which represent all the energy received during one symbol is processed with repeated Discrete Fourier Transform (DFT) operations. The results consist of a table of energies measured at different frequencies, and over time.
The DFT data is 'windowed' by ignoring samples that could be in error at the beginning and end of each symbol period . These errors are caused by timing variations in the ionosphere, which tend to be frequency selective, so it is very possible for one tone to run into another to some extent, even though they were transmitted one after another, and widowing helps reduce this effect.
The number of samples in the DFT, and the speed at which the samples are taken, define how many bins there will be, and how widely spaced they are. Bins outside the receiver range are simply ignored, while the central 16 bins (16 bins in MFSK16, because it has 16 tones) are used to provide data for the decoders.
Soft Decision Demodulator
The output of the DFT demodulator gives a measure of the power received in each bin, i.e. each receiver tone filter. It is the job of the Decision Decoder to work out which bin contains the energy of the current symbol, and therefore which bits of data were received. The simplest way is just to look at all the data and decide which one is biggest, and assign the answer to it.
Since the signal can be mistuned, and can also contain significant ionospheric distortion, signal energy tends to spill over into adjacent bins. This reduces the sensitivity of the system, and of course increases the possibility of error. A range of strategies is available to tackle these problems, and the performance has been improving since MFSK16 was first released, as computer power increases.
The demodulator output will contain a digital value representing the bits received, and an analog value representing their received strength or reliability. This information is valuable to the FEC decoder, and also to any signal strength meter. This is why we call it a 'soft decision' decoder - it not only decides the data received, but gives a measure of the reliability of the decision.
The first thing to do with the received data is to un-muddle it, using the De-Interleaver, which is really just a shift register and a data selector, working with the reverse algorithm used in the transmitter Interleaver. In recovering the correct bit-stream order, any bursts of errors become spread out, making the job of the FEC decoder easier.
The MFSK16 De-Interleaver is self-synchronising, because the receiver knows the incoming bit order, at least within each symbol, and it can exactly restore the correct order without outside help.
A Viterbi decoder is used. It is a soft decoder - in other words, it works with analog numbers, rather than binary bits. This adds a small but significant improvement to the performance. Utilising the analog numbers from the Soft Decision Decoder also adds a valuable performance improvement. In more recent MFSK16 implementations other tricks such as 'puncturing' (setting unreliable data to a null value) have been used for further improvement.
The output of the FEC decoder is a bit stream at half the input rate. The data is not perfect, especially if the received signal was very poor, but the number of errors is dramatically reduced. The data comes out of the FEC decoder in bursts, which is why the text appears on the screen a few characters at a time. If the length of the decoder is increased, the error reduction capabilities increase, but so also does the delay, and the output of the longer decoder decodes more characters at a time, but in slower bursts.
The final stage in the receiver is to decode the bitstream. The decoder uses a Varicode table and an algorithm that inspects the data stream looking for inter-character gaps (transmitted as "00" in Varicode, and always followed by the first "1" of the next character), and then decodes the groups of bits according to the table. The result is text which is printed on the screen. The Varicode is similar to that used by PSK31, but can be slightly more efficient due to different idle character requirements.
Symbol Phase Decoder
In parallel with the reception and decoding process, the receiver needs to recover the Symbol Clock, to ensure that the samples in the FFT decoder do represent only energy from one symbol at a time. In older systems like Piccolo and Coquelet, this clock was transmitted separately, in much the same way as the clock is transmitted in PSK31. We decided to get away from this with MFSK16, as it would allow non-linear transmitters to be used with no decrease in the signal quality. So, instead of amplitude information, all the receiver has to rely on is the actual data, and the phase of the symbols. There are several techniques that can be used.
Each individual receiver channel will contain occasional pulses of energy as a symbol is received, and the transition between one channel and another will not occur at the correct point in the symbol period if the receiver symbol clock is incorrect. It is possible to detect these transitions and thus work out the error in the Symbol Clock phase, and thereby correct it.
It is also possible to analyse the shape of the pulses (once they have passed through the ionosphere and the receiver they are no longer square in shape) and determine from the shape where the symbols are. This is done using a 'sliding FFT" technique, where several FFT solutions are made in the time of one symbol. If the sum of the energy in all receiver channels is analysed, the characteristic shape is found and can be used to synchronise the Symbol Clock.
The MFSK16 signal is a continuous phase (CPFSK) transmission, where every symbol starts and ends at the same phase. Using the phase information from the FFT detector, it is possible to discover the error in the Symbol Clock because only when the Symbol Clock phase is correct will the phases of all the FFT detector outputs coincide. If the phase is incorrect, the individual buckets will contain energy of only partial symbols, and the phase is different for each bucket as the frequency is increased. The direction of change of phase per bucket can be used to deduce which way the Clock phase is in error.
MFSK16 (2000) Technical Specification, M. Greenman, Rev 1.2 11 July 2000
The IZ8BLY MFSK Varicode, Nino Porcino IZ8BLY & M. Greenman ZL1BPU Ver 1.0, 10 July 2000
The MFSK FEC Coder, Nino Porcino IZ8BLY & M. Greenman ZL1BPU Ver 1.0, 11 July 2000
The IZ8BLY Diagonal Interleaver, Nino Porcino IZ8BLY, 07 July 2000
Ionospheric Simulator results for PSK31, QPSK31, PSK63F and MFSK16 compared., Johan KC7WW
Observations on Sound Card Audio Levels and MFSK16 Spurious Emissions, Jack K8ZOA.
Observations on MFSK16 Interference Performance, Jack K8ZOA.
A Practical Evaluation and Comparison of Some Modern Data Modes, Steve G4HPE (TAPR DCC 2004).