Copyright 2001 by Barry Sanderson
Permission is hereby granted for the verbatim reproduction, or storage, of this document, including this copyright notice, and its accompanying images. All other rights are reserved.
This section is not yet written.
A linear block code having n symbols per codeblock, with k of these being information symbols, has (n-k) redundancy symbols per codeblock. Such a code is denoted a (n,k) code. If the minimum distance between codewords is as large as it can be, for such a code (n-k+1), then the code can correct up to (n-k)/2 errors per codeblock. A Reed-Solomon code has the largest minimum distance between codewords possible, and is therefore called a maximum-distance code.
Two Reed-Solomon codes are used in the examples that follow. The outer code is a (306,178) code, with 128 redundancy symbols per block. The inner code is a (8,4) code, with 4 redundancy symbols per block. Thus, the outer code is designed to correct up to 64 symbols per block (of 306 outer code symbols), and the inner code is designed to correct up to 2 symbols per block (of 8 inner code symbols).
Decoders exist for Reed-Solomon codes that take advantage of erasure information. When, externally to the decoder, the location of an erroneous symbol is determined, the decoder can determine the correct value of the symbol by "consuming" only one redundancy symbol. When the decoder must determine both the location and magnitude of a symbol in error, it "consumes" two redundancy symbols.
The inner code used here is small enough to permit exhustive searching through all possible codewords, for the different combinations of erased symbols, until a "close enough" match is found, or all of the possibilities worth trying have failed. The smallest number of erased symbols, leading to a successfuly decoded value, is then used to "erase" the most likely to be wrong codewords passed to the outer decoder.
In the following examples, inner code symbols requiring less than 3 erasures were not marked as "erased", when passed to the outer decoder. Those inner code symbols requiring 3 or 4 erased symbols were marked as "erased", when passed to the outer decoder.
Below is an explanation of the meaning of the various data fields used in the examples below.
The table headings for the following examples are:
Block inner | outer code | outer | inner code
# code | erasures | code | changes
changes|1st 2nd 3rd| changes | 0 1 2 3 4
---- ------ |--- --- ---| --- |--- --- --- --- ---
Below is a list of each of the above column headings, from left to right, and an explanation of what is meant by each column heading.
This is an index, starting with 0, used to internally number the outer code blocks.
This is a total of how many of the sub-carriers had their phase changed by the inner decoder, in its attempt to correct as many errors as it could.
An "erasure" means that an error has probably been detected, but not corrected. The sub-headings "1st, 2nd, and 3rd" show how three different categories of erasures, detected by the inner decoder, are to be used by the outer decoder.
All those in the "1st" column are to be used 1st, followed by those in the "2nd" column, followed by those in the "3rd" column. The erasures in the "1st" column result from the received combination of phases being too far away from all code words, even when 4 of the 8 sub-carriers are ignored.
This is a count of the number of symbols corrected by the outer decoder. A negative number means that the outer decoder recognized that it could NOT decode the block correctly.
The five sub-headings, "0, 1, 2, 3, and 4" indicate how many of the 8 sub-carriers were changed by the inner decoder. The numbers in the table are how many of the symbols (in each block) had the respective number of sub-carriers changed by the inner decoder.
Thus, the sub-heading "0" is for the case of error free symbols (0 of the 8 sub-carriers were changed by the inner decoder.)
Since each outer codeblock in the following examples has 128 redundancy symbols, numbers greater than 64 in the "outer code changes" column indicate blocks where more than 64 corrections were made by the outer decoder.
When the sum of the "inner code changes" under the "3" and "4" sub-headings is greater than the number of "outer code changes" then some of the inner codewords with more than 2 errased symbols were decoded correctly by the inner decoder, which is beyond the designed decoding distance of the inner code.
The following examples were taken from tests conducted in April, 2001, where: VK3LM, VK3CQE, and VK4CS were transmitting, from Austrailia, to: W8ZCF, KB4YZ, and W9NTP in the United States. The transmissions were via single sideband in the 20 meter band. Each transmission used differential phase modulation and two levels of Reed-Solomon coding to convey the representation of a digital file. Each digital file was actually a test image file. All errors were corrected in each of the examples below.
Note block number 2 in the next example.
For data file: vk3lm03-pm7b.wav
using Hamming window and /tmp/pm7b-demod-decode5t program
Block inner | outer code | outer | inner code
# code | erasures | code | changes
changes|1st 2nd 3rd | changes | 0 1 2 3 4
---- ------ |--- --- --- | --- | --- --- --- --- ---
0 415 13h 5s 15t 26 || 80 88 105 15 18 +
1 456 4h 3s 20t 22 || 52 86 141 20 7 +
2 691 36h 27s 42t 89 || 12 65 124 42 63 +
3 544 21h 18s 19t 41 || 45 75 128 19 39 +
4 446 4h 4s 19t 26 || 63 75 141 19 8 +
5 403 2h 3s 14t 18 || 74 85 128 14 5 +
6 428 3h 3s 23t 18 || 66 87 124 23 6 +
7 427 1h 3s 13t 14 || 60 86 143 13 4 +
8 374 0h 1s 12t 15 || 87 78 128 12 1 +
9 290 1h 2s 6t 11 || 126 82 89 6 3 +
10 267 1h 3s 7t 8 || 137 86 72 7 4 +
Note block numbers: 5, 6, 7, and 8 in the next example.
For data file: vk3lm15ap6-pm7b.wav
using Hamming window and /tmp/pm7b-demod-decode5s program
Block inner | outer code | outer | inner code
# code | erasures | code | changes
changes|1st 2nd 3rd | changes | 0 1 2 3 4
---- ------ |--- --- --- | --- | --- --- --- --- ---
0 484 1h 3s 23t 24 || 43 73 163 23 4 +
1 335 2h 1s 14t 19 || 113 71 105 14 3 +
2 294 0h 0s 7t 3 || 122 81 96 7 0 +
3 601 11h 16s 43t 51 || 22 64 150 43 27 +
4 566 8h 11s 29t 35 || 26 61 171 29 19 +
5 678 11h 23s 54t 66 || 14 28 176 54 34 +
6 639 16h 20s 56t 69 || 30 41 143 56 36 +
7 699 14h 33s 58t 83 || 15 35 151 58 47 +
8 703 10h 32s 65t 71 || 11 36 152 65 42 +
9 568 4h 8s 47t 43 || 33 49 165 47 12 +
10 413 6h 6s 10t 21 || 74 85 125 10 12 +
Note block number 0 in the next example.
For data file: 3CQ0-pm7b.wav
using Hamming window and /tmp/pm7b-demod-decode5tl program
Block inner | outer code | outer | inner code
# code | erasures | code | changes
changes|1st 2nd 3rd | changes | 0 1 2 3 4
---- ------ |--- --- --- | --- | --- --- --- --- ---
0 693 22h 29s 49t 83 || 16 38 152 49 51 +
1 452 5h 5s 18t 25 || 51 96 131 18 10 +
2 368 1h 1s 15t 19 || 86 91 112 15 2 +
3 581 8h 13s 39t 47 || 22 68 156 39 21 +
4 566 4h 12s 20t 34 || 18 62 190 20 16 +
5 471 1h 2s 22t 14 || 41 87 153 22 3 +
6 341 0h 0s 17t 14 || 103 82 104 17 0 +
7 571 16h 13s 51t 52 || 50 50 126 51 29 +
8 586 10h 13s 40t 45 || 23 66 154 40 23 +
9 613 7h 13s 52t 53 || 20 51 163 52 20 +
10 341 5h 2s 12t 15 || 112 73 102 12 7 +
Note block numbers: 2, 3, 4, 5, 7, 8, and 9 in the next example.
For data file: vk3lm300w3ap10-pm7b.wav
using Hamming window and /tmp/pm7b-demod-decode5s program
Block inner | outer code | outer | inner code
# code | erasures | code | changes
changes|1st 2nd 3rd | changes | 0 1 2 3 4
---- ------ |--- --- --- | --- | --- --- --- --- ---
0 553 21h 12s 20t 45 || 38 69 146 20 33 +
1 635 26h 15s 28t 56 || 16 55 166 28 41 +
2 707 45h 23s 47t 86 || 24 40 127 47 68 +
3 653 27h 24s 39t 72 || 24 52 140 39 51 +
4 601 12h 10s 45t 71 || 19 62 158 45 22 +
5 691 25h 22s 43t 78 || 14 30 172 43 47 +
6 625 24h 22s 30t 56 || 27 55 148 30 46 +
7 665 27h 14s 39t 69 || 12 44 170 39 41 +
8 662 34h 13s 39t 72 || 17 49 154 39 47 +
9 640 35h 12s 27t 66 || 18 57 157 27 47 +
10 512 20h 11s 15t 37 || 48 81 131 15 31 +
Note block numbers: 3, 7, and 9 in the next example.
For data file: VK4CS8-pm7b.wav
using Hamming window and /tmp/pm7b-demod-decode5tn program
Block inner | outer code | outer | inner code
# code | erasures | code | changes
changes|1st 2nd 3rd | changes | 0 1 2 3 4
---- ------ |--- --- --- | --- | --- --- --- --- ---
0 680 7h 17s 55t 55 || 2 31 194 55 24 +
1 685 13h 19s 44t 55 || 3 29 198 44 32 +
2 652 7h 16s 42t 48 || 7 34 200 42 23 +
3 709 17h 24s 48t 66 || 2 29 186 48 41 +
4 684 10h 18s 49t 64 || 2 29 198 49 28 +
5 664 9h 3s 57t 42 || 3 23 211 57 12 +
6 708 18h 21s 43t 57 || 1 23 200 43 39 +
7 721 12h 31s 50t 74 || 7 13 193 50 43 +
8 678 4h 18s 53t 59 || 4 23 204 53 22 +
9 715 14h 23s 54t 72 || 5 15 195 54 37 +
10 667 4h 22s 41t 34 || 2 34 203 41 26 +