Some content of this application is unavailable at the moment.
If this situation persist, please contact us atFeedback&Contact
1. (WO2017148375) SYSTEM AND METHOD FOR POLAR ENCODING AND DECODING
Document

Description

Title of Invention 0001   0002   0003   0004   0005   0006   0007   0008   0009   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   0020   0021   0022   0023   0024   0025   0026   0027   0028   0029   0030   0031   0032   0033   0034   0035   0036   0037   0038   0039   0040   0041   0042   0043   0044   0045   0046   0047   0048   0049   0050   0051  

Claims

1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20  

Drawings

0001   0002   0003   0004   0005   0006   0007   0008  

Description

Title of Invention : SYSTEM AND METHOD FOR POLAR ENCODING AND DECODING

[0001]
CROSS-REFERENCE TO RELATED APPLICATIONS
[0002]
This application claims the benefit of U.S. Patent Application No. 15/061,348 titled “SYSTEM AND METHOD FOR POLAR ENCODING AND DECODING” filed on March 4th, 2016, which is incorporated by reference herein in its entirety.

TECHNICAL FIELD

[0003]
The invention relates to Polar codes, and to encoders and decoders for Polar codes.

BACKGROUND

[0004]
Polar codes are based on Kronecker product matrices. is the m-fold Kronecker product of a seed matrix F.
[0005]
SUMMARY
[0006]
According to one aspect of the present invention, there is provided a method comprising: processing a set of K information blocks to produce a blockwise checksum with u blocks, where K>=2, and u>=1, and where each information block or checksum block contains P bits; producing an N-bit input vector with P x K information bits and the P x u blockwise checksum bits, and with N-PK-Pu frozen bits, where N = 2 m where m>=2 ; processing the N-bit input vector to produce a result equivalent to multiplying the input vector by a Polar code generator matrix to produce a codeword; transmitting or storing the codeword.
[0007]
According to another aspect of the present invention, there is provided a method comprising: receiving a word based on a codeword transmitted to the receiver that encodes information blocks and blockwise checksum blocks with a polar encoder; performing decoding of the received word to determine estimated values for the information blocks and the blockwise checksum blocks; calculating blockwise checksum bytes based on the estimated values for the information bytes; comparing the calculated blockwise checksum bytes with the estimated values for the block-wise checksum bytes and if there is a match determining the information bytes have been decoded correctly.
[0008]
According to still another aspect of the present invention, there is provided an apparatus comprising: a blockwise checksum calculator to process a set of K information blocks to produce a blockwise checksum with u blocks, where K>=2, and u>=1, and where each information block or checksum block contains P bits; a polar encoder to produce an N-bit input vector with P x K information bits and the P x u blockwise checksum bits, and with N- (PxK) - (Pxu) frozen bits, where N = 2 m where m>=2, and to processing the N-bit input vector to produce a result equivalent to multiplying the input vector by a Polar code generator matrix to produce a codeword; a transmitting device to transmit the codeword.
[0009]
According to yet another aspect of the present invention, there is provided an apparatus comprising: a receiving device to receive a word based on a transmitted codeword that encodes information blocks and a blockwise checksum blocks with a polar encoder; a polar decoder to decode the received word to determine estimated values for the information blocks and the blockwise checksum blocks; a blockwise checksum calculator to calculate blockwise checksum bytes based on the estimated values for the information bytes, and compare the calculated blockwise checksum bytes with the estimated values for the blockwise checksum bytes and if there is a match determine the information bytes have been decoded correctly.
[0010]
In some embodiments, for one or more of the aspects described above, the blockwise checksum is a Fletcher checksum.
[0011]
In some embodiments, for one or more of the aspects described above, calculating checksum bytes comprises calculating two checksum bytes.
[0012]
In some embodiments, for one or more of the aspects described above, the generator matrix is an m-fold Kronecker product matrix where
[0013]
In some embodiments, for one or more of the aspects described above, the blockwise checksum bits are inserted in relatively reliable positions for the Polar code generator matrix, as defined by a reliability criterion.

BRIEF DESCRIPTION OF THE DRAWINGS

[0014]
Embodiments of the invention will be described in greater detail with reference to the accompanying drawings, in which:
[0015]
FIG. 1 is a diagram showing how a Kronecker product matrix can be produced from a seed matrix;
[0016]
FIG. 2 is a diagram showing an example use of a Polar code generator matrix for producing codewords and a schematic illustration of an example Polar encoder;
[0017]
FIG. 3 is a flow diagram of a method for encoding information using a Polar code;
[0018]
FIG. 4 is a schematic illustration of an example Polar encoder;
[0019]
FIG. 5 is a schematic diagram of a Fletcher Checksum calculator;
[0020]
FIG. 6 is a flow chart of the method performing Polar encoding based on information bits and a Fletcher Checksum;
[0021]
FIG. 7A is a block diagram of an apparatus that performs Polar encoding with a Fletcher Checksum;
[0022]
FIG. 7B is a block diagram of an apparatus that performs Polar decoding with a Fletcher Checksum

DETAILED DESCRIPTION

[0023]
In “Channel Polarization: A Method for Constructing Capacity-Achieving Codes for Symmetric Binary-Input Memoryless Channels” by E. Arikan, IEEE Transactions on Information Theory, vol. 55, no. 7 (July 2009) [Arikan] , a theory relating to “channel polarization” of Polar codes was proved in section IV. Channel polarization is an operation which produces N “synthetic” channels from N independent copies of a binary-input discrete memoryless channel (B-DMC) such that, with increasing values of N, the new synthetic channels are polarized in the sense that their mutual information is either close to 0 (completely noisy channels) or close to 1 (perfectly noiseless channels) . In other words, some bit positions of an input vector provided to an encoder will experience a completely noisy channel, i.e., have a relatively low reliability/low possibility to be correctly decoded when considered independently of other synthetic channels. Some bit positions of an input vector provided to an encoder will experience a very clean channel, i.e., have high possibility/high reliability to be correctly decoded when considered independently of other synthetic channels. In some cases, the reliability of a synthetic channel when considered independently of other synthetic channels may be referred to as the “capacity” of the synthetic channel. An example of channel polarization can be provided that is based on a Kronecker product.
[0024]
If A is an m×n matrix and B is a p×q matrix, then the Kronecker product is the mp×nq block matrix:
[0025]
[0026]
more explicitly:
[0027]
[0028]
Figure 1 shows how a Kronecker product matrix can be produced from a seed matrix G 2102. Shown in Figure 1 are the 2-fold Kronecker product matrix 102 and the 3-fold Kronecker product matrix 104. This approach can be continued to produce m-fold Kronecker product matrix
[0029]
A polar code can be formed from a Kronecker product matrix based on matrix G 2. For a polar code having codewords of length N = 2 m, the generator matrix is An example using Kronecker product matrix to produce codewords of length 8 is depicted in Figure 2. A codeword x is formed by the product of an input vector u and the Kronecker product matrix 104 as indicated at 200. The input vector u is composed of frozen bits and information bits. In the specific example, N=8, so the input vector u is an 8 bit vector, and the codeword x is an 8-bit vector. The input vector has frozen bits in positions 0, 1, 2 and 4, and has information bits at positions 3, 5, 6 and 7. An example implementation of a coder that generates codewords is indicated at 212, where the frozen bits are all set to 0, where circle plus is modulo 2 addition. For the example of Figure 2, an N=8 bit input vector is formed from K=4 information bits and N-K=4 frozen bits. Codes of this form are referred to as Polar codes and the encoder is referred to as a Polar encoder. Decoders for decoding Polar codes are referred to as Polar decoders.
[0030]
A specific example of a Polar code was described above in which the code is based on the m-fold Kronecker product of a specific matrix G 2. The use of this generator matrix results in channel polarization. More generally, any generator matrix that produces a channel polarization effect will be referred to herein as a Polar code generator matrix.
[0031]
In Polar code construction, ideally the information bits are put in the more “reliable” positions of an input vector, and frozen bits (i.e., bits already known to both encoder and decoder) are put in the more “unreliable” positions of the input vector. However, when information is transmitted over a physical channel, the reliability of a given bit position is also a function of the characteristics of the physical channel, such as the erasure rate of the physical channel. In theory, the frozen bits can be set to any value so long as the frozen bits sequence is known to both the encoder and the decoder. In conventional applications, the frozen bits are all set to zero.
[0032]
Cyclic redundancy check (CRC) bits can be included in the input vector to assist in decoding. CRC bits are generated based on the information bits being transmitted. CRC bits are included in reliable positions (i.e. the positions with a reliable channel) . CRC bits may be added to improve polar code performance for short to moderate block length. For a very long block length polar encoder, CRC may not be needed, although it may still be employed. This is because the reliability increases with the size of the block length. Reliability becomes very strong for a very long codeword. In a case where CRC bits are included, an N-bit input vector is formed from K information bits, a u-bit CRC, and N-K-u frozen bits. An example is depicted in Figure 3. Starting with a k-bit information block 300, a u-bit CRC is appended at 302 to produce a vector with the K-bit information block, and the u-bit CRC at 304. At 306, the N-K-u frozen bits are inserted to produce the N-bit input vector with the K-bit information block, and the u-bit CRC and the N-K-u frozen bits, where N is a power of 2. The vector 308 is then multiplied by the Kronecker product matrix at 310 to produce an N-bit codeword 312.
[0033]
An example implementation of a Polar encoder including CRC bits is depicted in schematic form in FIG. 4, where the circle plus symbol represents modulo 2 addition. The encoder produces a codeword 404 from an input vector 402. In the example shown, N=16, K=8, u=2, and there are six frozen bits for a code rate of 0.5. The frozen bits, which are illustrated as having been set to zero, are inserted at positions 0, 1, 2, 4, 9, and 12 of the input vector 402. Information bits, denoted as Info [0] through Info [7] , are provided at positions 3, 5, 6, 7, 8, 10, 11, and 13, respectively, of the input vector 402. Two CRC bits, denoted as CRC [0] and CRC [1] , are provided at positions 14 and 15, respectively, of the input vector 402. The input vector used by an encoder to produce a codeword is sometimes referred to as a message. Acodeword may be transmitted over a channel, and a receiver may, in turn, receive a received word. Due to channel effects mostly noise, the received word are subjected to noise. A decoder attempts to decode the received word to determine information bits in the originally transmitted message.
[0034]
During decoding of a codeword encoded from an input vector, the locations and values of frozen bits in the input vector are treated as known. For descriptive simplicity, bits of the input vector that are not known to the decoder in advance will be referred to as “unknown” bits. For example, the information bits and the CRC bits are unknown bits. A characteristic of conventional Polar decoder is that the unknown bits are decoded sequentially, or the Polar decoding algorithm is based on the successive cancellation. Once a particular decision has been made regarding how an unknown bit is to be decoded, that bit never has chance to be changed or corrected, and the decoder moves on to decoding the next unknown bit. In other words, there is “no going back” . A bit that was set at step i cannot be changed at step j>i. In addition, knowledge of the value of subsequent frozen bits is not taken into account, i.e., subsequent frozen bits, even though known to the decoder, will not help decode the current unknown bit.
[0035]
An embodiment of the invention provides a Polar encoder and decoder that employs a Fletcher checksum. A first step in computing a Fletcher checksum involves dividing a binary data word to be protected from errors into short "blocks" of bits and computing the modular sum of those blocks. As an example, the data may be a message to be transmitted consisting of 136 characters, each stored as an 8-bit byte, making a data word of 1088 bits in total. A convenient block size would be 8 bits, although this is not required. Similarly, a convenient modulus would be 255, although, again, others could be chosen.
[0036]
To perform the first step in computing the Fletcher checksum in this example, a first checksum value which is a simple checksum is computed by determining the modular sum of all the 8-bit bytes of the message, (e.g. by dividing by 255 and keeping only the remainder) . In practice, the modulo operation is performed during the summation to control the size of the result. A second step in computing the Fletcher checksum involves computing a second checksum value. The second checksum is the modular sum of the values produced while calculating the first simple checksum as each block of the data word is added to it. The modulus used is the same. So, for each block of the data word, taken in sequence, the block's value is added to the first checksum and the new value of the first checksum is then added to the second checksum. Both sums start with the value zero (or some other known value) . At the end of the data word, the modulus operator is applied.
[0037]
The first checksum value and the second checksum value are then combined to form the Fletcher checksum value. In some embodiments, this is done by concatenating the two checksum values. This produces a 2-byte checksum in for the described example. In other embodiments, a modular sum of the two values is computed. This produces a 1-byte checksum for the described example. The receiver of the message can re-compute the checksum and compare it to the value received to determine whether the message has been altered by the transmission process.
[0038]
Referring to Figure 5, starting with a K-byte information word 500, a 2-byte Fletcher checksum 502 is computed and appended (or otherwise inserted) to produce a (K+2) -byte word. The K bytes may form part of a larger information stream, and may, for example, include bytes n through n+K of the larger information stream. 2-byte Fletcher checksum includes a C0-byte 504 (the first checksum value described above) , and a C1-byte 506 (the second checksum value described above) . The C0-byte 502 is determined by determining a modulo sum of the K bytes of the codeword. In the illustrated example, an initial C0-byte 507 (set to zero or another known value) is combined at 510 with the first byte. The result is combined at 512 with the second byte, and so on until the result is combined at 514 with the Kth byte to produce the finished value for the C0-byte.
[0039]
The C1-byte 502 is determined by determining a modulo sum of the interim results produced in the determination of the C0-byte. In the illustrated example, an initial C0-byte 215 (set to zero or another known value) is combined at 516 with the first interim result (i.e. the output of 510) . The result is combined at 518 with the second interim result (i.e. the output of 512) , and so on until the result is combined at 520 with final result (i.e. the output of 514) to produce the finished value for the C1-byte.
[0040]
In some embodiments, some or all of the information bits and the Fletcher checksum bits are inserted in to an input vector for polar encoding in positions corresponding with relatively reliable bit positions for the polar code. What constitutes relatively reliable can be defined on an implementation specific basis, for example in terms of a reliability criterion. For example, a P x u bit checksum may be inserted in the P x u most reliable bit positions across the entire input vector. In another example, a P x u bit checksum may be inserted in the bit positions that are within the top W%of all reliabilities, where W is a defined threshold, for example 10%. In some embodiments, the Fletcher checksum bits are inserted following the information bits in most reliable bit positions within a latter portion of the input vector. For example, a 16 bit checksum maybe inserted in the 16 most reliable bit positions in the last quarter of the input vector. More generally, the Fletcher checksum bits do not need to all be together or at the end, so long as the transmitter and receiver know the positions of the Fletcher checksum bits and the information bits. Frozen bits (more generally bits known to both the transmitter and the receiver) may be inserted in relatively unreliable bit positions for the polar code. More generally, the described Fletcher checksum approach can be used to process a set of K information blocks to produce a Fletcher checksum with u blocks, where K>=2, and u>=1, and where each information block or checksum block contains P bits, where P>=2. The blocksize P is 8 in the specific examples described, but other values can be used.
[0041]
Next, an N-bit input vector is produced with PxK information bits and the P x u Fletcher checksum bits in Polar code reliable bit positions, and with N- (PxK) - (Pxu) frozen bits in Polar code reliable bit positions, where N = 2 m where m>=2 . The vector is then encoded with a Polar code encoder, for example by multiplying the vector by an m-fold Kronecker product matrix of previously described G 2.
[0042]
An example encoding method will now be described with reference to Figure 6. Starting with a K-byte information word 600, a u-byte Fletcher checksum is computed. The bits of the Fletcher checksum are inserted at 602 to produce a vector 604 that includes the bits of the K information bytes and the bits of the Fletcher checksum. At 606, the N-8K-8u frozen bits are inserted to produce the N-bit input vector with the K-bytes of information and the u-bytes of Fletcher checksum, where N is 2 m. The vector 608 is then multiplied by the m-fold Kronecker product matrix at 610 to produce an N-bit codeword 612.
[0043]
In an example implementation, , the input vector has K=64 bytes, there are 256 information bits, 16 bits containing a 2-byte Fletcher checksum, and 240 frozen bits for a code rate of 0.5.
[0044]
A polar decoder for decoding a Polar code with Fletcher checksum does not require significant extra complexity compared with a conventional Polar decoder. The decoder decodes treats the checksum bits as unknown information bits, and decodes the information bits and the Fletcher checksum bits, using the known values for the frozen bits in the same way as in conventional Polar decoders. Upon completion, the Fletcher checksum is computed at the receiver and compared to the decoded value for the checksum. If there is a match, there is a high probability that the information bits have been decoded correctly. If there is a match, the decoder may conclude the decoded information bits are correct, and output these bits for further processing in the remainder of the system.
[0045]
Typically the encoder described herein is included as part of an apparatus that includes other components. These might, for example, include a modulator that modulates bits output by the encoder to produce symbols, and a transmitter that transmits the symbols over a channel such as a wireless channel. Similar reverse functionality would be in the receiver together with the decoder. Turning now to example apparatuses for implementing the methods described above, FIG. 7A is a schematic illustration of an apparatus 900 for encoding and transmitting a codeword. Apparatus 900 comprises a Fletcher checksum calculator 903, and a Polar encoder 904 coupled to a transmitting device 906. In the illustrated embodiment, the transmitting device 906 has an antenna 908 for transmitting signals over a wireless channel. In some embodiments, the transmitting device 906 includes a modulator, amplifier, and/or other components of a radio frequency (RF) transmit chain. The Polar encoder 904 receives input 902 comprising information bits and also receives the checksum computed by the Fletcher checksum calculator 903, and is configured to implement a method described above to encode the information bits into a codeword, which is provided to the transmitting device 906 for transmission via the antenna 908.
[0046]
FIG. 7B is a schematic illustration of an apparatus 910 for receiving and decoding a received word. Apparatus 910 comprises a receiving device 914 coupled to a Polar decoder 916 that is in turn coupled to Fletcher checksum calculator 917. In the illustrated embodiment, the receiving device 914 has an antenna 912 for receiving signals from a wireless channel. In some embodiments, the receiving device 914 includes a demodulator, amplifier, and/or other components of a radio frequency (RF) receive chain. The receiving device 914 receives a signal carrying a received word based on a codeword via the antenna 912. The received word is provided to the decoder 916. The Polar decoder 916 and Fletcher checksum calculator 917 are configured to implement a method described above to decode the received word into an output vector consisting of information bits, which is provided as output 918.
[0047]
In some embodiments, a non-transitory computer readable medium comprising instructions for execution by a processor may be provided to control the operation of encoder 904 in FIG. 8A or decoder 916 in FIG. 8B, and/or to otherwise control the execution of methods described above. In some embodiments, the processor being controlled may be a component of a general-purpose computer hardware platform. In other embodiments, the processor may be a component of a special-purpose hardware platform. For example, the processor may be an embedded processor, and the instructions may be provided as firmware. Some embodiments may be implemented by using hardware only. In some embodiments, the instructions for execution by a processor may be embodied in the form of a software product. The software product may be stored in a non-volatile or non-transitory storage medium, which can be, for example, a compact disc read-only memory (CD-ROM) , universal serial bus (USB) flash disk, or a removable hard disk.
[0048]
A specific example of a Polar code has been described in which the code is based on the m-fold Kronecker product of a specific G 2. The result is polarization, as described, in which some bit positions are reliable and others are unreliable. In some embodiments, such a specific Polar code is employed, with the Fletcher checksum as described. More generally the Fletcher checksum can be used in combination with any encoder that results in polarization between a set of reliable bit positions and a set of unreliable bit positions. Any generator matrix that produces this effect will be referred to herein as a Polar code generator matrix.
[0049]
The embodiments described above employ the use of a Fletcher checksum. AFletcher checksum is a specific example of a blockwise checksum, that performs a checksum on blocks of bits for example. That is to say a byte (or even more bits together) –operation is applied on the data to be protected. Examples of Fletcher checksums include Fletcher-16, Fletcher-32 and Fletcher-64, but there are others. More generally, any blockwise checksum can be employed in place of the Fletcher checksum in the embodiments described herein. Another example of a blockwise checksum is an Adler Checksum. This is to be contrasted with a bit-level checker such as a CRC, where a bit-level polynomial is applied on the data-bit to be protected.
[0050]
More generally, any method of encoding or decoding that is mathematically equivalent with the described methods can be employed. For example, once a set of codewords is determined as described herein, many different encoder structures known in the art can be used to encode input data to produce codewords.
[0051]
The previous description of some embodiments is provided to enable any person skilled in the art to make or use an apparatus, method, or processor readable medium according to the present disclosure. Various modifications to these embodiments will be readily apparent to those skilled in the art, and the generic principles of the methods and devices described herein may be applied to other embodiments. Thus, the present disclosure is not intended to be limited to the embodiments shown herein but is to be accorded the widest scope consistent with the principles and novel features disclosed herein.

Claims

[Claim 1]
A method comprising: processing a set of K information blocks to produce a blockwise checksum with u blocks, where K>=2, and u>=1, and where each information block or checksum block contains P bits, where P>=2; producing an N-bit input vector with P x K information bits and the P x u blockwise checksum bits, and with (N-P x K-P x u) frozen bits, where N = 2 mwhere m>=2; processing the N-bit input vector to produce a result equivalent to multiplying the input vectorby a Polar code generator matrixto produce a codeword; transmitting or storing the codeword.
[Claim 2]
The method of claim 1 wherein the blockwise checksum is a Fletcher checksum.
[Claim 3]
The method of claim 1 or claim 2 wherein u = 2 and P=8.
[Claim 4]
The method of any one of claims 1 to 3 wherein the generator matrix is an m-fold Kronecker product matrix where
[Claim 5]
The method of any one of claims 1 to 4 wherein the blockwise checksum bits are inserted in relatively reliable positions for the Polar code generator matrix, as determined by a reliability criterion.
[Claim 6]
The method of any one of claims 1 to 5 wherein the blockwise checksum bits are inserted in positions within the top W% in terms of reliability, where W is a defined threshold.
[Claim 7]
The method of claim 6 wherein W% = 10%.
[Claim 8]
The method of claim 3 wherein computing the Fletcher checksum comprises: computing a first checksum value by determining a modular sum of all the P=8-bit bytes of the set of information blocks; computing a second checksum value by determining a modular sum of interim values produced while calculating the first checksum value as each byte is added; combining the first checksum value and the second checksum value to form the Fletcher checksum value.
[Claim 9]
The method of claim 8 wherein combining first checksum value and the second checksum value to form the Fletcher checksum value comprises concatenating the first checksum value and the second checksum value.
[Claim 10]
The method of claim 9 wherein combining first checksum value and the second checksum value to form the Fletcher checksum value comprises determining a modular sum of the first checksum value and the second checksum value.
[Claim 11]
An apparatus comprising: a blockwise checksum calculator to process a set of K information blocks to produce a blockwise checksum with u blocks, where K>=2, and u>=1, and where each information block or checksum block contains P bits; a polar encoder to produce an N-bit input vector with P x K information bits and the P x u blockwise checksum bits, and with N- (PxK) - (Pxu) frozen bits, where N = 2 m where m>=2, and to processing the N-bit input vector to produce a result equivalent to multiplying the input vector by a Polar code generator matrix to produce a codeword; a transmitting device to transmit the codeword.
[Claim 12]
The apparatus of claim 11 wherein the blockwise checksum is a Fletcher checksum.
[Claim 13]
The apparatus of claim 11 or claim 12 wherein u = 2 and P=8.
[Claim 14]
The apparatus of any one of claims 11 to 13 wherein the generator matrix is an m-fold Kronecker product matrix where
[Claim 15]
The apparatus of any one of claims 11 to 14 wherein the blockwise checksum bits are inserted in relatively reliable positions for the Polar code generator matrix as determined by a reliability criterion.
[Claim 16]
The apparatus of any one of claims 11 to 14 wherein the blockwise checksum bits are inserted in positions within the top W% in terms of reliability, where W is a defined threshold.
[Claim 17]
The apparatus of claim 16 wherein W%= 10%.
[Claim 18]
The apparatus of claim 13 wherein the blockwise checksum calculator computes the Fletcher checksum by: computing a first checksum value by determining a modular sum of all the P=8-bit bytes of the set of information blocks; computing a second checksum value by determining a modular sum of interim values produced while calculating the first checksum value as each byte is added; combining the first checksum value and the second checksum value to form the Fletcher checksum value.
[Claim 19]
The apparatus of claim 18 wherein the blockwise checksum calculator combines the first checksum value and the second checksum value to form the Fletcher checksum value by concatenating the first checksum value and the second checksum value.
[Claim 20]
The method of claim 18 wherein the blockwise checksum calculator combines the first checksum value and the second checksum value to form the Fletcher checksum value by determining a modular sum of the first checksum value and the second checksum value.

Drawings

[ Fig. 0001]  
[ Fig. 0002]  
[ Fig. 0003]  
[ Fig. 0004]  
[ Fig. 0005]  
[ Fig. 0006]  
[ Fig. 0007]  
[ Fig. 0008]