The IZ8BLY MFSK Varicode

2000 Nino Porcino IZ8BLY & M. Greenman ZL1BPU

Ver 1.0, 10 July 2000


The MFSK varicode is designed for a quite different application from the familiar code designed by G3PLX for PSK31. Because of the different way in which the idle condition is signalled, this code is able to utilise sequences of bits containing more than two consecutive zeros.

The table also has a different probability distribution of characters. This is to reflect a better live QSO distribution of characters.

Precedence has been given to lower case symbols, then uppercase and numbers. The most used special characters are SPACE, BACKSPACE and CR. To further improve optimisation, extended ASCII characters for foreign languages have been moved so they have smaller codes than in the G3PLX alphabet.

There are approximately 100 unassigned 12 bit codes, so 13 bit codes will probably never be needed. The table below does not include control codes outside the ASCII table.

This is the logic sequence Nino used:

  1. Lowercase
  2. Uppercase and numbers
  3. Ascii symbols
  4. Extended ASCII (160-255)
  5. ASCII control codes (0-31)
  6. Other characters (128-159)
  7. Super-alphabet control characters (not part of ASCII or extended ASCII)

The super-alphabet characters are not part of the MFSK 2000 Specification, except that they will be ignored when received by the specified receiver.

Performance

A simple test using UPPERCASE characters (the worst case), achieved a 13% improvement in speed, compared with a test version using the G3PLX varicode. A more extended test using a standard text file (mostly lower case, with a typical distribution of upper case and numbers (but few control codes apart from SPACE and CR) demonstrated almost 20% speed improvement with the new code. The test file can be supplied on request.

MFSK16F, which runs at 15.625 baud, with 16 tones, has a channel bit rate of 62.5 bps. The FEC coder reduces the text bit rate to 31.25 bps. The text throughput with this varicode has been measured at over 42 WPM. The text throughput of PSK31 (which interestingly has EXACTLY the same text bit rate) is about 34 WPM.

The Table

Here follows the Varicode Table, (cut directly from the source code) in order of assessed character frequency. The numbers in square brackets are the ASCII value in decimal, the following binary number is the varicode, MSB first, and includes the following "00" which is the end of character framing symbol. In other words to send the characters "e t", the bits "10001001100" are sent. The final entry on the line is the character (if printable) or the control code name if not printable.

    Table[   32]="100";       //  <SPACE>
    Table[  101]="1000";       // e
    Table[  116]="1100";       // t
    Table[  111]="10000";       // o
    Table[   97]="10100";       // a
    Table[  105]="11000";       // i
    Table[  110]="11100";       // n
    Table[  114]="100000";       // r
    Table[  115]="101000";       // s
    Table[  108]="101100";       // l
    Table[  104]="110000";       // h
    Table[  100]="110100";       // d
    Table[   99]="111000";       // c
    Table[  117]="111100";       // u
    Table[  109]="1000000";       // m
    Table[  102]="1010000";       // f
    Table[  112]="1010100";       // p
    Table[  103]="1011000";       // g
    Table[  121]="1011100";       // y
    Table[   98]="1100000";       // b
    Table[  119]="1101000";       // w
    Table[  118]="1101100";       // v
    Table[  107]="1110000";       // k
    Table[  120]="1110100";       // x
    Table[  113]="1111000";       // q
    Table[  122]="1111100";       // z
    Table[  106]="10000000";       // j
    Table[   44]="10100000";       // ,
    Table[    8]="10101000";       // <BS>
    Table[   13]="10101100";       // <CR>
    Table[   84]="10110000";       // T
    Table[   83]="10110100";       // S
    Table[   69]="10111000";       // E
    Table[   65]="10111100";       // A
    Table[   73]="11000000";       // I
    Table[   79]="11010000";       // O
    Table[   67]="11010100";       // C
    Table[   82]="11011000";       // R
    Table[   68]="11011100";       // D
    Table[   48]="11100000";       // 0
    Table[   77]="11101000";       // M
    Table[   80]="11101100";       // P
    Table[   49]="11110000";       // 1
    Table[   76]="11110100";       // L
    Table[   70]="11111000";       // F
    Table[   78]="11111100";       // N
    Table[   66]="100000000";       // B
    Table[   50]="101000000";       // 2
    Table[   71]="101010000";       // G
    Table[   51]="101010100";       // 3
    Table[   72]="101011000";       // H
    Table[   85]="101011100";       // U
    Table[   53]="101100000";       // 5
    Table[   87]="101101000";       // W
    Table[   54]="101101100";       // 6
    Table[   88]="101110000";       // X
    Table[   52]="101110100";       // 4
    Table[   89]="101111000";       // Y
    Table[   75]="101111100";       // K
    Table[   56]="110000000";       // 8
    Table[   55]="110100000";       // 7
    Table[   86]="110101000";       // V
    Table[   57]="110101100";       // 9
    Table[   81]="110110000";       // Q
    Table[   74]="110110100";       // J
    Table[   90]="110111000";       // Z
    Table[   39]="110111100";       // '
    Table[   33]="111000000";       // !
    Table[   63]="111010000";       // ?
    Table[   46]="111010100";       // .
    Table[   45]="111011000";       // -
    Table[   61]="111011100";       // =
    Table[   43]="111100000";       // +
    Table[   47]="111101000";       // /
    Table[   58]="111101100";       // :
    Table[   41]="111110000";       // )
    Table[   40]="111110100";       // (
    Table[   59]="111111000";       // ;
    Table[   34]="111111100";       // "
    Table[   38]="1000000000";       // &
    Table[   64]="1010000000";       // @
    Table[   37]="1010100000";       // %
    Table[   36]="1010101000";       // $
    Table[   96]="1010101100";       // `
    Table[   95]="1010110000";       // _
    Table[   42]="1010110100";       // *
    Table[  124]="1010111000";       // |
    Table[   62]="1010111100";       // >
    Table[   60]="1011000000";       // <
    Table[   92]="1011010000";       // \ 
    Table[   94]="1011010100";       // ^
    Table[   35]="1011011000";       // #
    Table[  123]="1011011100";       // {
    Table[  125]="1011100000";       // }
    Table[   91]="1011101000";       // [
    Table[   93]="1011101100";       // ]
    Table[  126]="1011110000";       // ~
    Table[  160]="1011110100";       //  
    Table[  161]="1011111000";       // 
    Table[  162]="1011111100";       // 
    Table[  163]="1100000000";       // 
    Table[  164]="1101000000";       // 
    Table[  165]="1101010000";       // 
    Table[  166]="1101010100";       // 
    Table[  167]="1101011000";       // 
    Table[  168]="1101011100";       // 
    Table[  169]="1101100000";       // 
    Table[  170]="1101101000";       // 
    Table[  171]="1101101100";       // 
    Table[  172]="1101110000";       // 
    Table[  173]="1101110100";       // 
    Table[  174]="1101111000";       // 
    Table[  175]="1101111100";       // 
    Table[  176]="1110000000";       // 
    Table[  177]="1110100000";       // 
    Table[  178]="1110101000";       // 
    Table[  179]="1110101100";       // 
    Table[  180]="1110110000";       // 
    Table[  181]="1110110100";       // 
    Table[  182]="1110111000";       // 
    Table[  183]="1110111100";       // 
    Table[  184]="1111000000";       // 
    Table[  185]="1111010000";       // 
    Table[  186]="1111010100";       // 
    Table[  187]="1111011000";       // 
    Table[  188]="1111011100";       // 
    Table[  189]="1111100000";       // 
    Table[  190]="1111101000";       // 
    Table[  191]="1111101100";       // 
    Table[  192]="1111110000";       // 
    Table[  193]="1111110100";       // 
    Table[  194]="1111111000";       // 
    Table[  195]="1111111100";       // 
    Table[  196]="10000000000";       // 
    Table[  197]="10100000000";       // 
    Table[  198]="10101000000";       // 
    Table[  199]="10101010000";       // 
    Table[  200]="10101010100";       // 
    Table[  201]="10101011000";       // 
    Table[  202]="10101011100";       // 
    Table[  203]="10101100000";       // 
    Table[  204]="10101101000";       // 
    Table[  205]="10101101100";       // 
    Table[  206]="10101110000";       // 
    Table[  207]="10101110100";       // 
    Table[  208]="10101111000";       // 
    Table[  209]="10101111100";       // 
    Table[  210]="10110000000";       // 
    Table[  211]="10110100000";       // 
    Table[  212]="10110101000";       // 
    Table[  213]="10110101100";       // 
    Table[  214]="10110110000";       // 
    Table[  215]="10110110100";       // 
    Table[  216]="10110111000";       // 
    Table[  217]="10110111100";       // 
    Table[  218]="10111000000";       // 
    Table[  219]="10111010000";       // 
    Table[  220]="10111010100";       // 
    Table[  221]="10111011000";       // 
    Table[  222]="10111011100";       // 
    Table[  223]="10111100000";       // 
    Table[  224]="10111101000";       // 
    Table[  225]="10111101100";       // 
    Table[  226]="10111110000";       // 
    Table[  227]="10111110100";       // 
    Table[  228]="10111111000";       // 
    Table[  229]="10111111100";       // 
    Table[  230]="11000000000";       // 
    Table[  231]="11010000000";       // 
    Table[  232]="11010100000";       // 
    Table[  233]="11010101000";       // 
    Table[  234]="11010101100";       // 
    Table[  235]="11010110000";       // 
    Table[  236]="11010110100";       // 
    Table[  237]="11010111000";       // 
    Table[  238]="11010111100";       // 
    Table[  239]="11011000000";       // 
    Table[  240]="11011010000";       // 
    Table[  241]="11011010100";       // 
    Table[  242]="11011011000";       // 
    Table[  243]="11011011100";       // 
    Table[  244]="11011100000";       // 
    Table[  245]="11011101000";       // 
    Table[  246]="11011101100";       // 
    Table[  247]="11011110000";       // 
    Table[  248]="11011110100";       // 
    Table[  249]="11011111000";       // 
    Table[  250]="11011111100";       // 
    Table[  251]="11100000000";       // 
    Table[  252]="11101000000";       // n
    Table[  253]="11101010000";       // 
    Table[  254]="11101010100";       // 
    Table[  255]="11101011000";       // 
    Table[    0]="11101011100";       // <NUL>
    Table[    1]="11101100000";       // <SOH>
    Table[    2]="11101101000";       // <STX>
    Table[    3]="11101101100";       // <ETX>
    Table[    4]="11101110000";       // <EOT>
    Table[    5]="11101110100";       // <ENQ>
    Table[    6]="11101111000";       // <ACK>
    Table[    7]="11101111100";       // <BEL>
    Table[    9]="11110000000";       // <TAB>
    Table[   10]="11110100000";       // <LF>
    Table[   11]="11110101000";       // <VT>
    Table[   12]="11110101100";       // <FF>
    Table[   14]="11110110000";       // <SO>
    Table[   15]="11110110100";       // <SI>
    Table[   16]="11110111000";       // <DLE>
    Table[   17]="11110111100";       // <DC1>
    Table[   18]="11111000000";       // <DC2>
    Table[   19]="11111010000";       // <DC3>
    Table[   20]="11111010100";       // <DC4>
    Table[   21]="11111011000";       // <NAK>
    Table[   22]="11111011100";       // <SYN>
    Table[   23]="11111100000";       // <ETB>
    Table[   24]="11111101000";       // <CAN>
    Table[   25]="11111101100";       // <EM>
    Table[   26]="11111110000";       // <SUB>
    Table[   27]="11111110100";       // <ESC>
    Table[   28]="11111111000";       // <FS>
    Table[   29]="11111111100";       // <GS>
    Table[   30]="100000000000";       // <RS>
    Table[   31]="101000000000";       // <US>
    Table[  127]="101010000000";       // <DEL>
    Table[  128]="101010100000";       // ?
    Table[  129]="101010101000";       // 
    Table[  130]="101010101100";       // 
    Table[  131]="101010110000";       // 
    Table[  132]="101010110100";       // 
    Table[  133]="101010111000";       // 
    Table[  134]="101010111100";       // 
    Table[  135]="101011000000";       // 
    Table[  136]="101011010000";       // 
    Table[  137]="101011010100";       // 
    Table[  138]="101011011000";       // 
    Table[  139]="101011011100";       // 
    Table[  140]="101011100000";       // 
    Table[  141]="101011101000";       // 
    Table[  142]="101011101100";       // Z
    Table[  143]="101011110000";       // 
    Table[  144]="101011110100";       // 
    Table[  145]="101011111000";       // 
    Table[  146]="101011111100";       // 
    Table[  147]="101100000000";       // 
    Table[  148]="101101000000";       // 
    Table[  149]="101101010000";       // 
    Table[  150]="101101010100";       // 
    Table[  151]="101101011000";       // 
    Table[  152]="101101011100";       // 
    Table[  153]="101101100000";       // 
    Table[  154]="101101101000";       // 
    Table[  155]="101101101100";       // 
    Table[  156]="101101110000";       // 
    Table[  157]="101101110100";       // 
    Table[  158]="101101111000";       // z
    Table[  159]="101101111100";       //