Self-Learning Tool for LDPC Codes Abhishek Bairwa,

Pisit Vanichchanunt,

Department of Electrical Engineering, Indian Institute of Technology, Delhi, India Email - [email protected]

Department of Electrical and Computer Engineering, King Mongkut's University of Technology, North Bangkok, Thailand

Quynh Le, Apirujee Rungruang, Pruk Sasithong, Lunchakorn Wuttisitttikulkij, Suvit Nakpeerayuth, Department of Electrical Engineering, Chulalongkorn University, Bangkok, Thailand

Piya Kovintavewat, Data Storage Technology Research Center, Nakhon Pathom Rajabhat University, Thailand

Ambar Bajpai, Chairat Phongphanphanee, Department of Computer Engineering, Chulalongkorn University, Bangkok, Thailand Abstract - Low-density parity-check (LDPC) codes belong to a class of linear block codes that attract great attention from both theoretical as well as practical perspective. After two decades of extensive research in academia, there are still ongoing research for various aspects of LDPC codes, such as finding new code construction methods and improving decoding algorithms. LDPC codes have also been applied in modern wireless communication standards, such as IEEE 802.11n/802.11ac, DVB-S2/T2 etc. as their forward error correcting codes to combat against noise and interference. Learning the basic concepts of LDPC codes can be hard and time taking process even for engineering students. Therefore, in this paper, we have developed a software tool for self-learning different aspects of LDPC codes, useful for beginners in channel coding. A prototype of LDPC game was designed as a self-learning tool based on fun loving activities, using step by step procedure to get an idea of LDPC codes for beginners. Keywords — Channel Coding; Game based learning; LDPC Codes; Tanner graph

I. INTRODUCTION LDPC codes were reinvented in 1996 by Mackay and Neal [1] after being ignored for three decades, due to its computational complexity at the time of invention by Gallager in 1962 at MIT laboratory [2]. Since then LDPC codes have developed to become essential error correcting codes which have been successfully adopted in modern communication standards [3-4]. These to perform better than all other existing FEC codes for medium code rate and large block-length codewords in terms of BER performance and decoding complexity. Its performance is falling only 0.0045 dB short of Shannon limit [5]. LDPC codes is defined by a parity-check matrix (H) that is sparse in nature. Alternatively, the codes can also be represented in bipartite graph usually known as Tanner Graph [6]. A regular (j, k), H matrix is a M×N binary matrix having j ones in each column and exactly k ones in each row, where j k and { j, k} are small as compared to N for sparse matrices. The code rate will be R 1 ( M / N ) which can

School of Engineering, Avantika University, Ujjain, India

equivalent then to R 1 ( j / k ) , assuming the M rows are linearly independent. As the theoretical concept of LDPC codes is rather complicated, many undergraduate students in electrical engineering find it difficult to grasp the concept. There are a number of online tutorials and books available which are very comprehensive. Learning through these one-way teaching media can be time consuming and requires tremendous effort. Students may give up in the early stage. Therefore, it is useful to develop an alternative learning tool that students will be able to enjoy while using it by themselves. A software tool has been developed in a form of a game. Our first part of the proposed self-learning tool is composed of five levels, covering important basics of LDPC codes, namely Tanner graph, validation of codes, hard decision decoding, girth and Gallager’s formula. II. OVERVIEW LDPC code belongs to advanced topic and requires much effort to learn basics. Extensive research is still going on in this field after it was reintroduced in 1996 by Mackay and Neal [1]. However, due to its high complexity, some students find it difficult in understanding the topic in early stage and are discouraged to pursue research in this topic. In order to encourage undergraduate students to take interest in this topic and inspire them to continue their study in this field, we have developed a self-learning Tool for learning different aspects of Low-Density Parity-Check (LDPC) codes, which students can learn through interactive and fun activities. The self-learning Tool consist of 5 different levels. The activity in each level is designed to help users learn about some particular concepts. The users will start level 1 and will be allowed to proceed to the next level only after they complete the current level. The aim of each level is as follows: 1. The aim of 1st level of the self-learning tool is to guide the user in the concept of H matrix and the Tanner graph.

2. 3.

4. 5.

After completion of second level, user will be able to learn about validity of a codeword. The 3rd level intends to make user familiar with basics of message passing algorithm and hard decision decoding algorithm of LDPC codes. The user need to resolve what messages will be sent from variable nodes to check nodes and vice versa and have to figure out the valid codeword after each message passing. After the 4th level, user will have the basic idea about the concept of girth. In the 5th level, user will get familiarized with basics of the proof of Gallager’s formula which is used in calculating probability/belief of messages in soft-decision decoding. III. THE LEARNING TOOL

When the Self-learning tool is underway, as in main window (Fig. 1) appears. This main window will have 5 level buttons corresponding to the each level and one exit button. The user can only press the 1st level button to go to first level as all other buttons, except exit button, are disabled at the beginning.

Fig.1.

Fig.2.

1st level window

The 2nd level is aimed to familiarize the user with the validity of codeword. An example of the H matrix and a randomly generated codeword will be shown. The user is supposed to check whether a given codeword is valid or not. If the answer click the cross button. After that submit button can be pressed to submit the answer. The user can proceed to the next level only if the submitted answer is correct.

Main Window

As soon as the user presses the 1st level button, 1st level window (Fig 2) will appear. When the user clears the 1st level then only the next level can be accessed. The user has to clear each level gradually to access next level till the 5th (final). The aim of 1st level of the self-learning tool will be to educate the user about parity-check matrix and Tanner graph. Parity-check matrix (H) will be given to the user and variable nodes and check nodes will be present in the window. The user has to connect the variable nodes with associated check nodes by seeing the given H matrix. If the user has drawn the wrong link by mistake, delete button can be pressed and the link can be deleted by clicking on the line. The main window can be accessed by home button anytime. When the 2nd level button is clicked in main window, a window appears (Fig. 3)

Fig.3.

2nd level

Fig.4.

3rd level

The 3rd level (Fig. 4) intended to make user familiar with basics of message passing algorithm and hard decision decoding algorithm of LDPC codes [7]. Tanner graph representation of the H matrix is shown initially with left and

right arrow buttons. To begin the activity, right arrow button should be pressed to start message passing from bit nodes to check nodes. Fig. 5 shows message passing to the first check node. Next the user must fill blank labels above each check node with a message sent from bit nodes. This can be done by clicking 0/1 toggle buttons on orange lines associated with each check node. The value of the message will appear in the boxes above the check node. Once all the boxes for the first check node are filled, the user can advance to the next check node by clicking the right arrow button. Also left arrow button can be clicked to go to the previous check node. After all message passing from bit nodes to check nodes are completed, right arrow button can be clicked to proceed to the next phase. However the user can go to next phase only if all the messages for all check nodes are correct. If not, the program will allow the user to change the message starting from the first check node.

messages for all bit nodes are correct, then user will enter in the 3rd phase shown in Fig. 7, otherwise the user will remain in the 2nd phase.

Fig.6.

2nd phase of 3rd level

In the third phase all lines disappear and only messages are shown in the boxes. Now the user has to determine a codeword obtained after decoding, by clicking on buttons that appear at the bottom of the screen. Once codeword is selected, the user can press the submit button.

Fig.5.

1st phase of 3rd level

Fig.6 shows message passing from check nodes to bit nodes. Now in the 2nd phase, gray lines and orange lines with buttons appear. Messages corresponding to orange lines have to be selected for the bit node by clicking on the button on orange line. Gray lines are there just to provide help for figuring out the message for the bit node from a check node (connected to that bit node) by considering messages received by that check node from other bit nodes (connected by gray lines) in the first phase. For example Fig 6 shows the stage where messages for 5th bit node from 1st check node and 3rd check node (as only these two checknodes can send message to 5th bit node) have to be figured out. Lines associated with 1st and 3rd check node are shown in gray color but lines which connects these check nodes to 5th bit node are shown in orange color. Message received by 5th bit node from 1st checknode along orange line, should be calculated using messages from bit nodes (which are connected to 1st check node by gray lines) to 1st checknode along gray lines. Similarly, message received by 5th bit node from 3rd checknode along orange line should be figured out. Message selected by clicking button will appear in the boxes below bit nodes. Once finished with one bit node, right arrow button can be clicked to go to next bit node and similarly left arrow button can be used to go to previous bit node. When messages for all bit nodes are filled, right arrow button can be clicked. If

Fig.7.

3rd phase of 3rd level

The main purpose of the 4th level as shown in Fig. 8 is to introduce the concept of girth, which is the minimum cycle length present in an H matrix. In this level a tanner graph will be given and the user has to identify the smallest possible cycle. The user has to click the yellow lines to form a cycle. As soon as a yellow line is clicked, the line will turn to brown and the number shown in the green box located above the tanner graph, which corresponds the length of the smallest cycle, will be decreased. If the number in the box is negative, it indicates that the no. of lines selected are larger than there are in the smallest cycle. Home button can be pressed any time to go to main window.

In the first level, when the user is finished with the Tanner graph, submit button can be pressed. Score (based on the performance of the user) will be displayed after submitting. The user can proceed to the next level only if the score is 100 (Figure 10). The main window will appear and the 2nd level button can be clicked.

Fig.8.

4th level

The aim of the 5th level as shown in Fig. 9 is to show the technique of proving Gallager’s formula which is useful in softdecision decoding. Equations is shown some terms left out. User have to click on the buttons to select appropriate values (from P1, P2, 1-P1 and 1-P2) for left out terms. Home button can be pressed any time to go to main window. Once completed, submit button should be pressed. If the answer is correct, all levels will be cleared and user can go to main window to access any level that the user want to play again, otherwise the use has to repeat the level again.

Fig.11.

Completed 2nd level

If the submitted answer in the second level is correct, a small window (Fig.11) will appear and by clicking right arrow button, user can proceed to the main window with the 3rd level button enabled. After submit button is clicked in third level, score will be shown (Fig. 12) based on the answer submitted. If the score is 100, the main window can be accessed and the 4th level button can be clicked, otherwise the user has to try again.

Fig.9.

5th level

IV. RESULTS

Fig.12.

Completed 3rd level

In the fourth level, once the cycle is selected, submit button should be pressed to evaluate the performance of the user.A small window showing the score (Fig. 13) will appear. If the score is 100, then the 5th level button can be clicked, otherwise the user has to try again. Once all the values are selected for left out terms in 5th level, submit button can be pressed. A window (Fig. 14) showing whether answer is correct or not will appear. If the answer is correct, all levels will be cleared and user can go to the main window to access any level, otherwise have to try again. Fig.10.

Completed 1st level

considered valid and people considered that results like score for each level was appropriate. The common features were easily accessed by users and required minimal explaination. V. CONCLUSION In this paper, a self-learning tool has been developed by using python programming language for learning different aspects of LDPC codes. The self-learning tool has a userfriendly graphical interface which ensures that the user finds it easy to access common features. The interface requires minimal explanation for how to use it. The tool can help undergraduate students to understand the basic concept of LDPC and speed up the learning process in an interactive and progressive manner. Fig.13.

Completed 4th level

ACKNOWLEDGEMENT This work is a part of summer internship of Abhishek Bairwa at Chulalongkorn University, Bangkok, Thailand. It is worth expressing gratitude to Indian Institute of Technology, Delhi, (IIT-D) India for supporting Abhishek to do his summer internship. REFERENCES 1.

2. 3.

4. Fig.14.

Completed 5th level 5.

Validation Test results: The learning tool was tested in Telecommunication System Research Lab (TSRL) and it is verified that people found it fun and interesting tool to learn basics of LDPC codes. The tool was

6. 7.

D. J. C. MacKay and R. M. Neal, “Near Shannon limit performance of low density parity check codes”, Electron. Lett., vol. 32, pp. 1645–1646., Aug. 1996. R. G. Gallager, "Low-density parity-check codes", IRE Trans. Inform. Theory, vol. IT-8, pp. 21-28, Jan 1962. D. J. C. MacKay, “Good error-correcting codes based on very sparse matrices”, IEEE Trans. Inform. Theory, vol. 45, pp. 399-431, Feb. 1999. S. Lin and D. J. Costello, Error control coding: Fundamentals and Applications, 2nd ed. Prentice Hall, 2004. S.-Y. Chung, G. F. Jr., T. Richardson, and R. Urbanke, “On the design of low-density parity-check codes within 0.0045 dB of the Shannon limit”, vol. 47, Feb. 2001, pp. 58 – 60. R. M. Tanner, “A recursive approach to low complexity codes”, IEEE Trans. Inform. Theory, vol. 27, pp. 533-547, May 1998. Bernhard M.J. Leiner, “LDPC Codes – a brief Tutorial” , April 2005

Pisit Vanichchanunt,

Department of Electrical Engineering, Indian Institute of Technology, Delhi, India Email - [email protected]

Department of Electrical and Computer Engineering, King Mongkut's University of Technology, North Bangkok, Thailand

Quynh Le, Apirujee Rungruang, Pruk Sasithong, Lunchakorn Wuttisitttikulkij, Suvit Nakpeerayuth, Department of Electrical Engineering, Chulalongkorn University, Bangkok, Thailand

Piya Kovintavewat, Data Storage Technology Research Center, Nakhon Pathom Rajabhat University, Thailand

Ambar Bajpai, Chairat Phongphanphanee, Department of Computer Engineering, Chulalongkorn University, Bangkok, Thailand Abstract - Low-density parity-check (LDPC) codes belong to a class of linear block codes that attract great attention from both theoretical as well as practical perspective. After two decades of extensive research in academia, there are still ongoing research for various aspects of LDPC codes, such as finding new code construction methods and improving decoding algorithms. LDPC codes have also been applied in modern wireless communication standards, such as IEEE 802.11n/802.11ac, DVB-S2/T2 etc. as their forward error correcting codes to combat against noise and interference. Learning the basic concepts of LDPC codes can be hard and time taking process even for engineering students. Therefore, in this paper, we have developed a software tool for self-learning different aspects of LDPC codes, useful for beginners in channel coding. A prototype of LDPC game was designed as a self-learning tool based on fun loving activities, using step by step procedure to get an idea of LDPC codes for beginners. Keywords — Channel Coding; Game based learning; LDPC Codes; Tanner graph

I. INTRODUCTION LDPC codes were reinvented in 1996 by Mackay and Neal [1] after being ignored for three decades, due to its computational complexity at the time of invention by Gallager in 1962 at MIT laboratory [2]. Since then LDPC codes have developed to become essential error correcting codes which have been successfully adopted in modern communication standards [3-4]. These to perform better than all other existing FEC codes for medium code rate and large block-length codewords in terms of BER performance and decoding complexity. Its performance is falling only 0.0045 dB short of Shannon limit [5]. LDPC codes is defined by a parity-check matrix (H) that is sparse in nature. Alternatively, the codes can also be represented in bipartite graph usually known as Tanner Graph [6]. A regular (j, k), H matrix is a M×N binary matrix having j ones in each column and exactly k ones in each row, where j k and { j, k} are small as compared to N for sparse matrices. The code rate will be R 1 ( M / N ) which can

School of Engineering, Avantika University, Ujjain, India

equivalent then to R 1 ( j / k ) , assuming the M rows are linearly independent. As the theoretical concept of LDPC codes is rather complicated, many undergraduate students in electrical engineering find it difficult to grasp the concept. There are a number of online tutorials and books available which are very comprehensive. Learning through these one-way teaching media can be time consuming and requires tremendous effort. Students may give up in the early stage. Therefore, it is useful to develop an alternative learning tool that students will be able to enjoy while using it by themselves. A software tool has been developed in a form of a game. Our first part of the proposed self-learning tool is composed of five levels, covering important basics of LDPC codes, namely Tanner graph, validation of codes, hard decision decoding, girth and Gallager’s formula. II. OVERVIEW LDPC code belongs to advanced topic and requires much effort to learn basics. Extensive research is still going on in this field after it was reintroduced in 1996 by Mackay and Neal [1]. However, due to its high complexity, some students find it difficult in understanding the topic in early stage and are discouraged to pursue research in this topic. In order to encourage undergraduate students to take interest in this topic and inspire them to continue their study in this field, we have developed a self-learning Tool for learning different aspects of Low-Density Parity-Check (LDPC) codes, which students can learn through interactive and fun activities. The self-learning Tool consist of 5 different levels. The activity in each level is designed to help users learn about some particular concepts. The users will start level 1 and will be allowed to proceed to the next level only after they complete the current level. The aim of each level is as follows: 1. The aim of 1st level of the self-learning tool is to guide the user in the concept of H matrix and the Tanner graph.

2. 3.

4. 5.

After completion of second level, user will be able to learn about validity of a codeword. The 3rd level intends to make user familiar with basics of message passing algorithm and hard decision decoding algorithm of LDPC codes. The user need to resolve what messages will be sent from variable nodes to check nodes and vice versa and have to figure out the valid codeword after each message passing. After the 4th level, user will have the basic idea about the concept of girth. In the 5th level, user will get familiarized with basics of the proof of Gallager’s formula which is used in calculating probability/belief of messages in soft-decision decoding. III. THE LEARNING TOOL

When the Self-learning tool is underway, as in main window (Fig. 1) appears. This main window will have 5 level buttons corresponding to the each level and one exit button. The user can only press the 1st level button to go to first level as all other buttons, except exit button, are disabled at the beginning.

Fig.1.

Fig.2.

1st level window

The 2nd level is aimed to familiarize the user with the validity of codeword. An example of the H matrix and a randomly generated codeword will be shown. The user is supposed to check whether a given codeword is valid or not. If the answer click the cross button. After that submit button can be pressed to submit the answer. The user can proceed to the next level only if the submitted answer is correct.

Main Window

As soon as the user presses the 1st level button, 1st level window (Fig 2) will appear. When the user clears the 1st level then only the next level can be accessed. The user has to clear each level gradually to access next level till the 5th (final). The aim of 1st level of the self-learning tool will be to educate the user about parity-check matrix and Tanner graph. Parity-check matrix (H) will be given to the user and variable nodes and check nodes will be present in the window. The user has to connect the variable nodes with associated check nodes by seeing the given H matrix. If the user has drawn the wrong link by mistake, delete button can be pressed and the link can be deleted by clicking on the line. The main window can be accessed by home button anytime. When the 2nd level button is clicked in main window, a window appears (Fig. 3)

Fig.3.

2nd level

Fig.4.

3rd level

The 3rd level (Fig. 4) intended to make user familiar with basics of message passing algorithm and hard decision decoding algorithm of LDPC codes [7]. Tanner graph representation of the H matrix is shown initially with left and

right arrow buttons. To begin the activity, right arrow button should be pressed to start message passing from bit nodes to check nodes. Fig. 5 shows message passing to the first check node. Next the user must fill blank labels above each check node with a message sent from bit nodes. This can be done by clicking 0/1 toggle buttons on orange lines associated with each check node. The value of the message will appear in the boxes above the check node. Once all the boxes for the first check node are filled, the user can advance to the next check node by clicking the right arrow button. Also left arrow button can be clicked to go to the previous check node. After all message passing from bit nodes to check nodes are completed, right arrow button can be clicked to proceed to the next phase. However the user can go to next phase only if all the messages for all check nodes are correct. If not, the program will allow the user to change the message starting from the first check node.

messages for all bit nodes are correct, then user will enter in the 3rd phase shown in Fig. 7, otherwise the user will remain in the 2nd phase.

Fig.6.

2nd phase of 3rd level

In the third phase all lines disappear and only messages are shown in the boxes. Now the user has to determine a codeword obtained after decoding, by clicking on buttons that appear at the bottom of the screen. Once codeword is selected, the user can press the submit button.

Fig.5.

1st phase of 3rd level

Fig.6 shows message passing from check nodes to bit nodes. Now in the 2nd phase, gray lines and orange lines with buttons appear. Messages corresponding to orange lines have to be selected for the bit node by clicking on the button on orange line. Gray lines are there just to provide help for figuring out the message for the bit node from a check node (connected to that bit node) by considering messages received by that check node from other bit nodes (connected by gray lines) in the first phase. For example Fig 6 shows the stage where messages for 5th bit node from 1st check node and 3rd check node (as only these two checknodes can send message to 5th bit node) have to be figured out. Lines associated with 1st and 3rd check node are shown in gray color but lines which connects these check nodes to 5th bit node are shown in orange color. Message received by 5th bit node from 1st checknode along orange line, should be calculated using messages from bit nodes (which are connected to 1st check node by gray lines) to 1st checknode along gray lines. Similarly, message received by 5th bit node from 3rd checknode along orange line should be figured out. Message selected by clicking button will appear in the boxes below bit nodes. Once finished with one bit node, right arrow button can be clicked to go to next bit node and similarly left arrow button can be used to go to previous bit node. When messages for all bit nodes are filled, right arrow button can be clicked. If

Fig.7.

3rd phase of 3rd level

The main purpose of the 4th level as shown in Fig. 8 is to introduce the concept of girth, which is the minimum cycle length present in an H matrix. In this level a tanner graph will be given and the user has to identify the smallest possible cycle. The user has to click the yellow lines to form a cycle. As soon as a yellow line is clicked, the line will turn to brown and the number shown in the green box located above the tanner graph, which corresponds the length of the smallest cycle, will be decreased. If the number in the box is negative, it indicates that the no. of lines selected are larger than there are in the smallest cycle. Home button can be pressed any time to go to main window.

In the first level, when the user is finished with the Tanner graph, submit button can be pressed. Score (based on the performance of the user) will be displayed after submitting. The user can proceed to the next level only if the score is 100 (Figure 10). The main window will appear and the 2nd level button can be clicked.

Fig.8.

4th level

The aim of the 5th level as shown in Fig. 9 is to show the technique of proving Gallager’s formula which is useful in softdecision decoding. Equations is shown some terms left out. User have to click on the buttons to select appropriate values (from P1, P2, 1-P1 and 1-P2) for left out terms. Home button can be pressed any time to go to main window. Once completed, submit button should be pressed. If the answer is correct, all levels will be cleared and user can go to main window to access any level that the user want to play again, otherwise the use has to repeat the level again.

Fig.11.

Completed 2nd level

If the submitted answer in the second level is correct, a small window (Fig.11) will appear and by clicking right arrow button, user can proceed to the main window with the 3rd level button enabled. After submit button is clicked in third level, score will be shown (Fig. 12) based on the answer submitted. If the score is 100, the main window can be accessed and the 4th level button can be clicked, otherwise the user has to try again.

Fig.9.

5th level

IV. RESULTS

Fig.12.

Completed 3rd level

In the fourth level, once the cycle is selected, submit button should be pressed to evaluate the performance of the user.A small window showing the score (Fig. 13) will appear. If the score is 100, then the 5th level button can be clicked, otherwise the user has to try again. Once all the values are selected for left out terms in 5th level, submit button can be pressed. A window (Fig. 14) showing whether answer is correct or not will appear. If the answer is correct, all levels will be cleared and user can go to the main window to access any level, otherwise have to try again. Fig.10.

Completed 1st level

considered valid and people considered that results like score for each level was appropriate. The common features were easily accessed by users and required minimal explaination. V. CONCLUSION In this paper, a self-learning tool has been developed by using python programming language for learning different aspects of LDPC codes. The self-learning tool has a userfriendly graphical interface which ensures that the user finds it easy to access common features. The interface requires minimal explanation for how to use it. The tool can help undergraduate students to understand the basic concept of LDPC and speed up the learning process in an interactive and progressive manner. Fig.13.

Completed 4th level

ACKNOWLEDGEMENT This work is a part of summer internship of Abhishek Bairwa at Chulalongkorn University, Bangkok, Thailand. It is worth expressing gratitude to Indian Institute of Technology, Delhi, (IIT-D) India for supporting Abhishek to do his summer internship. REFERENCES 1.

2. 3.

4. Fig.14.

Completed 5th level 5.

Validation Test results: The learning tool was tested in Telecommunication System Research Lab (TSRL) and it is verified that people found it fun and interesting tool to learn basics of LDPC codes. The tool was

6. 7.

D. J. C. MacKay and R. M. Neal, “Near Shannon limit performance of low density parity check codes”, Electron. Lett., vol. 32, pp. 1645–1646., Aug. 1996. R. G. Gallager, "Low-density parity-check codes", IRE Trans. Inform. Theory, vol. IT-8, pp. 21-28, Jan 1962. D. J. C. MacKay, “Good error-correcting codes based on very sparse matrices”, IEEE Trans. Inform. Theory, vol. 45, pp. 399-431, Feb. 1999. S. Lin and D. J. Costello, Error control coding: Fundamentals and Applications, 2nd ed. Prentice Hall, 2004. S.-Y. Chung, G. F. Jr., T. Richardson, and R. Urbanke, “On the design of low-density parity-check codes within 0.0045 dB of the Shannon limit”, vol. 47, Feb. 2001, pp. 58 – 60. R. M. Tanner, “A recursive approach to low complexity codes”, IEEE Trans. Inform. Theory, vol. 27, pp. 533-547, May 1998. Bernhard M.J. Leiner, “LDPC Codes – a brief Tutorial” , April 2005