The Olivia transmission system is constructed of two layers: the lower, modulation and forward error correcting (FEC) code layer is a classical multiple frequency-shift keying (MFSK) while the higher layer is a forward error correcting code based on Walsh functions.
Both layers are of similar nature: they constitute a "1-out-of-N" FEC code. For the first layer the orthogonal functions are (co)sine functions, with 32 different frequencies (tones). At a given time only one of those 32 tones is being sent. The demodulator measures the amplitudes of all the 32 possible tones (using a Fourier transform ) and (knowing that only one of those 32 could have been sent) picks up the tone with the highest amplitude. See the equations and graphs behind the MFSK layer here
For the second FEC layer: every ASCII character is encoded as one of 64 possible Walsh functions (or vectors of a Hadamard matrix). The receiver again measures the amplitudes for all 64 vectors (here comes the Hadamard Transform) and chooses the greatest. See the algorithms and more details here
For optimal performance the actual demodulators work with soft decisions and the final (hard) decision to decode a character is taken only at the second layer. Thus the first layer demodulator actually produces soft decisions for each of the 5 bits associated to an MFSK tone instead of simply picking up the highest tone to produce hard decisions for those 5 bits.
In order to avoid simple transmitted patterns (like a constant tone) and to minimize the chance for a false lock at the synchronizer the characters encoded into the Walsh function pass through a scrambler and interleaver. This stage simply shifts and XORs bits with predefined scrambling vectors and so it does not improve the performance where the white (uncorrelated) noise is concerned, but the resulting pattern gains certain distinct characteristics which are of great help to the synchronizer.
The receiver synchronizes automatically by searching through possible time and frequency offsets for a matching pattern. The frequency search range is normally +/- 100 Hz but can be as high as +/- 500 Hz if the user wishes so.
The exact shape formula is:
where x ranges from – π to π.
The coefficients represent the symbol shape in the frequency domain and were calculated by a minimization procedure which sought to make the smallest crosstalk and the smallest frequency spillover.
This graph presents the 500 Hz MFSK tone (red trace) shaped according to the above formula. The blue trace is the envelope.
The tones are sent at 31.25 baud or every 32 milliseconds. The phase is not preserved from one tone to the next: instead a random shift of ±90 degrees is introduced in order not to transmit a pure tone when the same symbol is repeatedly sent. Because the symbols are smoothly shaped there is no need to keep the phase constant, which normally is the case when no (e.g. square) shaping is used.
The modulator uses the Gray code to encode 5-bit symbols into the tone numbers.
The waveform generator is based on the 8000 Hz sampling rate. The tones are spaced by 256 samples in time and the window that shapes them is 512 samples long. The demodulator is based on the FFT with the size of 512 points. The tone spacing in frequency is 8000 Hz/256 = 31.25 Hz and the demodulator FFT has the resolution of 8000 Hz/512 = 15.625 Hz thus half of the tone separation.
To adapt the system to different propagation conditions, the number of tones and the bandwidth can be changed and the time and frequency parameters are proportionally scaled. The number of tones can be 2, 4, 8, 16, 32, 64, 128 or 256. The bandwidth can be 125, 250, 500, 1000 or 2000 Hz.
The modulation layer of the Olivia transmission system sends at a time one out of 32 tones (the default mode). Each tone constitutes thus a symbol that carries 5 bits of information. For the FEC code, 64 symbols are taken to form a block. Within each block one bit out of every symbol is taken and it forms a 64-bit vector coded as a Walsh function. Every 64-bit vector represents a 7-bit ASCII character, thus each block represents 5 ASCII characters.
This way, if one symbol (tone) becomes corrupted by the noise, only one bit of every 64-bit vector becomes corrupt, thus the transmission errors are spread uniformly across the characters within a block.
The two layers (MFSK+Walsh function) of the FEC code can be treated as a two dimensional code: the first dimension is formed along the frequency axis by the MFSK itself while the second dimension is formed along the time axis by the Walsh functions. The two dimensional arrangement was made with the idea in mind to solve such arranged FEC code with an iterative algorithm, however, no such algorithm was established to date.
The scrambling and simple bit interleaving is applied to make the generated symbol patterns appear more random and with minimal self-correlation. This avoids false locks at the receiver.
Bit interleaving: The Walsh function for the first character in a block is constructed from the 1st bit of the 1st symbol, the 2nd bit of the 2nd symbol, and so on. The 2nd Walsh function is constructed from the 2nd bit of the 1st symbol, the 3rd bit of the 2nd symbol, and so on.
Scrambling: The Walsh functions are scrambled with a pseudo-random sequence 0xE257E6D0291574EC. The Walsh function for the 1st character in a block is scrambled with the scrambling sequence, the 2nd Walsh function is scrambled with the sequence rotated right by 13 bits, the 3rd with the sequence rotated by 26 bits, and so on.