Error-correcting code
10148292 ยท 2018-12-04
Assignee
Inventors
Cpc classification
H03M13/616
ELECTRICITY
International classification
H03M13/00
ELECTRICITY
H03M13/39
ELECTRICITY
Abstract
An example method to decode an error-correcting code includes receiving a tuple including a seed and a coded packet over a communication channel, and based on the seed, reconstructing a set of pseudorandom coefficients used by an encoder to create the coded packet. The method also includes entering the set of pseudorandom coefficients and the coded packet in a decoding matrix and reducing the decoding matrix to a row echelon form. After reducing the decoding matrix to a row echelon form, the method further includes determining if the decoding matrix is decodable up to a number of rows, reducing the decoding matrix up to the number of rows by backward substitution so a part of the first matrix becomes an identity matrix and a corresponding part of the second matrix comprise source packets, and extracting the source packets from the padded packets.
Claims
1. A method to decode an error-correcting code, the method comprising: receiving a tuple including a seed and a coded packet over a communication channel; determining whether the tuple is older than a sliding decoding window, wherein any tuple older than the sliding decoding window is discarded, and when the tuple is newer than the sliding decoding window, advancing the sliding decoding window to include the tuple; based on the seed, reconstructing a set of pseudorandom coefficients used by an encoder to create the coded packet; entering the set of pseudorandom coefficients and the coded packet as a row in a decoding matrix, wherein the decoding matrix comprises a first matrix and a second matrix, the first matrix comprises sets pseudorandom coefficients including the set of pseudorandom coefficients, and the second matrix comprises coded packets including the coded packet; reducing the decoding matrix to a row echelon form; after reducing the decoding matrix to the row echelon form, determining if the decoding matrix is decodable up to a number of rows; when the decoding matrix is decodable up to the number of rows, reducing the decoding matrix up to the number of rows by backward substitution so a part of the first matrix becomes an identity matrix and a corresponding part of the second matrix comprise source packets; and extracting the source packets from padded packets.
2. The method of claim 1, further comprising: after extracting each source packet, incrementing a decoding progress variable; receiving another tuple; determining if the decoding progress variable is older than the sliding decoding window; and when the decoding progress variable is older than the sliding decoding window, generating an alert indicating that at least one source packet has been lost.
3. A computing device, comprising: a network interface; a processor configured to: receive a tuple including a seed and a coded packet through the network interface; determine whether the tuple is older than a sliding decoding window, wherein any tuple older than the sliding decoding window is discarded, and when the tuple is newer than the sliding decoding window, advance the sliding decoding window to include the tuple; based on the seed, reconstruct a set of pseudorandom coefficients used by an encoder to create the coded packet; enter the set of pseudorandom coefficients and the coded packet as a row in a decoding matrix, wherein the decoding matrix comprises a first matrix and a second matrix, the first matrix comprises sets pseudorandom coefficients including the set of pseudorandom coefficients, and the second matrix comprises coded packets including the coded packet; reduce the decoding matrix to a row echelon form; after reducing the decoding matrix to the row echelon form, determine if the decoding matrix is decodable up to a number of rows; when the decoding matrix is decodable up to the number of rows, reduce the decoding matrix up to the number of rows by backward substitution so a part of the first matrix becomes an identity matrix and a corresponding part of the second matrix comprises source packets; and extract the source packets from padded packets.
4. The computing device of claim 3, wherein the processor is further configured to: after extracting each source packet, increment a decoding progress variable; receive another tuple; determine if the decoding progress variable is older than the sliding decoding window; and when the decoding progress variable is older than the sliding decoding window, generate an alert indicating that at least one source packet has been lost.
5. A non-transitory machine readable medium embodying instructions, which in response to execution by a processor, causes the processor to perform a method of decoding an error-correcting code, the method comprising: receiving a tuple including a seed and a coded packet over a communication channel; determining whether the tuple is older than a sliding decoding window, wherein any tuple older than the sliding decoding window is discarded, when the tuple is newer than the sliding decoding window, advancing the sliding decoding window to include the tuple; based on the seed, reconstructing a set of pseudorandom coefficients used by an encoder to create the coded packet; entering the set of pseudorandom coefficients and the coded packet as a row in a decoding matrix, wherein the decoding matrix comprises a first matrix and a second matrix, the first matrix comprises sets pseudorandom coefficients including the set of pseudorandom coefficients, and the second matrix comprises coded packets including the coded packet; reducing the decoding matrix to a row echelon form; after reducing the decoding matrix to the row echelon form, determining if the decoding matrix is decodable up to a number of rows; when the decoding matrix is decodable up to the number of rows, reducing the decoding matrix up to the number of rows by backward substitution so a part of the first matrix becomes an identity matrix and a corresponding part of the second matrix comprise source packets; and extracting the source packets from padded packets.
6. The non-transitory machine readable medium of claim 5, wherein the method further comprising: after extracting each source packet, incrementing a decoding progress variable; receiving another tuple; determining if the decoding progress variable is older than the sliding decoding window; and when the decoding progress variable is older than the sliding decoding window, generating an alert indicating that at least one source packet has been lost.
Description
BRIEF DESCRIPTION OF THE DRAWINGS
(1) The foregoing and other features of the present disclosure will become more fully apparent from the following description and appended claims, taken in conjunction with the accompanying drawings. Understanding that these drawings depict only several embodiments in accordance with the disclosure and are therefore not to be considered limiting of its scope, the disclosure will be described with additional specificity and detail through use of the accompanying drawings.
(2) In the drawings:
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
DETAILED DESCRIPTION
(12) As used herein, the term includes means includes but not limited to, the term including means including but not limited to. The terms a and an are intended to denote at least one of a particular element. The term based on means based at least in part on. The term or is used to refer to a nonexclusive such that A or B includes A but not B, B but not A, and A and B unless otherwise indicated.
(13) In examples of the present disclosure, method and apparatus are provided to generate and decode an error-correcting code. The code may operate on top of the Internet Protocol (IP) so it may be implemented in software, hardware, or a combination thereof without any changes to the existing Internet infrastructure.
(14) High-Level Description
(15)
(16) Both encoder 102 and decoder 110 agree in advance on a finite field F to be used for encoding operations. The finite field F may be the Galois field GF(2.sup.8). Encoder 102 and decoder 110 also agree on a pseudorandom number generator (PRNG) that generates pseudorandom values in the finite field F.
(17) Encoder 102 operates on source packets s.sub.i in a sliding encoder window Li<R, where L, i, and R are notional sequence numbers of the packets used to control the operation of encoder 102. Notional sequence numbers may be selected by encoder 102 as they do appear in source stream 104 and decoder 110 does not pass them in decoded stream 112. Encoder 102 chooses W=RL pseudorandom coefficients c.sub.i, multiplies each source packet s.sub.i by one corresponding coefficient, and transmits the sum of these products. As source packets s.sub.i have varying lengths, a conventional encoder may transmit the length of source packets s.sub.i separately, causing a protocol overhead proportional to encoder window size W. In contrast, encoder 102 has a constant overhead independent of encoder window size W. Instead of encoding source packet s.sub.i, encoder 102 encodes the vector (l.sub.i, s.sub.i), where l.sub.i is the length of source packet s.sub.i, and s.sub.i is source packet s.sub.i padded with enough zeros (0's) so that all packets s.sub.i in the encoder window have the same length. For example, the vector (l.sub.i, s.sub.i) includes (l.sub.L, s.sub.L) (l.sub.L+1, s.sub.L+1) (l.sub.L+2, s.sub.L+2) . . . (l.sub.R1, s.sub.R1).
(18) Decoder 110 reconstructs the vector (l.sub.i, s.sub.i), which is sufficient to reconstruct source packet s.sub.i uniquely. Decoder 110 receives linear combinations of source packets s.sub.i and decodes them by solving a system of linear equations. A conventional decoder may use Gauss-Jordan elimination to solve the system of linear equations. In contrast, decoder 110 may use lower upper (LU) decomposition to solve the system of linear equations. To decode N packets of a length k, the conventional decoder uses a time proportional to N*(N*N+N*k), whereas decoder 110 uses a time W*(N*N+N*k) that is much smaller as long as the encoder window is not too large. Note that decoder 110 may use other methods to solve systems of linear equations.
(19) For each received packet, decoder 110 knows the encoder window size W and the starting position L of the encoder window. Encoder 102 transmits these values as overhead to decoder 110. Decoder 110 also knows the pseudorandom encoding coefficients. Encoder 102 uses coefficients drawn from the PRNG. Decoder 110 has a copy of the PRNG, which will generate the same sequence of coefficients provided that the decoder's PRNG has the same internal state as the encoder's PRNG. The internal states can be synchronized by transmitting the seed of the encoder's PRNG, transmitting the internal state of the encoder's PRNG as overhead, or, for fixed PRNGs, transmitting the starting sequence number of the encoder's PRNG used for a particular packet.
(20) Encoder State
(21) In examples of the present disclosure, encoder 102 maintains the following state variables: L: An integer, mnemonic for left boundary of the encoder window, and initially set to 1 (or another number depending on the notional sequence value of the very first source packet). R: An integer, mnemonic for right boundary of the encoder window, and initially set to 1 (or another number depending on the notional sequence value of the very first source packet). M: A real number representing encoding progress, initially set to 1 (or another number depending on the notional sequence value of the very first source packet), and may be a rational number or a fraction with constant denominator.
(22) During its operation, encoder 102 generates combinations of source packets s.sub.i in the encoder window Li<R.
(23) In examples of the present disclosure, the following two parameters control the operation of encoder 102: rate: A real number 0<rate1 that is the rate of the error-correcting code. For each coded packet, encoder 102 consumes rate source packets. Equivalently, for each source packet, encoder 102 produces 1/rate coded packets. W.sub.E: The maximum encoder window size. During normal operation, 0RLW.sub.E.
(24) In examples of the present disclosure, the encoding rate and the maximum encoder window size W.sub.E may vary with time. A lower encoding rate is appropriate for conditions with greater error rates, and a larger encoder window is appropriate for situations that can tolerate extra decoding latency.
(25) Operation of the Encoder
(26)
(27) When encoder 102 receives a new source packet s.sub.i from the source stream 104, encoder 102 may operate as follows in examples of the present disclosure.
(28) 1. (Formation of the augmented packet) Assume that the encoder receives source packet s.sub.i, the ith packet in source stream 102. Let l.sub.i be the length of source packet s.sub.i.
(29) Encoder 102 forms an augmented packet a.sub.i=(i, l.sub.i, s.sub.i). That is, augmented packet a.sub.i includes the notional sequence number i of source packet s.sub.i length l.sub.i of source packet s.sub.i, and source packet s.sub.i itself. Notional sequence number i is optionally and may be used for debugging. See, for example, augmented packets a.sub.1 and a.sub.3 in
(30) 2. Increment R to advance the right edge of the encoder window in time.
(31) 3. (Adjust encoder window) If RL>W.sub.E, increment L to keep the encoder window smaller than the maximum encoder window size W.sub.E.
(32) 4. (Formation of padded packets) Let k be the largest length of augmented packets a.sub.i in encoder window Li<R. For each augmented packet a.sub.i in encoder window Li<R, form a padded packet p.sub.i by extending a.sub.i with zeros until it has length k. Here, zero is the zero of the finite field F. See, for example, padded packets p.sub.1 and p.sub.3 in
(33) 5. Let first=true. The variable first is used to determine if a padded packet p.sub.i is encoded for the first time.
(34) 6. (Generate coded packets) While MR do the following: a) (Choice of pseudorandom seed) If first is true, let r=0. Otherwise, let r be an arbitrary nonzero random seed. This logic, in combination with the next step, encodes a padded packet by itself when padded packet p.sub.i is encoded for the first time. Otherwise padded packet p.sub.i is encoded by combining it with all other padded packets in the encoder window. b) (Generation of pseudorandom numbers) If r0, use r to generate random coefficients c.sub.iF for Li<R. Otherwise (r=0), let c.sub.i=0 for Li<R<1, and let c.sub.R1=1.sub.F. Here, 1.sub.F is the multiplicative identity of F. c) Set first:=false. d) (Produce a linear combination of padded packets) Interpreting padded packets p.sub.i as elements over the vector space F.sup.k, compute:
(35)
(36)
(37) In block 302, encoder 102 sets variables left encoder window boundary L, right encoder window boundary R, encoding progress M, the encoding rate, and the maximum encoder window size W.sub.E. Block 302 may be followed by block 304.
(38) In block 304, encoder 102 starts to receive source packets s.sub.i in source stream 104. Block 304 may be followed by block 306.
(39) In block 306, encoder 102 starts to loop through source packets s.sub.i in their notional sequence. Block 306 may be followed by block 308.
(40) In block 308, encoder 102 forms an augmented packet a.sub.i=(i, l.sub.i, s.sub.i) based on source packet si. Block 308 may be followed by block 310.
(41) In block 310, encoder 102 advances the encoder window by incrementing the encoder window right boundary R. Block 310 may be followed by block 312.
(42) In block 312, encoder 102 determines if the encoder window is smaller than the maximum encoder window size W.sub.E. If so, then block 312 may be followed by block 316. Otherwise block 312 may be followed by block 314.
(43) In block 314, encoder 102 maintains the encoder window size by incrementing the encoder window left boundary L. Block 314 may be followed by block 316.
(44) In block 316, encoder 102 determines the largest length k of augmented packets a.sub.i in encoder window Li<R and pads augmented packets a.sub.i by appending them with zeros until they all have length k. Block 316 may be followed by block 318 in
(45) In block 318, encoder 102 sets variable first to true (e.g., 1) to denote padded packet p.sub.i is to be encoded for the first time. As described later, encoder 102 sets variable first to false (e.g., 0) after encoding padded packet p.sub.i for the first time. Block 318 may be followed by block 320.
(46) In block 320, encoder 102 determines if padded packet p.sub.i is to be encoded (again). If so, block 320 may be followed by block 322. Otherwise block 320 may be followed by block 306 to select the next source packet s.sub.i to process.
(47) Padded packet p.sub.i is to be encoded (again) when it has not been encoded for a certain number of times. Encoder 102 uses encoding progress M to make this determination. As described later, encoder 102 increments encoding progress M by the encoding rate after encoding padded packet p.sub.i. Encoder 102 encodes padded packet p.sub.i (again) while encoding progress M is less than or equal to the encoder window right boundary R.
(48) In block 322, encoder 102 determines if padded packet p.sub.i is to be encoded for the first time. In other words, encoder 102 determines if variable first is set as true. If so, block 322 may be followed by block 324. Otherwise block 322 may be followed by block 328.
(49) In block 324, encoder 102 sets a seed r for the PRNG to zero (0) to indicate padded packet p.sub.i is to be encoded by itself without any other earlier padded packets p.sub.i in the encoder window. Block 324 may be followed by block 326.
(50) In block 326, encoder 102 sets c.sub.i=0 for Li<R1, and sets c.sub.R1=1.sub.F where 1.sub.F is the multiplicative identity of F. Block 326 may be followed by block 332.
(51) In block 328, encoder 102 lets seed r for the PRNG to be an arbitrary nonzero random number. Block 328 may be followed by block 330.
(52) In block 330, encoder 102 uses seed r to generate pseudorandom coefficients c.sub.i, where c.sub.iF for Li<R. Block 330 may be followed by block 332.
(53) In block 332, encoder 102 sets variable first to false (e.g., 0). Block 332 may be followed by block 334.
(54) In block 334, encoder 102 linearly combines the products of coefficients c.sub.i and corresponding padded packets p.sub.i in the encoder window per equation 1 to form an encoded packet b. Padded packets p.sub.i in the encoder window includes the current padded packet p.sub.R1 and earlier padded packets p.sub.L . . . p.sub.R2 in the encoder window. Block 334 may be followed by block 336.
(55) In block 336, encoder 102 transmits a tuple (L, R, r, b) as a coded packet over communication channel 108. Block 336 may be followed y block 338.
(56) In block 338, encoder 102 increments encoding progress M by the encoding rate. Block 338 may be followed by block 320 to determine if padded packet p.sub.i is to be encoded again.
(57) Demonstration of the Encoding Process
(58)
(59) For the demonstration, assume encoder 102 is to transmit the message Quanta. This message is 6 characters long, and each character is 8 bits according to the ASCII code. Each character in the message may be represented by its low 4 bits followed by its high 4 bits. For example, Q has ASCII code 0x51, which can be represented by the two symbol message 1 5, and the entire message Quanta becomes 1 5 5 7 1 6 14 6 4 7 1 6. Assume this 12 symbol message is divided into notional source packets of random lengths 3, 4, 3, and 2 as shown in Table 1.
(60) TABLE-US-00001 TABLE 1 Packet Length Data 1 3 1 5 5 2 4 7 1 6 14 3 3 6 4 7 4 2 1 6
(61) As the message has been divided into 4-bit symbols, they can be represented as symbols in the GF(16) field. These source packets are sent sequentially to encoder 102.
(62) In
(63) The encoded packets are formed by random linear combinations of padded packets based on the pseudorandom coefficients. Consider two padded packets e and f with two coefficients c.sub.1 and c.sub.2, the linear combination of c.sub.1e+c.sub.2f is calculated according to the rules for Galois field arithmetic.
(64)
(65) Padded packet p.sub.1 is encoded three times. When padded packet p.sub.1 is encoded for the first time, seed r is set to zero (0) so padded packet p.sub.1 is encoded by itself with an identity coefficient so the encoded packet is the same as the padded packet. When padded packet p.sub.1 is encoded each subsequent time, seed r is set to a random number and a pseudorandom coefficient is generated with the PRNG based on seed r. As there are no earlier padded packets p.sub.i in encoder window [1, 2), equation (1) only produces the product of padded packet p.sub.1 and the pseudorandom coefficient. Each time after padded packet p.sub.1 is encoded, encoding progress M is incremented by the encoding rate. Once encoding progress M is greater than the encoder window right boundary R, encoder 102 processes the next source packet.
(66)
(67) Padded packet p.sub.2 is encoded two (2) times. When padded packet p.sub.2 is encoded for the first time, seed r is set to zero (0) so the padded packet is encoded by itself with an identity coefficient so the encoded packet is the same as the padded packet. When padded packet p.sub.2 is encoded for the second time, seed r is set to a random number and two (2) pseudorandom coefficients are generated with the PRNG based on seed r. The products of padded packet p.sub.1, p.sub.2 and the two pseudorandom coefficients are linearly combined per equation (1).
(68)
(69) Padded packet p.sub.3 is encoded two (2) times. When padded packet p.sub.3 is encoded for the first time, seed r is set to zero (0) so the padded packet is encoded by itself with an identity coefficient so the encoded packet is the same as the padded packet. When padded packet p.sub.3 is encoded for the second time, seed r is set to a random number and three (3) pseudorandom coefficients are generated with the PRNG based on seed r. The products of padded packet p.sub.1, p.sub.2, p.sub.3 and the three pseudorandom coefficients are linearly combined per equation (1).
(70)
(71) Padded packet p.sub.3 is encoded two (2) times. When padded packet p.sub.3 is encoded for the first time, seed r is set to zero (0) so the padded packet is encoded by itself with an identity coefficient so the encoded packet is the same as the padded packet. When padded packet p.sub.3 is encoded for the second time, seed r is set to a random number and three (3) pseudorandom coefficients are generated with the PRNG based on seed r. The products of padded packet p.sub.1, p.sub.2, p.sub.3 and the three pseudorandom coefficients are linearly combined per equation (1).
(72) Overview of the Decoder Decoder 110 receives tuples (L.sub.E, R.sub.E, r, b) transmitted by encoder 102 in step 6e and reconstructs source packets. Hereafter variables with the subscript E is the encoder's value the subscript D is the decoder's value. To reconstruct the source packets, decoder 110 maintains a decoding matrix 1100 as shown in
(73) Recall that encoder 102 combines padded packets according to equation (1). Thus, encoder 102 computes B=AX, where A is a matrix of pseudorandom coefficients computed by the PRNG, X is a matrix whose rows are the padded packets (a column vector of padded packets), and B is the matrix computed with equation (1) (a column vector of encoded packets).
(74) In principle, A, B, and X are infinite matrices. Decoder 110, however, keeps only a submatrix A.sub.ij of A for Lj<L+W.sub.D, for some window size W.sub.D. Window size W.sub.D may be set at least as large as the maximum encoder window size W.sub.E, and possibly larger.
(75) When receiving a tuple (L.sub.E, R.sub.E, r, b), decoder 110 reconstructs the coefficients c that were computed by encoder 102 in step 6b, and enters the pseudorandom coefficients c and the encoded packet b as a new row of decoding matrix 1100.
(76) Then decoder 110 reduces decoding matrix 1100 to row-echelon form. A matrix is in row-echelon form if the leading coefficient of a row is strictly to the right of the leading coefficient of all rows above it, where the leading coefficient of a row is the leftmost nonzero entry in the row.
(77) A submatrix of A is said to be decodable up to row M.sub.D if all diagonal entries A.sub.ii are nonzero for i<M.sub.D and if is zero for i<M.sub.D and jM.sub.D. Thus, the matrix
(78)
is decodable up to row 2 but not up to row 3 because of the second coefficient c in the third row cannot be cancelled with the fourth row because the fourth row is not yet populated.
(79) Whenever a submatrix of A is decodable up to row M.sub.D, the first M.sub.D rows may be reduced to the identity via backward substitution, allowing the first M.sub.D padded packets to be decoded.
(80) In examples of the present disclosure, decoder 110 operates via the row-echelon form (REF) plus backward substitution, whereas a conventional decoder reduces the matrix to reduced row echelon form (RREF). The REF may be much better than the RREF in exploiting the banded structure of the matrices used by encoder 102.
(81) Referring to
(82) Operation of the Decoder
(83) Decoder 110 maintains the decoding matrix 1100 as discussed above, with the associated state variables decoder window left boundary L.sub.D and decoding progress M.sub.D that are initially set to encoder window left boundary L.sub.E in the tuple received. Decoder 110 stores rows/columns [L.sub.D, L.sub.D+W.sub.D) of the matrix A, and decoding matrix 1100 is always decoded up to row M.sub.D, and decodable up to row M.sub.D.
(84) When receiving a tuple (L.sub.E, R.sub.E, r, b), the decoder operates as follows:
(85) 1. (Drop old packets) If L.sub.E<L.sub.D stop. The packet is too old to be decoded given decoder window size W.sub.D.
(86) 2. (Adjust decoding window) If R.sub.E>L.sub.D+W.sub.D, set L.sub.D=R.sub.EW.sub.D. After this step, R.sub.E L.sub.D+W.sub.D and the received tuple falls within the decoder window.
(87) 3. (Notification of losses) If M.sub.D<L.sub.D, then notify the user that source packets [M.sub.D, L.sub.D) have been lost, and set M.sub.D:=L.sub.D. The user may be another application, such as a video codec.
(88) 4. (Augment decoding matrix) Generate coefficients c as in step 6b of decoder 102. Add c and b to the first zero row of decoding matrix 1100.
(89) 5. (Reduce to row-echelon form) Reduce A to row-echelon form via elementary row operations. Apply the same row updates to both matrices A and B.
(90) 6. (Batch decode) Let M.sub.D be the maximum integer that matrix A is decodable up to M.sub.Dth row. If M.sub.D>M.sub.D, decode encoded packets in the range [M.sub.D, M.sub.D) via backward substitution.
(91) 7. (Deliver decoded packets) While M.sub.D<M.sub.D do the following: a) The M.sub.Dth row of matrix B contains the M.sub.Dth padded packet p.sub.m. Extract the source packet from padded packet p.sub.m and deliver it to the user. b) Increment M.sub.D.
(92)
(93) In block 1202, decoder 110 sets the maximum decoder window size W.sub.D. Block 1202 may be followed by block 1204.
(94) In block 1204, decoder 110 starts to receive tuples over communication channel 108. Decoder 110 sets the decoder window boundary L.sub.D and decoding progress M.sub.D equal to the encoder window left boundary L.sub.E in the first tuple received, and the decoder window right boundary R.sub.D equal to the encoder window right boundary R.sub.E in the first tupe received. Block 1204 may be followed by block 1206.
(95) In block 1206, decoder 110 starts to loop through the tuples in the order they are received. Block 1206 may be followed by block 1208.
(96) In block 1208, decoder 110 determines if the encoded packet in the tuple is too old for a given decoder window (e.g., L.sub.E<L.sub.D). If so, block 1208 may be followed by block 1210. Otherwise block 1208 may be followed by block 1212.
(97) In block 1210, decoder 110 drops the old encoded packet. Block 1210 may loop back to block 1206 to process the next tuple.
(98) In block 1212, decoder 110 determines if the encoded packet is within the decoder window (e.g., R.sub.E>L.sub.D+W.sub.D). If so, block 1212 may be followed by block 1214. Otherwise block 1212 may be followed by block 1216.
(99) In block 1214, decoder 110 moves the decoder window left boundary L (e.g., set L.sub.D=R.sub.EW.sub.D) so the encoded packet falls within the decoded window. Block 1214 may be followed by block 1216.
(100) In block 1216, decoder 110 determines if any encoded packets older than the current encoded packet have been lost (e.g., M.sub.D<L.sub.D). If so, block 1216 may be followed by block 1218. Otherwise block 1216 may be followed by block 1220.
(101) In block 1218, decoder 110 notifies the user the loss of source packets [M.sub.D, L.sub.D) and set decoding progress M.sub.D equal to decoding window left boundary L.sub.D. Block 1218 may be followed by block 1220.
(102) In block 1220, decoder 110 augments decoding matrix 1100 by generating pseudorandom coefficients c based on seed r received in the tuple and adding pseudorandom coefficients c and encoded packet b as a new row of decoding matrix 1110. Block 1220 may be followed by block 1222.
(103) In block 1222, decoder 110 reduces decoding matrix 1110 to row echelon form. Block 1222 may be followed by block 1224 in
(104) In block 1224, decoder 110 determines if matrix A in decoding matrix 1110 can be further decoded up to a row M.sub.D. For example, decoder 110 determines if matrix A is decodable up to row M.sub.D and then determines if matrix A has been decoded up to row M.sub.D (e.g., M.sub.D>M.sub.D). If matrix A can be further decoded up to row M.sub.D, block 1224 may be followed by block 1226. Otherwise block 1224 may loop back to block 1206 to process the next tuple.
(105) In block 1226, decoder 110 decodes encoded packets in the range of [M.sub.D, M.sub.D). As described above, decoder 110 may use backward substitution to decode the encoded packets. Block 1226 may be followed by block 1228.
(106) In block 1228, decoder 110 determines if there are any source packets decoded from the encoded packets in block 1226 to be delivered to the user (e.g., M.sub.D<M.sub.D). If so, block 1228 may be followed by block 1230. Otherwise block 1228 may loop back to block 1206 to process the next tuple.
(107) In block 1230, decoder 110 retrieves a padded packet from the M.sub.Dth row of matrix B, extracts a source packet from the padded packet, and delivers the source packet to the user. Block 1230 may be followed by block 1232.
(108) In block 1232, decoder 110 increments decoding progress M.sub.D. Block 1232 may loop back to block 1228.
(109) Demonstration of the Decoding Process
(110)
(111) TABLE-US-00002 TABLE 2 L.sub.E R.sub.E r Data 1 2 0 1 3 1 5 5 1 2 477 10 13 10 4 4 1 2 448 2 6 2 10 10 1 3 0 2 4 7 1 6 14 1 3 244 3 11 11 11 13 12 1 4 0 3 3 6 4 7 0 1 4 503 9 6 8 2 13 10 2 5 0 4 2 1 6 0 0 2 5 305 0 1 12 3 1 11
(112) To demonstrate the capabilities of decoder 110 (
(113)
(114)
(115)
A(2,:)=A(2,:)(A(2,0)/A(0,0))*A(0,:)
(116) Note that the notation A(0,:) refers to row 0 of a two dimensional matrix A. Similarly, decoder 110 swaps A(1,:) and A(2,:) by using elementary row operations to interchange rows 1 and 2.
(117) In step 1224, decoder 110 uses elementary row operations to convert the newly decodable rows from row echelon form to reduced row echelon form. Decoder 110 scales A(0,0) by multiplying A(0,0) by a factor 1/A(0,0) such that afterwards A(0,0) will be equal to 1. This is possible because every non-zero element in a field has a multiplicative inverse. Decoder 110 substitutes A(2,2) to clear A(1,2) by multiplying row 2 by the factor A(1,2)/A(2,2) and then subtracted row 2 from row 1. This will set A(1,2) to 0.
(118) The process in step 1224 is called backwards substitution and is to be applied in a sequence from lower right in the matrix to upper left to minimize the amount of work.
(119) When the coefficient section of the decoding matrix has a single 1, then the data part of the coefficient matrix is exactly the padded packet from encoder 102 corresponding to the position of the 1. Reduction to row echelon form ensures that each row of the decoding matrix contains no information about earlier source packets. After rows become decodable, the final backward substitution steps ensure that each row contains no information about later source packets. Thus at that point each decoded row has exactly one source packet that can be read off and delivered.
(120)
(121) Encoder 102 and decoder 110 (
(122) Commercial Applications
(123) The present disclosure may improve the quality of videoconferencing over Wi-Fi or mobile phone networks. Wi-Fi networks have been measured and meaningful packet loss has been observed that could be solved by encoder 102, decoder 110, and the error-correcting code of the present disclosure.
(124) The present disclosure may be applicable to situations where multiple communication paths exist, such as a mobile system with multiple cellular modems.
(125) The present disclosure may be licensed to a mobile carrier (3G/4G etc.) to improve communication between handset and cell tower.
(126) The present disclosure may be provided as a cloud service (using a proxy endpoint in the cloud) to individual customers to improve mobile communication and to provide a multipath solution.
(127) From the foregoing, it will be appreciated that various embodiments of the present disclosure have been described herein for purposes of illustration, and that various modifications may be made without departing from the scope and spirit of the present disclosure. Accordingly, the various embodiments disclosed herein are not intended to be limiting, with the true scope and spirit being indicated by the following claims.