ERROR CORRECTION SYSTEM USING THE DISCRETE FOURIER TRANSFORM

Information

  • Patent Application
  • 20090249162
  • Publication Number
    20090249162
  • Date Filed
    March 28, 2008
    16 years ago
  • Date Published
    October 01, 2009
    15 years ago
Abstract
A system of determining unknown symbols of an error correcting code using the Discrete Fourier Transform (DFT) with arithmetic corresponding to the number field of the error correcting code, including complex numbers. Encoder and decoder configurations are described. Parallel generation of independent parity check equations, simultaneous solution of unknown symbols generating, or regenerating a codeword of the error correcting code.
Description
FIELD OF THE INVENTION

The field of the invention is that of applications using error correction coding.


BACKGROUND TO THE INVENTION

This invention relates to the encoding and decoding of codewords of error correcting codes which are subject to erasures or errors and provides a means of efficiently encoding codewords, or efficiently determining unknown symbols of a codeword, or determining candidate sets of unknown symbols of a codeword as a step in error correction decoding. It also provides a means of encoding and decoding error correcting codes that use codewords with complex number coefficients. That is, the invention also provides a means of encoding and decoding analog error correcting codes.


BRIEF SUMMARY OF THE INVENTION

The invention is concerned with providing an efficient system of encoding codewords of an error correcting code or decoding codewords of an error correcting code by determining unknown symbols of a codeword. The error correcting code may use symbols with values from a Galois field [1, 2] in the traditional manner or the error correcting code may use symbols with values from the field of complex numbers. In either case the invention provides a means of encoding or decoding codewords from the error correcting code in an efficient manner. Applications include communication, storage or information systems that use a channel or medium characterised by erasures [3, 7, 8, 9] or the deletion of symbols. Error correction systems require the determination of unknown symbols of each codeword in carrying out encoding and decoding and the invention provides an efficient means of encoding and decoding.


Unknown symbols of a codeword of an error correcting code may arise from the action of a channel or may arise from the decoder postulating that some symbols should be declared unknown due to their unreliability. Such decoders feature correction of unknown symbols as a step in the decoding procedure [4, 5, 6]. Standard error correction systems use an error correcting code characterised by parameters n, the length of the code in symbols, k the number of information symbols and d the Hamming distance [1, 2]. Standard methods can determine d−1 unknown symbols by using procedures that have a complexity proportional to n3. One such method is the method originated by Gauss for solving n−k linear equations. As a result of the cubic dependancy with codeword length, standard methods of determining unknown symbols are not practical for long codewords. The invention provides a means of determining the unknown symbols of a codeword with a complexity proportional to (d−2)×n and is therefore much more efficient. Moreover codewords having complex number coefficients may be encoded or decoded by the invention.





BRIEF SUMMARY OF THE DRAWINGS


FIG. 1 shows a block diagram of a communication system, storage system or information system using an error correcting code. Data is encoded into codewords of the error correcting code by the encoder prior to transmission over the communication channel, or storage using a data storage medium, or for access by an information system. After trans-mission over the communication system, or data retrieval from the data storage medium, or information system, unknown symbols from each codeword are determined by the decoder.



FIG. 2 shows the encoder for the error correcting code and features for each input vector containing k information symbols, buffering of the input vector, calculation of a parity check equation, using this equation to calculate a parity symbol, and updating of the input vector followed by calculation of a different parity check equation and using this equation to calculate a different parity symbol, and updating of the input vector. The procedure repeating until all parity symbols have been determined and the resulting updated input vector is a codeword of the error correcting code. By using the list of the parity symbols, the controller produces the correct sequence of operations as outlined above to produce an encoded codeword.



FIG. 3 shows the decoder for the error correcting code and features for each input vector, buffering of the input vector, repeated calculation of parity check equations followed by calculation of unknown symbols, and repeated updating of the input vector until all unknown symbols have been determined. With the last updating of the input vector, the input vector becomes the original codeword of the error correcting code, unless the error correcting capability of the code has been exceeded. By using the list of the unknown symbols contained in each input vector, a controller produces the correct sequence of operations necessary to determine the unknown symbols and controls the production of a codeword of the error correcting code from the input vector.





DETAILED DESCRIPTION OF THE DRAWINGS


FIG. 1 shows a generic block diagram of a communication system, storage system or information system using an error correcting code. An error correcting code is commonly described as having codewords of length n symbols comprising k information symbols and n−k parity symbols [1, 2]. The invention provides a means of encoding and decoding and also provides flexibility and efficiency. As well as error correcting codes with codeword coefficients from a Galois Field, error correcting codes with codeword coefficients from the field of complex numbers may be encoded or decoded using the invention. As shown in FIG. 1 input data is encoded into codewords of an error correcting code by the encoder prior to transmission over the communication channel, or storage using a data storage medium or for use in an information system. After transmission over the communication system or data retrieval from the data storage medium, or retrieval from an information system, erased, deleted or otherwise unknown symbols are determined by the decoder.


In FIG. 1 the encoder generates n−k parity check symbols from k information symbols. FIG. 2 is a detailed diagram of the encoder which generates any set of n−k parity symbols from k known symbols. Since the set of n−k parity check symbols is included in the class of sets of any n−k unknown symbols it is clear that the encoder is a special case of the decoder, shown in FIG. 3, which determines all of the unknown symbols from any set of n−k unknown symbols, given k known symbols.


The minimum Hamming distance between codewords d is equal to n−k+1 and is the reason why the code is capable of regenerating any set of n−k symbols [1, 2]. Each symbol of the code takes values from a field [1]. Error correcting codes are based on a Galois Field having q elements, denoted as GF(q), but the invention may be used with any field including the field of complex numbers. For any Galois Field there is a well known [1] class of codes known as Bose and Ray-Chaudhuri Hocquenghem (BCH) codes. For any other field the corresponding codes are referred to here as analog Bose and Ray-Chaudhuri Hocquenghem (BCH) codes.


For Galois Fields, BCH codes are defined by a generator polynomial g(x) given by










g


(
x
)


=




i
=
β


β
+
n
-
k
-
1




(

x
-

α
i


)






(
1
)







where α is a primitive root of GF(q), or equivalently, a primitive root of unity, and β is a code parameter, an integer between 0 and n−1.


For other fields, analog BCH codes are defined by a generator polynomial g(x) given by










g


(
x
)


=




i
=
β


β
+
n
-
k
-
1




(

x
-

α
i


)






(
2
)







where α is a primitive root of unity, and β is a code parameter, an integer between 0 and n−1.


In either case, codewords, c(x) are given by g(x).d(t) where d(t) is a polynomial of degree less than k having coefficients equal to the information symbols. For every generator polynomial there is a parity check polynomial, h(x) such that g(x).h(x)=xn−1, and g(x).h(x)=0 modulo xn−1.


The efficient realisation of an encoder and decoder for BCH error correcting codes or analog BCH error correcting codes is the subject of this invention. The encoder is shown in FIG. 2 and the decoder is shown in FIG. 3. The theoretical basis for the invention lies with properties of the discrete Fourier transform. The discrete Fourier Transform using arithmetic from a Galois Field is known as the Mattson-Solomon polynomial and is documented for example in the text-book by MacWilliams and N. J. A. Sloane [1].


From the parity check polynomial h(x) it follows that c(x).h(x)=γ(x)=0 modulo xn−1.





γ(x)=γ01x+γ2x23x3 . . . +γn−1xn−1=0  (3)


and so each coefficient γi=0 for i=0 to n−1 producing n linear, parity check equations. The n linear equations are not all independent but they do allow for any n−k unknown coefficients of c(x) to be solved. In other words any combination of n−k symbols may be erased from a codeword and the erasures may be determined by solving n−k linear equations.


Galois fields and BCH codes are considered first. For any polynomial, f(x) of degree less that n and with coefficients which are elements of GF(q) the Mattson-Solomon polynomial F(z) is given by










F


(
z
)


=




i
=
0


n
-
1





f


(

α

-
i


)




z
i







(
4
)







The original polynomial f(x) may be obtained from its Mattson-Solomon polynomial via the inverse Mattson-Solomon polynomial










f


(
x
)


=


n

-
1







i
=
0


n
-
1





F


(

α
i

)




x
i








(
5
)







The factor n−1 is the multiplicative inverse of n in GF(q). For q=2m, n−1=1


Any codeword c(x) has a Mattson-Solomon polynomial C(z). The parity check polynomial h(x) has a Mattson-Solomon polynomial H(z). Just as c(x)h(x)=0 modulo xn−1; in the Mattson-Solomon domain C(z){circle around (·)}H(z)=0 where {circle around (·)} represents a multiplication of the coefficients corresponding to the same powers of z.











C


(
z
)




H


(
z
)



=





i
=
0


n
-
1





C
i



H
i



z
i



=
0





(
6
)







For each non zero coefficient of C(z) the corresponding coefficient of H(z) is zero and vice versa.


The BCH code provides the basis which can be used to solve for n−k unknown symbols. Let the positions of the unknown symbols be defined by λi where =0 to n−k−1 and let the codeword containing the unknown symbols be denoted as ĉ(x) with coefficients arbitrarily set in the unknown symbol positions. There is a polynomial mλj(x) that when multiplied by the parity check polynomial h(x) produces a polynomial which is denoted as sλj(x) and has the property that the coefficients of xn−λi=0 for i=0 to n−k−2, i≠j. Since c(x).h(x)=0, it follows that ĉ(x).mλj(x).h(x)=0 as well.


Substituting





ĉ(x).mλj(x).h(x)=ĉ(x)sλj(x)=0  (7)


The polynomial ĉ(x) has coefficients equal to the coefficients of the codeword c(x) except in the unknown symbol positions. The x0 coefficient given by equation (7) is given by













c
^


λ
j


·

s


λ
j



(

n
-

λ
j


)




+





i
=
0

,

i


λ
j




n
-
1






c
^

i

·

s


λ
j



(

n
-
i

)






=
0




(
8
)







Since none of the unknown coefficients of ĉ(x) feature in equation (8), this equation may be used to solve for the unknown symbol in position λj,











c
^


λ
j


=


-

s


λ
j



(

n
-

λ
j


)



-
1









i
=
0

,

i


λ
j




n
-
1






c
^

i

·

s


λ
j



(

n
-
i

)










(
9
)







The polynomial sλj(x) is derived using the inverse Mattson-Solomon polynomial. Since the error correcting code is a BCH code, the coefficients of C(z) are zero for consecutive powers of z from β through to β+n−k−1, where β is a code parameter, an integer constant between 0 and n−1. For i greater than zero, the polynomial ui(x) is used to denote the inverse Mattson-Solomon polynomial of z−αn−λi. For the case i=0, u0(x) is the inverse Mattson-Solomon polynomial of zβ. In general, for i>0











u
i



(
x
)


=


n

-
1







m
=
0


n
-
1





(


α
m

-

α

n
-

λ
i




)



x
m








(
10
)







The important point is that the coefficient of xn−λi of ui(x) is equal to zero and ui(x) is a parity check polynomial of c(x).


Correspondingly,






c(x)ui(x)=0  (11)


If the coefficient of xλi of c(x) is unknown due to there being an unknown symbol in position λi of the codeword, this will not affect the evaluation of the coefficient of x0 in equation (11). A practical point is that as c(x)ui(x)=0, ui(x) may be multiplied by any non zero field element, such as n and so the term n−1 may be ignored in equation (10) leading to the simplification for ui(x):











u
i



(
x
)


=




m
=
0


n
-
1





(


α
m

-

α

n
-

λ
i




)



x
m







(
12
)







For the solution of the unknown symbol in position λn−k−1 the polynomial sλn−k−1(x) is given by






s
λ

n−k−1
(x)=u0(x){circle around (·)}u1(x){circle around (·)}u2(x) . . . {circle around (·)}un−k−2(x)  (13)


The coefficient ĉλn−k−1 is determined using equation (9).


For the general case, in order to obtain the solution of the unknown symbol in position λj the polynomial sλj(x) is given by











s

λ
j




(
x
)


=





i
=
0

,

i

j



n
-
k
-
1





u
i



(
x
)







(
14
)







and the coefficient ĉλj is determined using equation (9).


Fields other than Galois Fields and analog BCH codes are now considered. For any polynomial, f(x) of degree less that n and with coefficients which are elements of a field with










f


(
x
)


=




i
=
0


n
-
1





f
i



x
i







(
15
)







the discrete Fourier Transform of f(x) is given by










F
k

=




i
=
0


n
-
1





f
i



α

-
ik








(
16
)







where α is a primitive root of unity. For the field of complex numbers







α
=




j





2

π

n



,




where j=√{square root over (−1)}, and










F
k

=




i
=
0


n
-
1





f
i





-


j





2

π





i





k

n









(
17
)







This equation may be simplified by noticing that substituting








-


j





2

π

n






for the variable y in the polynomial f(y)










F
k

=

f
(



-


j2π





k

n



)





(
18
)







Furthermore by defining a polynomial










F


(
z
)







k
=
0


n
-
1





F
k



z
k















then










F


(
z
)


=




k
=
0


n
-
1





f
(



-


j





2

π





k

n



)



z
k







(
19
)







Replacing









j





2

π

n





with α, equation (19) becomes










F


(
z
)


=




k
=
0


n
-
1





f


(

α

-
k


)




z
k







(
20
)







It will be seen that this is the same as the Mattson-Solomon polynomial given by equation (4).


Similarly the polynomial, f(x) of degree less that n and with coefficients which are elements of a field may be obtained from the inverse discrete Fourier Transform of the Fourier coefficients Fk and is given by










f
i

=


1
n






k
=
0


n
-
1





F
k



(

α







k


)








(
21
)







where α is a primitive root of unity. It may be seen that










f


(
x
)


=


1
n






i
=
0


n
-
1





F


(

α
i

)




x
i








(
22
)







and that this is the same as the inverse Mattson-Solomon polynomial given by equation (5).


Accordingly any codeword c(x) from an analog BCH code with coefficients from any field has Fourier coefficients given by a polynomial C(z) using equation (19). The parity check polynomial h(x) has Fourier coefficients given by a polynomial H(z). Just as c(x)h(x)=0 modulo xn−1; in the Fourier domain C(z){circle around (·)}H(z)=0 where {circle around (·)} represents a multiplication of the coefficients corresponding to the same powers of z.











C


(
z
)




H


(
z
)



=





i
=
0


n
-
1





C
i



H
i



z
i



=
0





(
23
)







For each non zero coefficient of C(z) the corresponding coefficient of H(z) is zero and vice versa.


Given k coefficients of a codeword c(x) from an analog BCH code, and these coefficients may be in any k positions, the n−k parity check coefficients are determined by n−k parity check equations given by the inverse Fourier transform. As for BCH codes, for i greater than zero, the polynomial ui(x) is used to denote the inverse Fourier transform of Fourier coefficients given by the polynomial F(z)=z−αn−λi. For the case i=0, u0(x) is the inverse Fourier transform of zβ, where β is an integer constant between 0 and n−1 and is defined by the error correcting code. In general, for i>0











u
i



(
x
)


=


n

-
1







m
=
0


n
-
1





(


α
m

-

α

n
-

λ
i




)



x
m








(
24
)







For the field of complex numbers











u
i



(
x
)


=


n

-
1







m
=
0


n
-
1





(





j





2

π





m

n


-




j2π


(

n
-

λ
i


)


n



)



x
m








(
25
)







The important point is that the coefficient of xn−λi of ui(x) is equal to zero and ui(x) is a parity check polynomial of the codeword c(x).


As before, to determine the solution of the unknown symbol in position, say, λn−k−1 the parity check polynomial sλn−k−1(x) is given by






s
λ

n−k−1
(x)=u0(x){circle around (·)}u1(x){circle around (·)}u2(x) . . . {circle around (·)}un−k−2(x)  (26)


and the coefficient ĉλn−k−1 is determined using equation (9) using arithmetic from the field in question. For the general case, since sλj(x)c(x)=0, the parity check polynomial sλj(x) may be multiplied by any non zero field element. Consequently in practice, it is convenient to multiply ui(x) by the factor n to eliminate the term n−1 in equations (24) and (25).


In the encoder shown in FIG. 2, which may be used for all types of fields, β=0 and u0(x) is the all 1's vector. The list of positions of the parity check symbols are stored and used by the Controller to direct Select A to select which of the ui(x) vectors will be stored in the Registers prior to being multiplied together to derive sλj(x). From a practical viewpoint it is convenient to initialise the input vector with zeros in the positions of the parity check symbols so that














i
=
0

,

i


λ
j




n
-
1






c
^

i

·

s


λ
j



(

n
-
i

)





=




i
=
0


n
-
1






c
^

i

·

s


λ
j



(

n
-
i

)









(
27
)







and now the coefficient ĉλj is determined using the equation











c
^


λ
j


=


-

s


λ
j



(

n
-

λ
j


)



-
1








i
=
0


n
-
1






c
^

i

·

s


λ
j



(

n
-
i

)










(
28
)







With this initialisation the derived parity check equation sλj(x) may be used directly to determine the unknown symbol as shown in FIG. 2 so that the output of Multiply and Sum is equal to the result of equation (27). Under direction of the Controller, Select B selects the coefficient of sλj(x), sλj(n−λj) which is multiplied by −1 and inverted, as shown in FIG. 2, and multiplied by the output of Multiply and Sum to produce the solution for the unknown symbol in position λj, ĉλj. The codeword stored in Input Vector is updated with this calculated coefficient using Update as shown in FIG. 2.


For the encoder shown in FIG. 2, the calculation of parity symbols is a serial procedure with each of the n−k parity check equations sλj(x) being used to derive each of the n−k parity check symbols which are used to update the input vector to form a codeword of the error correcting code after all n−k parity check symbols have been derived. As each of the parity check equations sλj(x) for j=0 to n−k−1 does not involve any other parity check symbols, it is possible to calculate all parity symbols at the same time, in parallel.


In the decoder shown in FIG. 3, which may be used for Galois and non Galois fields, β=0 and u0(x) is the all 1's vector. The list of positions of the unknown symbols are stored and used by the Controller to direct Select A to select which of the ui(Z) vectors will be stored in the Registers prior to being multiplied together to derive sλj(x). As in the encoder, the input vector has been initialised with zeros in the positions of the unknown symbols so that equation (27) and equation (28) are valid and each parity check equation sλj(x) may be used directly to determine each unknown symbol. In FIG. 3 the output of Multiply and Sum is equal to the result of equation (27). Under direction of the Controller, Select B selects the coefficient of sλj(x), sλj(n-λj) which is multiplied by −1 and inverted, as shown in FIG. 3, and multiplied by the output of Multiply and Sum to produce the solution for the unknown symbol in position λj, ĉλj and the codeword stored in Input Vector is updated with this calculated coefficient using Update as shown in FIG. 3.


For the decoder shown in FIG. 3, the calculation of unknown symbols is a serial procedure with each of the n−k parity check equations, sλj(x), being used to derive each of the n−k unknown symbols which are used to update the input vector to form the codeword of the error correcting code after all n−k unknown symbols have been derived.


In another embodiment of the invention, suited to high speed applications, all of the n−k parity check equations, sλj(x) for j=0 through to n−k−1 and given by equation (14), may be determined in parallel. Also, since each equation provides a solution to each of the unknown symbols and is independent of all of the other unknown symbols, all of the n−k unknown symbols may be determined simultaneously. It is clear that this may be done for either the encoder or the decoder.


In a further embodiment of the invention which is suited to very high speed applications, the parity check equations for sets of unknown symbols may be pre-calculated and stored in one or more look up tables. Given a set of unknown symbols, the required parity check equations to solve for these symbols may be accessed from one or more of the look up tables.


In another embodiment of the invention which is suited to low complexity applications, the parity check equation sλn−k−1(x) which provides the solution of the unknown symbol in position λn−k−1 is derived first and is given by equation (26) above. Equation (9) is then used to determine the unknown symbol in position λn−k−1 producing the coefficient ĉλn−k−1. This coefficient may be substituted into ĉ(x) so that ĉ(x) now only contains n−k−1 unknown symbols. The unknown symbol in position λn−k−2 may be solved using the polynomial s−1(x) given by






s
−1(x)=u0(x){circle around (·)}u1(x){circle around (·)}u2(x) . . . {circle around (·)}un−k−3(x)  (29)


and by using equation (9). It will be noticed that s−1(x) consists of the same product terms as sλn−k−1(x) except that the last product term, un−k−2(x) is omitted. Consequently there is no necessity to carry out the products again to derive s−1(x) because it has already been derived as an intermediate step in deriving sλn−k−1(x).


The coefficient ĉλn−k−2 is now determined and ĉ(x) updated by using the polynomial s−2(x) given by






s
−2(x)=u0(x){circle around (·)}u1(x){circle around (·)}u2(x) . . . {circle around (·)}un−k−3(x)  (30)


As before there is no necessity to derive this equation again because it has already been derived as an intermediate step. It may be further observed that in deriving sλn−k−1(x) all of the other n−k−1 required parity check equations may be produced in turn and stored for later use. The procedure repeats until all of the unknown symbols have been solved with the final result that ĉ(x)=c(x). It is clear that this embodiment of the invention may be applied to both the encoder and the decoder.


EXAMPLES

In the first example, the coefficients of codewords are from the Galois field GF(11) whose non zero elements are generated by powers of the primitive root α modulo 11, and for the prime number, p=11, α is equal to 2:









TABLE 1







All 10 Non zero Galois Field elements of GF(11) for α = 2









symbol
αi
αi modulo p












α0
1
1


α1
2
2


α2
4
4


α3
8
8


α4
16
5


α5
32
10


α6
64
9


α7
128
7


α8
256
3


α9
512
6









For GF(11), n=10, and the codeword is of length 10 symbols. Consider an example of a codeword with ĉ(x)=3x4+2x5+7x67x78x89x9 where ĉ7, ĉ8 and ĉ9 are parity symbols, and the other coefficients of ĉ(x) are zero. The parity symbol positions are λ0=7, λ1=8 and λ2=9. β=0 and the parity check equation, u0(x), is the all 1's vector. Using equation (12), the parity check equation u1(x) is given by











u
1



(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

10
-
7



)



x
j



=




j
=
0


n
-
1





(


α
j

-

α
3


)



x
j








(
31
)







after evaluation






u
1(x)=(α0−α3)+(α1−α3)x+(α2−α3)x2+(α3−α3)x3+(α4−α3)x4+ . . .  (32)





and






u
1(x)=α24x+α7x23x41x5+x6+ . . .  (33)


The parity check equation u2(x) is given by











u
2



(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

10
-
8



)



x
j



=




j
=
0


n
-
1





(


α
j

-

α
2


)



x
j








(
34
)







after evaluation






u
2(x)=(α0−α2)+(α1−α2)x+(α2−α2)x2+(α3−α2)x3+(α4−α2)x4+ . . .  (35)





and






u
2(x)=α36x+α2x3+x49x54x6+ . . .  (36)


The parity check equation to solve for the parity symbol in position λ2=9, s9(x)=u0(x){circle around (·)}u1(x){circle around (·)}u2(x) and






s
9(x)=α5x+α3x4+x54x6+ . . .  (37)


The product s9(x)c(x)=0 and for the coefficient of x0





4+2+7α39=0  (38)





and





4+2+19=0  (39)


and ĉ9=7×−1=7×10=4


Referring to FIG. 2 the List of Parity Symbols contains the numbers 7, 8, and 9. The Controller directs Select A to store u0(x), u1(x) and u2(x) in the respective Registers which are multiplied, symbol by symbol, to produce s9(x) which is input to Multiply and Sum. The other input to Multiply and Sum is ĉ(x) with parity coefficients set ĉ7=0, ĉ8=0, and ĉ9=0. The output of Multiply and Sum is 7 which is input to the multiplier. The Controller directs Select B to select the coefficient of x1 of s9(x) which is 1. This is negated and Invert produces at its output 10 which is also input to the multiplier. The product output is 4 which Update uses to update coefficient ĉ9 of the Input Vector.


Similarly for the solution of ĉ8, the parity check equation u3(x) is required and given by






u
3(x)=α5+αx29x38x43x57x6+ . . .  (40)


and the parity check equation required to solve for the parity symbol in position 8, s8(x) u0(x){circle around (·)}u1(x){circle around (·)}u3(x) is






s
8(x)=α78x2+αx44x57x6+ . . .  (41)


The product s8(x)c(x)=0 and for the coefficient of x0





7+2α4+7α+α8ĉ8=0  (42)





and





10+10+3+α8ĉ8=0  (43)


and








c
^

8

=


-

1

α
8



=


10
×

α
2


=
7.






Referring to FIG. 2 the Controller directs Select A to store u0(x), u1(x) and u3(x) in the respective Registers which are multiplied, symbol by symbol, to produce s8(x) which is input to Multiply and Sum. The other input to Multiply and Sum is ĉ(x) with parity coefficients set ĉ7=0 and ĉ8=0. The output of Multiply and Sum is 1 which is input to the multiplier. The Controller directs Select B to select the coefficient of x2 of s8(x) which is α8. This is negated and Invert produces at its output 7 which is also input to the multiplier. The product output is 7 which Update uses to update coefficient ĉ8 of the Input Vector.


Similarly the parity check equation required to solve for the parity symbol in position 7, s7(x)=u0(x){circle around (·)}u2(x){circle around (·)}u3(x) and after solving gives ĉ7=10 and the complete codeword after all of the updating of coefficients is






c(x)=ĉ(x)=3x4+2x5+7x6+10x7+7x8+4x9  (44)


As a check, determining u0(x)c(x), the coefficient of x0 is 3+2+7+10+7+4=33=0.


As an example of the invention being used as a decoder, consider that the above codeword is retrieved from an information system as






ĉ(x)=ĉ4x4+2x56x6+10x7+7x8+4x9  (45)


The unknown symbol positions are λ0=4, and λ1=6. To determine the coefficient ĉ6, it is sufficient to determine the parity check equation sλ1(x)=u0(x){circle around (·)}u1(x) and











s

λ
1




(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

10
-
4



)



x
j



=




j
=
0


n
-
1





(


α
j

-

α
6


)



x
j








(
46
)







and after evaluation






s
6(x)=α82x+α9x2+x37x4+x5+αx7+ . . .  (47)


As before, the product s6(x)ĉ(x)=0 and for the coefficient of x0





26α7+10α5+7α9+4α2=0  (48)


giving 2+7ĉ6+100+42+16=0 and 7ĉ6=5 and








c
^

6

=



α
4


α
7


=


α
7

=
7.






Referring to FIG. 3 the List of Unknown Symbols contains the numbers 4 and 6. The Controller directs Select A to store u0(x) and u1(x) in the respective Registers which are multiplied, symbol by symbol, to produce s6(x) which is input to Multiply and Sum. The other input to Multiply and Sum is ĉ(x) with unknown coefficients set, ĉ4=0 and ĉ6=0. The output of Multiply and Sum is 6 which is input to the multiplier. The Controller directs Select B to select the coefficient of x4 of s6(x) which is α7. This is negated and Invert produces at its output 3 which is also input to the multiplier. The product output is 7 which Update uses to update coefficient c6 of the Input Vector.


To solve for the unknown symbol ĉ4, sλ0(x) is required and given by sλ0(x) u0(x){circle around (·)}u2(x) and











s

λ
0




(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

10
-
6



)



x
j



=




j
=
0


n
-
1





(


α
j

-

α
4


)



x
j








(
49
)







and after evaluation






s
4(x)=α73x+α5x28x34x52x6+ . . .  (50)


The product s4(x)ĉ(x)=0 and for the coefficient of x0





10+4+8+104α2=0  (51)


giving 10+α2ĉ4=0 and








c
^

4

=


1

α
2


=


α
8

=
3






the finally updated codeword ĉ(x)=3x4+2x5+7x6+10x7+7x8+4x9 and is equal to the original codeword c(x). Referring to FIG. 3 the Controller directs Select A to store u0(x) and u2(x) in the respective Registers which are multiplied, symbol by symbol, to produce s4(x) which is input to Multiply and Sum. The other input to Multiply and Sum is ĉ(x) with unknown coefficient set, ĉ4=0. The output of Multiply and Sum is 10 which is input to the multiplier. The Controller directs Select B to select the coefficient of x6 of s4(x) which is α2. This is negated and Invert produces at its output 8 which is also input to the multiplier. The product output is 3 which Update uses to update coefficient ĉ4 of the Input Vector. With the last update the Input Vector becomes 3x4+2x5+7x6+10x7+7x8+4x9 which is equal to the original codeword c(x).


The second example is for a binary BCH code of length n=15, with codewords generated by the generator polynomial g(x)=(1+x3+x4)(1+x). The Galois field is GF(24) generated by the primitive root oz which is a root of the primitive polynomial 1+x+x4 so that 1+α+α4=0 and the Galois field consists of the following table of 15 field elements, plus the element, 0.









TABLE 2







All 15 Non zero Galois Field elements of GF(16)












symbol
αi
modulo
1 + α + α4

















α0 =
1






α1 =

α1



α2 =


α2



α3 =



α3



α4 =
1+
α



α5 =

α+
α2



α6 =


α2+
α3



α7 =
1+
α+

α3



α8 =
1+

α2



α9 =

α+

α3



α10 =
1+
α+
α2



α11 =

α+
α2+
α3



α12 =
1+
α+
α2+
α3



α13 =
1+

α2+
α3



α14 =
1+


α3










An example of a codeword from the binary BCH code is






c(x)=x+x3+x4+x6+x8+x9+x10+x11  (52)


and consider that in a communication system, the codeword is received with erasures in positions in λ0=5, λ1=0 and λ2=8 so that the received codeword is






ĉ(x)=ĉ0+x+x3+x45x5+x68x8+x9+x10+x11  (53)


Referring to FIG. 3, Select A selects the parity check equation, u0(x), the all 1's vector to be stored in the Register. The parity check equation u1(x) has zero in position n−λ0=n−5 and is given by











u
1



(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

15
-
5



)



x
j



=




j
=
0


n
-
1





(


α
j

-

α
10


)



x
j








(
54
)







In FIG. 3, Select A selects u1(x) to be stored in the corresponding Register. The polynomial u1(x) is






u
1(x)=(α0−α10)+(α1−α10)x+(α2−α10)x2+(α3−α10)x3+(α4−α10)x4+ . . .  (55)


and noting that the base field is 2 so that −1=1,






u
1(x)=α58x+α4x212x32x4+x57x66x7+αx813x914x113x129x1311x14  (56)


The parity check equation u2(x) has zero in position n−λ1=n−0 and is given by











u
2



(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

15
-
0



)



x
j



=




j
=
0


n
-
1





(


α
j

-
1

)



x
j








(
57
)







after evaluation











u
2



(
x
)


=



α
4


x

+


α
8



x
2


+


α
14



x
3


+

α






x
4


+


α
10



x
5


+


α
13



x
6


+


α
9



x
7


+


α
2



x
8


+


α
7



x
9


+


α
5



x
10


+


α
12



x
11


+


α
11



x
12


+


α
6



x
13


+


α
3



x
14







(
58
)







Referring to FIG. 3, Select A will select this polynomial to be stored in the corresponding Register.


The parity check equation s8(x) which gives the solution for coefficient ĉ8 is s8(x)=u0(x){circle around (·)}u1(x){circle around (·)}u2(x). Multiplying each of the corresponding coefficients together of the polynomials u0(x), u1(x) and u2(x) produces











s
8



(
x
)


=




α
12


x

+


α
12



x
2


+


α
11



x
3


+


α
3



x
4


+


α
10



x
5


+


α
5



x
6


+

x
7


|


α
10



x
8


|


α
5



x
9


|


α
11



x
11


|


α
14



x
12


|

x
13

|


α
14



x
14







(
59
)







Referring to FIG. 3, s8(x) will be input to Multiply and Sum. It should be noted that the parity check equation s8(x) has non binary coefficients even though the codeword is binary and the solution to the parity check equation has to be binary.


Evaluating the coefficient of x0 of s8(x)ĉ(x) gives α141411585103=0 which simplifies to α118103=0. Using Table 2 gives





(α+α23)+ĉ8+(1+α+α2)+α3=0


and ĉ8=1. Referring to FIG. 3, Select B produces from s8(x) the value of the coefficient of x7 which is 1 and when inverted this is also equal to 1. The output of the Multiply and Add is 1 producing a product of 1, which is used by Update to update ĉ8=1 in the Input Vector ĉ(x).


The parity check equation s0(x) which gives the solution for coefficient ĉ0 is s0(x)=u0(x){circle around (·)}u1(x){circle around (·)}u3(x) with u3(x) given by











u
3



(
x
)


=





j
=
0


n
-
1





(


α
j

-

α

15
-
8



)



x
j



=




j
=
0


n
-
1





(


α
j

-

α
7


)



x
j








(
60
)







after evaluation











u
3



(
x
)


=


α
9

+


α
14


x

+


α
12



x
2


+


α
4



x
3


+


α
3



x
4


+


α
13



x
5


+


α
10



x
6


+


α
11



x
8


+

x
9

+


α
6



x
10


+


α
8



x
11


+


α
2



x
12


+


α
5



x
13


+

α






x
14







(
61
)







and s0(x) is now











s
0



(
x
)


=


α
14

+


α
5


x

+

α






x
2


+

α






x
3


+


α
5



x
4


+


α
13



x
5


+


α
2



x
6


+


α
12



x

8







+


α
13



x
9


+


α
7



x
11


+


α
5



x
12


+


α
14



x
13


+


α
12



x
14







(
62
)







Referring to FIG. 3, s0(x) is input to Multiply and Sum. Evaluating the coefficient of x0 of s0(x)ĉ(x) gives





α14ĉ01257132135=0


which simplifies to α14ĉ01272=0. Using Table 2 gives





α14ĉ0+(1+α+α23)+(1+α+α3)+α2=0


and ĉ0=0. Referring to FIG. 3, Select B produces from s0(x) the coefficient of x0 which is α14 and when negated, Invert produces oz at its output. The output of the Multiply and Add is 0 producing a product of 0, which is used by Update to update ĉ0=0 in the Input Vector ĉ(x).


In order to solve for 5 the parity check equation s5(x)=u0(x){circle around (·)}u2(x){circle around (·)}u3(x) is used, and s5(x) is given by











s
5



(
x
)


=



α
3


x

+


α
5



x
2


+


α
3



x
3


+


α
4



x
4


+


α
8



x
5


+


α
8



x
6


+


α
13



x
8


+


α
7



x
9


+


α
11



x
10


+


α
5



x
11


+


α
13



x
12


+


α
11



x
13


+


α
4



x
14







(
63
)







Referring to FIG. 3, s5 (x) is input to Multiply and Sum. Evaluating the coefficient of x0 of s5(x)ĉ(x) gives





α413511ĉ57884=0


which simplifies to α11ĉ51357=0. Using Table 2 gives





α11ĉ5+(1+α23)+(α+α2)+(1+α+α3)=0


and ĉ5=0. Referring to FIG. 3, Select B produces from s5(x) the coefficient of x10 which is α11 and when negated, Invert produces a 4. The output of the Multiply and Add is 0 producing a product of 0, which is used by Update to update ĉ5=0 in the Input Vector ĉ(x) giving






ĉ(x)=x+x3+x4+x6+x8+x9+x10+x11


It is apparent that the final, updated Input Vector, ĉ(x) is equal to the original codeword c(x).


The third example is for an analog BCH code of length n=8, with codewords generated by the Discrete Fourier Transform using oz equal to the 8th root of unity and with complex codeword coefficients. The powers of α are given in the following table of complex field elements.













TABLE 3







αi




e


ji





2

π

8

























α0 =
  1
  j0



α1 =
  0.7071
  j0.7071



α2 =
  0
  j1



α3 =
−0.7071
  j0.7071



α4 =
−1
  j0



α5 =
−0.7071
−j0.7071



α6 =
  0
−j1



α7 =
  0.7071
−j0.7071











All 8 distinct powers of α =
ej2π8







Each codeword from the analog BCH code consists of n=8 symbols where each coefficient is a complex number. In this particular example the code is chosen with 3 parity check coefficients and 5 information symbols. In the following, for brevity, the complex numbers are truncated and only two decimal places are shown. Consider the example codeword











c
^



(
x
)


=



c
^

0

+



c
^

1


x

+



c
^

2



x
2


+


(

0.41
-

0.63

j


)



x
3


-


(

0.72
-

0.28

j


)



x
4


+


(

1.45
-

0.85

j


)



x
5


-


(

1.28
-

1.1

j


)



x
6


+


(

0.96
-

1.34

j


)



x
7







(
64
)







The first three coefficients are the parity check symbols and referring to FIG. 2. the example codeword is stored as the Input Vector with the initialisation ĉ0=0, ĉ1=0 and ĉ2=0. The List of Parity Symbols contains λ0=0, λ1=1 and λ2=2. For λ0=0, Controller uses Select A to select the vectors α0, αi−α8−1 and αi−α8−2, where i=0 through to 7. The vectors correspond to u0(x), u2(x) and u3(x). These are stored in each respective Register and multiplied together to produce the vector corresponding to the overall parity check equation s0(x) which is used to calculate ĉ0. s0(x)=u0(x){circle around (·)}u2(x){circle around (·)}u3(x) where u0(x) is






u
0(x)=1+x+x2+x3+x4+x5+x6+x7  (65)


and u2(x) is











u
2



(
x
)


=


(

0.29
+

0.70

j


)

+

1.41

jx

-


(

0.70
-

1.70

j


)



x
2


-


(

1.41
-

1.41

j


)



x
3


-


(

1.70
-

0.70

j


)



x
4


-

1.41


x
5


-


(

0.70
+

0.29

j


)



x
6







(
66
)







and u3(x) is











u
3



(
x
)


=

1
+
j
+


(

0.70
+

1.70

j


)


x

+

2


x
2


-


(

0.70
-

1.70

j


)



x
3


-


(

1
-
j

)



x
4


-


(

0.70
-

0.29

j


)



x
5


+


(

0.70
+

0.29

j


)



x
7







(
67
)







The resulting product s0(x) is











s
0



(
x
)


=


-

(

0.41
-
j

)


-


(

2.41
-
j

)


x

-


(

3.41
+

1.41

j


)



x
2


-


(

1.41
+

3.41

j


)



x
3


-


(

1
-

2.41

j


)



x
4


+


(

1
-

0.41

j


)



x
5







(
68
)







Since s0(x)ĉ(x)=0, evaluating the coefficient of x0 gives









0
=



-

(

0.41
-
j

)





c
^

0


-


(

2.41
-
j

)



(

0.96
-

1.34

j


)


+


(

3.41
+

1.41

j


)



(

1.28
-

1.1

j


)


-


(

1.41
+

3.41

j


)



(

1.45
-

0.85

j


)


+


(

1
-

2.41

j


)



(

0.72
-

0.28

j


)


+


(

1
-

0.41

j


)



(

0.41
-

0.63

j


)















and after evaluation





(0.41−j)ĉ0=0.1−0.28j  (69)





and






ĉ
0=(0.1−0.28j)(0.35+0.85j)=0.27−0.01j  (70)


Referring to FIG. 2, the polynomials u0(x), u2(x) and u3(x) are selected by Select A and each is stored in a Register and multiplied together as shown to produce s0(x) which is input to Multiply and Sum. The other input to Multiply and Sum is the Input Vector, ĉ(x) with initialisation, ĉ0=0, ĉ1=0 and ĉ2=0. The output of Multiply and Sum is 0.1−0.28j which is input to the multiplier. Select B selects from s0(x), the coefficient of x0 which is −0.41+j. This is negated and inverted to produce at the output of Invert (0.35+0.85j) which is also input to the multiplier. As shown in FIG. 2, the result of the product, which in this case is 0.27−0.01j, is used by Update to update the coefficient ĉ0 of the Input Vector.


In similar fashion the other two coefficients of c(x), ĉ1 and ĉ2, are derived and used to update the Input Vector to produce finally the codeword of the analog BCH code:







c


(
x
)


=



c
^



(
x
)


=


(

0.27
-

0.01

j


)

-


(

2.70
+

0.34

j


)


x

+


(

1.61
+

1.79

j


)



x
2


+


(

0.41
-

0.63

j


)



x
3


-


(

0.72
-

0.28

j


)



x
4


+


(

1.45
-

0.85

j


)



x
5


-


(

1.28
-

1.1

j


)



x
6


+


(

0.96
-

1.34

j


)



x
7








Consider that in an information system, this codeword is partially retrieved with unknown symbols in positions λ0=4, λ1=5 and λ2=7 so that the received codeword is








c
^



(
x
)


=


(

0.27
-

0.01

j


)

-


(

2.70
+

0.34

j


)


x

+


(

1.61
+

1.79

j


)



x
2


+


(

0.41
-

0.63

j


)



x
3


+



c
^

4



x
4


+



c
^

5



x
5


-


(

1.28
+

1.1

j


)



x
6


+



c
^

7



x
7







Referring to FIG. 3 the List of Unknown Symbols contains λ0=4, λ1=5 and λ2=7. For λ0=4, Controller uses Select A to select the polynomial coefficient vectors α0, αi−α8−5 and αi−α8−7 corresponding to u0(x), u2(x) and u3(x). These are stored in each respective Register and multiplied together to produce s4(x):











s
4



(
x
)


=



-
1.41


j

-

0.58


x
2


+

1.41


jx
4


-


(

2
-

2

j


)



x
5


-

3.41


x
6


-


(

2
+

2

j


)



x
7







(
71
)







This is input to Multiply and Sum. The other input to Multiply and Sum is the Input Vector, ĉ(x) with unknown coefficients initialised, ĉ4=0, ĉ5=0 and ĉ7=0. The output of Multiply and Sum is 0.4+1.02j which is input to the multiplier. Select B selects from s4(x), the coefficient of x4 which is 1.41j. This is negated and inverted to produce at the output of Invert, 0.71j, which is also input to the multiplier. As shown in FIG. 3, the result of the product, which in this case is −0.72+0.28j, is used by Update to update the coefficient ĉ4 of the Input Vector.


For λ1=5, Controller uses Select A to select the polynomial coefficient vectors α0, αi−α8−4 and αi−α8−7 corresponding to u0(x), u1(x) and u3(x). These are stored in each respective Register and multiplied together to produce s5(x):











s
5



(
x
)


=


(

0.58
-

1.41

j


)

-


(

1
+

0.41

j


)



x
2


-


(

0.41
+
j

)



x
3


-


(

1.41
-

0.58

j


)



x
5


-


(

2.41
+
j

)



x
6


-


(

1
+

2.41

j


)



x
7







(
72
)







This input to Multiply and Sum is s5(x). The other input to Multiply and Sum is the Input Vector, ĉ(x) with unknown coefficients initialised, ĉ5=0 and ĉ7=0. The output of Multiply and Sum is 1.45+1.09j which is input to the multiplier. Select B selects from s5(x) the coefficient of x3 which is −0.41−j. This is negated and inverted to produce 0.35−0.85j which is also input to the multiplier. As shown in FIG. 3, the result of the product, which in this case is 1.45-0.85j, is used by Update to update the coefficient ĉ5 of the Input Vector.


For λ2=7, Controller uses Select A to select the polynomial coefficient vectors α0, αi−α8−4 and αi−α8−5 corresponding to u0(x), u1(x) and u2(x). These are stored in each respective Register and multiplied together to produce s7(x):











s
7



(
x
)


=


(

3.41
-

1.41

j


)

+


(

2.41
+
j

)


x

+


(

0.41
+
j

)



x
2


-


(

1
+

0.41

j


)



x
5


-


(

1
+

2.41

j


)



x
6


+


(

1.41
-

3.41

j


)



x
7







(
73
)







s7(x) is input to Multiply and Sum. The other input to Multiply and Sum is the Input Vector, ĉ(x) with unknown coefficient initialised, ĉ7=0. The output of Multiply and Sum is −3.65+2.27j which is input to the multiplier. Select B selects from s7(x) the coefficient of x which is 2.41+j which is negated and inverted to produce −0.35+0.14j which is also input to the multiplier. As shown in FIG. 3, the result of the product, which in this case is 0.96−1.34j, is used by Update to update the coefficient ĉ7 of the Input Vector to produce the original codeword.







c


(
x
)


=



c
^



(
x
)


=


(

0.27
-

0.01

j


)

-


(

2.70
+

0.34

j


)


x

+


(

1.61
+

1.79

j


)



x
2


+


(

0.41
-

0.63

j


)



x
3


-


(

0.72
-

0.28

j


)



x
4


+


(

1.45
-

0.85

j


)



x
5


-


(

1.28
-

1.1

j


)



x
6


+


(

0.96
-

1.34

j


)



x
7








REFERENCES



  • [1] F. J. MacWilliams and N. J. A. Sloane, The Theory of Error Correcting Codes, North Holland, 1977

  • [2] S. Lin and D. J. Costello, Jr., Error Control Coding, 2nd ed., Pearson Prentice Hall, 2004

  • [3] J. G. Proakis, Digital Communications, McGraw-Hill, 1997

  • [4] B. G. Dorsch, A Decoding Algorithm for Binary Block Codes and J-ary Output Channels, IEEE Transactions Information Theory, Vol. IT-20, pp. 391-394, May 1974.

  • [5] M. P. C. Fossorier and S. Lin, Soft-decision decoding of linear block codes based upon ordered statistics, IEEE Transactions Information Theory, Vol. 41, pp. 1379-1396, September 1995.

  • [6] M. Tomlinson, C. J. Tjhai, and M. A. Ambroze, Extending the Dorsch decoder towards achieving maximum-likelihood decoding for linear codes, IET Communications, Vol. 1, issue 3, pp. 479-488, June 2007.

  • [7] B. Kamali and P. Morris, Application of erasure-only decoded Reed-Solomon codes in cell recovery for congested ATM networks, pp. 982986, Vehicular Technology Conference 2000

  • [8] L. Rizzo, Effective erasure codes for reliable computer communication protocols, ACM Computer Communication review, vol. 27, pp. 2436, April 1997.

  • [9] A. J. McAuley, Reliable broadband communication using a burst erasure correcting code, Proc. ACM SIGCOMM 90; (Special Issue Computer Communication Review), September 1990, pp. 297306, published as Proc. ACM SIGCOMM 90; (Special Issue Computer Communication Review), volume 20, number 4.


Claims
  • 1. A system in which a codeword from an error correcting code with minimum Hamming distance d has symbols in which the positions of d−1 of the parity check symbols may be arbitrarily chosen, and each of the d−1 parity check symbols is produced by solving a parity check equation that is independent of all of the other parity check symbols and formed by multiplying together d−1 codewords from the dual code of the error correcting code, symbol by symbol,starting with a codeword of the dual code that has a non zero symbol in the position of the parity check symbol being solved,and in which each of the other d−2 dual code codewords comprise symbols given by the difference between an incrementally increasing power of a primitive root of unity and the primitive root of unity raised to a power equal to the position of each of the other d−2 parity check symbols,and a total of d−1 parity check equations are so formed in parallel and used simultaneously to solve for the d−1 parity check symbols which together with the information symbols form an encoded codeword.
  • 2. A system in which a codeword from an error correcting code with minimum Hamming distance d has symbols in which the positions of d−1 of the parity check symbols may be arbitrarily chosen, and one of the d−1 parity check symbols is produced by solving a parity check equation that is independent of all of the other parity check symbols and formed by multiplying together d−1 codewords from the dual code, symbol by symbol,and each of the d−1 parity check equations resulting from each dual code codeword multiplication is retained in the order they are calculated,starting with an initial codeword of the dual code that has a non zero symbol in the position of the parity check symbol being solved,and in which each of the other d−2 dual code codewords comprise symbols given by the difference between an incrementally increasing power of a primitive root of unity and the primitive root of unity raised to a power equal to the position of one of the other parity check symbols taken in turn,and the resulting parity check equation is used to solve the parity check symbol,and the solved parity check symbol is appended with the information symbols to form a partially solved codeword,and each of the retained parity check equations are used in reverse order on the partially solved codeword to solve for each of the other parity check symbols in turn with each solved parity check symbol substituted into the partially solved codeword to update the partially solved codeword,until the parity check equation corresponding to the initial codeword of the dual code is used to solve the last parity check symbol which is substituted into the partially solved codeword to form the encoded codeword.
  • 3. A system in which e correctable symbols of a codeword from an error correcting code are unknown, and each of the e unknown symbols is determined by solving a parity check equation that is independent of all of the other unknown symbols and formed by multiplying together e codewords from the dual code of the error correcting code, symbol by symbol,starting with a codeword of the dual code that has a non zero symbol in the position of the unknown symbol being solved,and in which each of the other e−1 dual code codewords comprise symbols given by the difference between an incrementally increasing power of a primitive root of unity and the primitive root of unity raised to a power equal to the position of each of the other e−1 unknown symbols,and a total of e parity check equations are so formed in parallel and used simultaneously to solve for the e unknown symbols which together with the known symbols form the original codeword.
  • 4. A system in which e correctable symbols of a codeword from an error correcting code are unknown, and a parity check equation for one unknown symbol is produced that is independent of all of the other e−1 unknown symbols by multiplying together e codewords from the dual code of the error correcting code, symbol by symbol,and where each of the e parity check equations resulting from each dual code codeword multiplication are retained in the order they are calculated,starting with an initial codeword of the dual code that has a non zero symbol in the position of the unknown symbol being solved,and in which each of the other e−1 dual code codewords are formed from the difference between an incrementally increasing power of a primitive root of unity and the primitive root of unity raised to a power equal to the position of each of the other unknown symbols taken in turn,and the resulting parity check equation is used to solve the unknown symbol,and the solved unknown symbol is appended with the known symbols to form a partially solved codeword,and each of the retained parity check equations are used in reverse order on the partially solved codeword to solve for each of the other unknown symbols in turn with each solved symbol substituted into the partially solved codeword to update the partially solved codeword,until the parity check equation corresponding to the initial codeword of the dual code is used to solve the last unknown symbol which is substituted into the partially solved codeword to form the original codeword.
  • 5. A system according to claim 1 in which the symbols of the error correcting code and dual code are from the field of complex numbers.
  • 6. A system according to claim 2 in which the symbols of the error correcting code and dual code are from the field of complex numbers.
  • 7. A system according to claim 3 in which the symbols of the error correcting code and dual code are from the field of complex numbers.
  • 8. A system according to claim 4 in which the symbols of the error correcting code and dual code are from the field of complex numbers.
  • 9. A system according to claim 1 except that some products of dual code codewords, symbol by symbol, are not calculated as required but are pre-calculated and stored in memory in one or more look up tables, and the required dual code codewords are accessed from the sets of dual code codewords stored in one or more look up tables.
  • 10. A system according to claim 2 except that some products of dual code codewords, symbol by symbol, are not calculated as required but are pre-calculated and stored in memory in one or more look up tables, and the required dual code codewords are accessed from the sets of dual code codewords stored in one or more look up tables.
  • 11. A system according to claim 3 except that some products of dual code codewords, symbol by symbol, are not calculated as required but are pre-calculated and stored in memory in one or more look up tables, and the required dual code codewords are accessed from the sets of dual code codewords stored in one or more look up tables.
  • 12. A system according to claim 4 except that some products of dual code codewords, symbol by symbol, are not calculated as required but are pre-calculated and stored in memory in one or more look up tables, and the required dual code codewords are accessed from the sets of dual code codewords stored in one or more look up tables.