 Ok, so this is lecture 45, seems like a long course, never ending, course keeps on going. Ok, so we are looking at this model for hard ML decoding, right, the model that I introduced, ok looks like some lots of interesting activity going on there, it's ok. Ok, so the model we had is as follows. You have a message m k bits which you encode as before to get a code word C which is n bits and then instead of going through this exercise of converting to BPSK adding noise and anyway making hard decision symbol wise, you might have an equivalent model where this goes through a binary symmetric channel with probability of error P and this P you can compute from the AWGN model as Q of 1 basically. Ok, so you get a vector B which is once again n bits, ok. I asked you a question about the distribution for B, ok, so if you think about it you have to condition on C, ok. So, conditioned on C, B will be kind of a binomial around C, right, so it will be that kind of a distribution. So, vectors around C will get a certain weight according to that and then you have to add up all those conditioning. So, that's how the distribution will look, ok. So, think about that. So, B is, but B in particular can be any one of the 2 power n possibilities. There is no restriction or anything else, ok. So, this process we also modeled by an error vector which was n bits and this EI was actually the components of this vector E, say E sub i, it was 1 with probability P and 0 with probability 1 minus P, ok. So, that was the way in which we thought. Ok, so now then I claim hard ML decoder is going to output a C hat which is given by this very simple expression argument of minimum over C and C, ok. The code is C, the hamming distance between B and C, ok. So, out of all the received, from the received vector look at all the code words to find out the hamming distance. Pick that one which gave you, which was closest to you in hamming distance. If you have more than 1 once again, you can pick any one, doesn't matter, doesn't change probability. So, this is the ML rule as in it maximizes the or minimizes the probability of error, ok. So, in this setup, ok. So, it's the best, you can't do anything better than that, ok. So, but from an implementation point of view, this could be difficult as in you have no way of prioritizing C, you don't know which C to test first, right. So, instead of doing this, it might be interesting to find E, ok. So, it seems like an, seems like a pointless thing to do, right. Why am I interested in finding E instead of finding C, ok. So, but I gave you a brief explanation for why that may, but that might be beneficial because the distribution on C is anything but uniform, you know, which is most likely and then you know what is more likely. So, you know you can go and sequence. It's a little bit better if you look for E, ok. But if I find E, is that good enough? Have I actually done decoding? No. How do I find C cap from E cap? Yeah, that's all. You know which bits were wrong, right. So, you just go flip those bits, ok. So, the basic thing to keep in mind is instead of finding C cap, we can equivalently set C cap to be B plus E cap and try to find the most likely error, ok. So, try to find the most likely error vector. If you find the most likely error vector, then you XOR it with B element wise to get your most likely transmitted code word, ok. So, that's an equivalent way of doing it, ok. So, once you do this, things become slightly more simple, ok. So, first of all, let me write down, let me write down how this E hat would look, ok. So, what will be an equation for E hat? Ok, so first of all, ok. So, let me not do argument. So, what will I write an equation for E hat, ok, right. So, if you think about it. So, E hat will belong to what? Set of all. Some n bit vectors. So, that what? So, that what should happen? Yeah, B plus V has to be equal to belong to C, ok. So, even though it looks like E hat can be any one of the 2 power n possibilities, given that you received a B, it can be only one of how many possibilities? 2 power k, right, I mean it has to go back to C. So, you can't just add any old error vector you want, ok. So, out of these 2 power k candidate error vectors, which one will you pick? Pick the one with minimum weight, because that's the most likely error vector. So, that's the one we'll pick, ok. So, if you want me to write that carefully, this argument of minimum having weight of V this set, ok. Ok, I'm sorry. Minimum over V in this set weight of V, sorry. Just writing. So, V in this set, what do you minimize? Weight of V, ok. So, you look at all possible error vectors and then pick that one which gave you the least, that error vector of least weight, ok. So, in this form, this decoder becomes very nicely implementable and for the linear code, but specifically we can implement this in the decoder in this form very, very easily, ok. So, that that implementation is called the syndrome decoder, ok. Syndrome decoder for linear codes, ok. I'm going to do this by example for a specific code. The generalization will be very, very trivial. You can do it for any other code, just the same thing. There's no real difficulty, ok. So, the example I'm going to take is really, really simple. I'm going to take this, who I've been putting away. The I comes last, right, in H, ok. So, 1, 0, 1, 1, 1, 0, 0, 1, 1, ok. So, this is a parity check matrix for what are the parameters of this code? N, K and D. What are N, K and D? Of a 6, 3, 3 code, ok. So, remember 6 is the block length. Actually, the number of rows of H is N minus K. So, you should remember that, but in this case, K and N minus K are the same. So, 6, 3, 3 is easy. So, 3 is minimum distance. You can find that also at least, ok. So, now what is my problem? Given that I receive B, I have to find that error vector which will be, which will be of least weight, ok. So, that's what I'm going to find. So, let's write this equation. So, you know, C hat is B plus E hat, ok. So, for a linear code, one can easily solve for the least weight E hat just by using the property that H times C transpose is 0. So, you look at H times C hat transpose. You'll get 0 which will be H times B transpose which will also be H times E hat transpose, ok. So, this set of all V that we had, the set of all error vectors that we had which is very general for a general code, for a linear code it becomes really, really simple, ok. What is this set? This set is exactly all those E hats which will solve this equation, ok. So, remember this can be computed, ok. It can be computed at the receiver, eminently computed at the receiver, right. B, you know, obviously you can compute H times B transpose and that vector is called the syndrome, ok. So, this is called the syndrome. Oh, sorry, sorry, sorry. I wrote this equation very, very wrongly. I am sorry. So, this will imply H B transpose equals H E transpose. I am sorry. This afternoon class always kills me, ok. So, this is equal to H B transpose plus H E cap transpose which will imply obviously H B transpose equals H E transpose. So, this is what I defined as the syndrome and usually it is denoted S, ok, syndrome S which is H times E hat transpose, ok. So, what will be the dimensions of S? 3 times 1, ok. So, it will be a column vector with 3, 3 rows, ok, 3 by 1, ok. So, this is S, ok. So, all the error vectors which are possible have to satisfy this equation and you know S at the receiver, ok. Only those vectors, 6-bit vectors which satisfy this equation are candidate error vectors for you, ok. Out of those candidate error vectors, you have to pick the minimum weight one. So, in fact, it is a linear algebra problem with the kind of a combinatorial twist, ok. The linear algebra is the solution of a linear equation, but you have to find that solution with least number of ones which is not really very clearly specified in linear algebra, right. So, that is what makes this problem more difficult and challenging, ok. So, you have to find that E hat which has least number of ones which will solve this equation, ok. So, let us take an example, ok. Let me stick on to this B here, ok. So, this is my H. Suppose my B is just pick a random guy 1, 1, 0, 1, 1, 0, ok. Suppose this is my B, ok. What is S? Let me see. H times B transpose, 1, 0, 1, ok. So, that seems like the correct answer. I have to now solve for what? Looks like people are quickly finding the answer, but anyway. So, E 1 cap, E 2 cap, E 3 cap, E 4 cap, E 5 cap, E 6 cap. I have to find 6 variables using how many equations? Three equations. So, linear algebra will tell you that the answer is, it has to have three dimensions, ok. So, you think of a three-dimensional answer, but remember it is only a finite vector space. So, there will be only 2 power 3 answers, ok. So, there will be 8 solutions to this equation. It is a set of this system of equations, but which one do you want? I want that solution of minimum weight and the best way of doing this, ok. Once again is to start from the least possibilities and keep eliminating, ok. So, it will be best if the all 0 code words satisfied this equation. Then you know there is no problem, but clearly all 0 will not satisfy, ok. So, all 0 will not satisfy. So, all 0 is eliminated, ok. The next is weight 1 and you can quickly find that there is a weight 1 vector which will give you the answer, ok. So, you see E cap is 1, 0, 0, 0, 0. So, C cap is 0, 1, 0, 1, ok. So, that is syndrome decoding, ok. So, it is very simple, there is nothing in it, ok. So, that is how you do syndrome decoding. So, now you can repeat this for anything else you want, ok. But the problem comes when you do, when you go to larger k and n, ok. Suppose if your n minus k is say 100, right and n is 1000, you cannot do this very easily, ok. So, the numbers will blow up, ok. So, you might say I am starting from 0, the all ones how many weight 1 vectors are there of length n? n, just n. So, 1 plus n does not seem too bad, but then quickly it will go to n choose 2, n choose 3 so on for larger and larger error correcting larger number of errors, it will go to n choose 2, n choose 3 and that sum is fairly large, it grows exponentially in this, in n, ok. So, it is a fairly large, well, at least with a high polynomial degree n, can be very, very large, ok. So, that is the problem. Less than. Less than. So, larger things is it, yeah, you are right, but it depends on where you want to operate, right. So, if your bit error rate needs to be really, really small, then you might have to correct many more errors. So, it is question of how many errors you want to correct, you are right. If you do not want to correct more than 2 errors or if you know for sure more than 2 errors will not happen, yeah, you only incur a quadratic penalty in n, not more than that. So, it is a choice of how many errors you want to correct, ok. So, is this clear? So, hopefully you can repeat this for any other code, ok. So, simple code like this, if I give you a 4 by 7 code, you should be able to write down this equation and do it. So, it is really simple, ok. So, what people do to simplify things further is do something called a syndrome table, ok. So, you solve all these equations ahead of time, ok. And then you keep a table, so that when you get a received vector you compute the syndrome and from the syndrome you can quickly jump to the solution, ok. So, all these things are standard things that are done and if you are really interested in learning more about these things, the lecture notes, actually the lectures of error control coding are also available in my website, ok. All you have to do is go to my website and there will be video lectures link and click that and in the first few lectures I am sure we will cover this in much more detail than you then you will see, ok. So, but for this course this is enough, ok. So, you can correct errors with syndrome decoding. So, the question is how many errors can you correct, ok? How many errors can you correct, ok? So, it seems like a complicated question to ask, ok. So, the way to think about it is you can take a geometric view. Suppose I look at the space of all n bit vectors, ok. A lot of n bit vectors 2 power n of them. How many code words do I have? I have 2 power k code words, ok. So, these are like in two marks here, ok. Now, my error vector gets added on to the code word. So, though I am transmitting only these points I might get any point around it, ok. When more and more errors are made, suppose this is my transmitted code word, ok. When more and more errors are made I will go farther and farther away from my transmitted code word. When will I make an error? When will I decode erroneously? When so many errors have been added that I went closer to another code word, ok. Then I will say the other code word was transmitted. In that case that error vector was not correctable. I added so many errors so that I went from one code word to another code word, ok. So, now you know any two code words are separated at least by? Hamming. Dehamming distance. So, if only if you cross d by 2 roughly can you ever get closer to some other code word. So, if you draw a kind of spheres around each of these code words of radius say t and this t is floor of d minus 1 by 2. You need this d minus 1 by 2 to be precise about the adjustment, ok. So, it is d by 2 you have to be careful about d minus 1 by 2, ok. If you do that then these spheres will not intersect at all, ok. So, if I transmit a code word I will always lie inside this sphere which means I will always come back to the transmitted code word, ok. So, for any code with minimum distance t equals d minus 1 by 2 floor of that is correctable, ok. So, for instance if the minimum distance is 6, right, weight 3 error will not be correctable, right, 3 will take you exactly to the middle point and you have a 50 percent probability of either choosing one code word or the other code word and you can make an error. So, it is not correctable. So, that is deemed as not correctable. So, having an even minimum distance seems like a wasted thing. So, the odd minimum distance only gives you the error correcting capability, ok. So, that is a rough way of thinking about it. So, if you have a minimum distance of 5 you can correct 2 errors for sure, ok. So, this is with t, right, but see number of candidate code words errors you have to consider will be n choose t, right and so that will grow n part t. So, if t increases you pay upon normal penalty in complexity, ok. So, for instance there are codes called Reed-Solomon codes for which this t can become very large, ok. And then you have to come up with a very, very smart way of solving those syndrome equations, ok. So, people have come up with very smart ways of doing it. So, that is why Reed-Solomon codes are very popular. So, you can solve that equation without incurring any of that huge penalty. So, that is quite non-trivial. You can look at the error control codes if you are interested, ok. Alright. So, this is error correcting capability. So, once you know about error correcting capability you can find ultimately what in this course we are interested in what? Probability of error versus EBOR and not that is what I am interested in. So, once you know this error correcting capability N, K and D and you know the correcting capability you can quickly bound loosely the probability of block error at least very easily, ok. So, what will be probability of block error? Remember this P now is probability of block error. So far may not have done that, but in the coding case it is only probability of block error, ok. Because my one symbol is actually what n dimensional it is huge it is one block, ok. So, probability of error roughly can be written as what? Right. So, you have to have at least T plus 1 errors or larger. So, there is ways of writing it. So, if you worry about the constants and all that you have to write a binomial formula, right. Summation and choose K all these things you have to do, but I will say roughly it goes as what? P power what? Can I say roughly the leading factor will be P power T plus 1, ok. So, if you do all the simplifications there might be a constant, ok. Some constant C, but or the leading term will be P power T plus 1, ok, right. So, you will have actually if you look at the binomial expansion you will say n choose T plus 1 P power T plus 1 into 1 minus P power n minus whatever. But anyway if you simplify everything the leading term will be P power T plus 1, ok. So, if you have a error correcting capability T for your code, ok. So, this is for an NK decode. Remember with syndrome decoding with maximum likelihood decoding, ok. So, this is what it goes as. Now this can be written as some constant times Q 1 by sigma to the power T plus 1, ok. So, then you will have to compare this expression with the other expression you had and here you might need the exponential approximation that we had before. So, you see roughly you will have a D by 2 factor, ok. So, because T is D by 2. If you write Q as simply exponential, the numerator you will have a D by 2 around D by 2, ok. So, what do you think the penalty is for soft decoding, hard decoding was a soft decoding. In the soft decoding we did not have a D by 2, right. The gain was some KD by n. Here we seem to have a D by 2. So, roughly the figure of rule of thumb is you will pay a 3 dB penalty in your coding game. A 3 is fairly high, you really won't pay 3, maybe 2 to 3 dB you will pay if you do hard decision, instead of doing soft decision, ok. All right. So, that is a quick way of estimating. Of course, there are so many things that I have ignored here. So, because of that you it won't quite be 3 dB, it will be lesser than that, ok. Ok. So, that is all I want to say about block codes. And if you even if you didn't understand the techniques or did not pay too much attention, important thing to remember is codes give you coding gain and block codes give you coding gain roughly just KD by n in the with some approximations, ok. So, minimum distance is important, you want to have good minimum distance and rate also plays a role, ok. So, this is for block codes, ok. So, in the next 25 minutes or so, I am going to quickly run through an area, begin an area which is called convolutional codes, ok. So, it is slightly different from block codes, but it is also the same concept, ok. But it turns out convolutional codes are described slightly differently. Block codes we described using generator matrix, parity check matrix, syndrome decoder, etc., minimum distance and all that. For convolutional codes, we will do something slightly different in the description. We will use a trellis for the description. Because we are using the trellis, maximum likelihood soft decoding becomes very, very efficient and easy for convolutional codes, ok. Let me not say easy, efficiently implemented for convolutional codes. So, because of that convolutional codes are very, very popular even today. So, pretty much any system, wireless system you pick will always have a convolutional code, ok. So, that is the reason why they are really, really popular, ok. So, that is what we are going to start next. Hopefully, I will be able to finish it in this class, but even if I do not, maybe a little bit of spillover into Monday is not too bad, ok. So, for linear codes, when I introduced linear codes, I said the messages go out, the systematic linear codes. I basically said messages go out first and then you make parities, but we also have a non-systematic version where you keep doing parities, right. So, messages come in, you have k bits of message. Every bit that is sent out is a XOR of chosen subset of the message bits. You take pick a subset of message bits and keep doing it. But a complexity in this situation is for different code word bits, you might have to choose different subsets of the message bits and that is an thing that you have to store at the encoder, right. The encoder has to store the entire P part of the generator matrix at least, or the entire generator matrix in the general case, ok. So, you have to store all that and know what to XOR, ok. So, what people do in convolutional codes is, they kind of build a filter and then let it run at the encoder, ok. So, you build the filter as in there are D flip flops, you shift bits in and then you XOR something out. So, it becomes a linear time invariant system. So, if you had a certain subset of bits which you XORed for getting one output, what will be the next output? Just one delayed version, ok. So, for the encoder, it is really, really absolutely trivial, ok. Is there a question at the end? It is fully unaware of even me stopping and asking them something. I cannot disturb them any further, ok. So, that simplifies complexity a lot, ok. So, particularly in systems where you cannot afford any complexity in your encoding, you want to put a simple encoder which does not have too much memory and this and that. So, this kind of a simple D flip flop implementation becomes very, very popular, ok. So, what we are going to do for convolutional codes is only look at some simple examples, ok. So, and that is good enough. Most of the theory of convolutional codes is built around the simple examples and this very rich, very interesting theory, but we will just look at some examples, ok. So, this is what I am going to do. My message bits are coming in here, ok. So, imagine a stream of bits. Of course, it will be a block and you will start and stop at some time, but imagine a stream of bits coming in. So, maybe I index it as m sub k or some such thing, ok. So, you let it go through, say 2D flip flops. Here is an example, remember. 2D flip flops and you have two XORs here, ok. For the first one, maybe you pick, I mean, you can just do this arbitrarily, but I will just do, you pick these two and for the next one, you pick the new XOR, ok. So, you have one message sequence coming in and you put out two codeword sequences, ok. So, let me use some slightly different notation. This m is a little bit confusing. So, I will use u for the message sequence, ok. So, remember this is basically u of 1, ok. So, I will start with u of 0, u of 0, u of 1, so on, ok. The sequence of bits that are coming in, ok. The first output sequence, I will call it v1, ok. So, v1 and this is once again v1 of 1, v1 of 0, v1 of 1, so on, ok. The second output sequence, I will call v2, again v2 of 0, v2 of 1, so on, ok. So, this is how my encoder works, ok. So, if I have k message bits, how many output bits will I have produced? 2k, maybe a little bit more because of the filtering delay and the memory clearing and all that. So, maybe a little bit more than 2k, but roughly if k is very large, that extra is very, very small. So, k and 2k are quite ok, ok. So, roughly this is a rate half encoder, ok. And then you do what? You seem to be getting two sequences in parallel, but of course, you make them serial and then send it out over BPSK. You do BPSK and then you send it over a channel, you receive it and then you have to do decoding. You get a vector r which you have to decode, ok. So, the only thing that changed was the way I did my, my, what, my encoding, ok. So, what will be the, after this first D flip flop, what will this be? So, if this is Un, ok, at the nth time instant, what will be the value after the first D flip flop? Un minus 1, the one after the second D flip flop, Un minus 2. So, you see V1n has a very, very simple expression. It will be Un plus Un minus 1 plus Un minus 2. Of course, this is modulo 2, ok. So, I am XORing the three of them, ok. So, what about V2n? It will be Un plus Un minus 2, ok. So, it is a very, very simple encoder. It is as simple as it gets. The only thing you need is two D flip flops, ok, which is really, really trivial, ok. So, you see why people who launch satellites, for instance, prefer to have convolutional codes in the satellite, ok. So, the encoding that it does is trivial, ok. And you can imagine a satellite, power is a, power and energy are very seriously constrained resources, ok. So, you have to get everything from the sun. You may or may not get anything, ok. So, this is how a convolutional encoder will look, ok. So, now the convolutional code is a little bit more complicated to define. So, I will not define it. I will simply say this is the convolutional encoder. So, now we have D flip flops. We can quickly do a finite state machine model for the encoder, ok. So, what will be your state? State will be 2 bits, u n minus 1 and u n minus 2. So, how many possible states will there be? Four states, ok. And one input bit and two output bits corresponding to each thing, ok. So, let me make a state diagram here. It is a small state diagram. It is very easy to do. 0 0, 1 0, 0 1, 1 1. You can quickly do several transitions. If you have 0 input, then it is going to be output 0 0. It is the same similar to what we did for the MLSD decoding, right. It is the same type of state diagram. If you get an input 1, what happens? You go to 1 0 and then the output is 1 1, ok. So, from 0 1, if you get an input 0, you come back here and the output is, remember this is my u n minus 1 and this is my u n minus 2. Output is 1 1, ok. And if you get a 1, you go to 1 0, output has to be 0 0, all right. So, if you have 1 0 and you get an input 0, you should go to 0 1. Input 0, you get 0 1, but the output is 1 0. Then if you have input 1, the output would be 0 1, ok. Now, if you have an input 0, it is going to go back to this guy right here. Output is going to be 0 1. Then if you get, looks really ugly, I think. I think you can draw this in a much better way. I think you should have put 1 0 here and 1 1 there anyway. So, 1 0, ok. So, that is my state diagram. Check this once again. I mean, you must have done enough state diagrams like this. So, this should not be anything new, but check it once again. It is very simple. I do a state diagram. So, is that a question? Is it ok? It is ok. So, actually I think it is better to put 1 0 down below and 1 1 on the right and then you will get a much neater picture. So, for some reason I put 1 0 there and picture became really ugly, ok. So, anyway it does not matter. So, you should be comfortable doing this. It is quite simple. There is no big deal here. So, remember what we have now. We have a state diagram description for the encoder. The only information that is missing in the state diagram description is a notion of time. So, how do you bring in the time? You convert it into a trellis diagram, ok. So, you know initially you might have started with all 0 state, right. You convert it into a trellis diagram, bring in the element of time, stage after stage. Whenever you complete, you might want to go back to the all 0 state and you should go back to the all 0 state by terminating, ok. And you push in enough 0s to terminate to go back to the all 0 states. So, you have a trellis description for your encoder. So, now what will happen? Your transmitted symbols which are on each branch of the trellis, ok. So, remember that. Next thing is you go from state diagram to trellis, ok. How will one stage of a trellis look? You have 0 0 0 1 1 0 1 1. The next state once again will be 0 0 0 1 1 0 1 1, ok. So, the transitions will be this way, ok. And you can put, you can fill out all this, all this thing here. It does not really matter. So, this is the stage of the trellis, ok. To each trellis stage, really each trellis stage I have associated a two bits of output codeword and one bit of an input message, ok. So, I have one message bit which is input and these two are output codeword bits, ok. Is that clear? So, I have suppose if I have u of 0 to u of say k minus 1 as inputs. This is the message. The codeword will be what? I will have v 1 0 v 2 0 all the way to v 1 k minus 1 v 2 k minus 1, ok. I will convert each of these guys into bpsk symbols, send them through what? Send them through, send them through additive Gaussian noise and get a vector r. Suppose I have a vector r which is obtained from v, ok. How do I find v cap? The soft ML rule is to find do argument minimization over what, ok. Remember it is trellis now, ok. So, I can say all valid paths in the trellis correspond to a codeword. So, I will simply say minimum over trellis paths of what? I might put modulus r minus v squared, ok. But remember I can once again do the same trick as I did before. I can decompose this as a sum of several branch matrix and associate a branch metric to each branch and then run the witter b to do this problem. So, that is why soft ML decoding is very trivial for the convolutional course, ok. So, I do not want to do witter b again and even the branch matrix also are very, very simple, ok. So, it is just r minus v. So, corresponding to 00 if I received 1.1.8. So, what do you do? Simply do 1.1 minus 1 squared plus 0.8 minus 1 squared. You compute the branch matrix. So, branch matrix are very trivial to compute like same as what you did for the ML SDKs, ok. Once you compute that just run witter b you get the same, ok. So, soft ML decoding becomes implementable as a witter b algorithm, ok. So, this is a major, major, major selling point for convolutional course, ok. So, it is very difficult to come up with block codes where the soft ML decoding is implemented. There is another version called bitwise MAP decoder which is actually more popular today and that can be implemented for both convolutional as well as for block codes, ok. But the ML decoder is quite nasty, ok. So, it is very difficult to do it for block codes and for the, for convolutional codes it is, it is very simple, ok. So, people know how to do witter b, it is been beaten to death by all circuit designers. So, it is readily available today. Any chip you want you can put witter b into it without occupying too much space, well, some space, not too much space. So, people prefer to have witter b decoder. So, all your cell phones have a witter b decoder built, ok. So, it is a very, very popular code, it is out there everywhere. So, convolutional codes are used. So, you can pick up any wireless standard. So, it will have a very simple convolutional code as a mandatory requirement that has to be implemented by everyone who wants to implement the standard, ok. So, I showed you a very simple encoder which had just two states. So, typically this will be six. In today's implementations, convolutional codes people can do up to six states. Now, six, I don't know, memory, length of six d flip flops, ok, which means what? How many states? 64 states. So, 64, this is four state. Typically 64 state is done. The reason is today 64 state witter b is implementable these numbers. Tomorrow if 256 state witter b is implementable, what will happen? People will go to 256 states. Higher the number of states, better the performance will be, ok. So, that is the statement about convolutional codes, ok. They say they are really, really popular, ok. So, doing probability of error analysis is once again possible. So, you can imagine how probability of error analysis will be done. How did we do it for MLSD? Anyone remembers? So, you have to find the error events, right. So, you have to find the error events. So, you can do the same thing here. You have a trellis. Find the minimum weight error events, do Q of error event by 2 sigma, the metric of that error event by 2 sigma, you get a rough estimate, ok. So, that is the big picture level description for convolutional codes, ok. So, that is all I wanted to do for coding. And with that, this course officially comes to an end. But before that, let me just maybe show you some pictures which I probably have. I mean, I should have it. If I do not have it, it will be sad. So, let me see. Ok. So, this picture, I do not know if you can read the file name. Let me see. So, can you see it? How do I zoom here? Can you see? Ok. So, this is a picture of a simulation I did, BER versus EBO and not. Once again, you can see log scale. Maybe you cannot see the scale. This picture is a little bit bad. I think I did some JPEG compression. It became very bad, ok. So, this is in log scale and this is EBO and not in dB. This is for the Hamming code, ok. So, I have an uncoded curve which is the black curve. I do not know if you can say it is the black one. The green curve is the leftmost one which is soft ML decoding, ok. So, soft ML decoding for Hamming codes. How will I do it? I have to do 16 correlations. It is a little bit complicated. You can do it. And the red and the pink curve, which kind of intersects the other black curve is the hard decision decoder. So, you notice a lot of interesting things for the Hamming code. The hard decision decoder is bad for a while and then it becomes good when the when EBO and not becomes really, really large, ok. But the soft one, this is always better. It is way better and you get the gains based on this, ok. So, this is Hamming code. It should have, ok. So, this one is really a comparison of, ok. So, this is from a book, from a book by Johansson and Sri Gangirov. Some convolutional codes. So, it shows once again probability of error versus EBO and not. The uncoded BPSK curve is there. You can read uncoded BPSK. And the other curves are all performance curves for several other block codes. So, you say RS. RS is Reed Solomon, ok. 256 comma 192. That is NNK, ok. But it is NNK in bytes. It is not bits, ok. It is in bytes. So, 256 192 is the RS code, ok. And rate is 3 by 4 and that is the performance curve. So, 10 power minus 6, it hits at around 6 dB EBO and not. And then you have rate half Witter B M equals 6. So, M is the memory. So, if it is M equals 6, then it is a 64 state Witter B decoder. And you see its performance. Around 5 dB it hits 10 power minus 6. So, you see for a long time people thought it is difficult to go below this 5 dB, ok. For a long long time people thought it was very difficult to go and very recent not very recently. It has been nearly 15 years now. When people published a paper saying the turbo codes paper which went very very close to 0, everybody doubted their simulation. So, it was entering so deeply that people doubted the simulation and not the result. But today really 5 dB is not acceptable. You can go very very much lesser than that, ok. So, 5 dB is what Witter B gives you. It is a very simple thing, ok. The other three curves on the left are basically capacity curves. So, those tell you what is the maximum possible for different rates. So, you see for rate half approximately 0 dB you can achieve 10 power minus 6, ok. So, but there is a gap to be bridged and for that you need to know more advanced codes, ok. So, maybe I will show you something. Yeah, I think there is a rate half code. So, this is nasty, I did not want this picture. So, it looks like, ok. So, maybe I will just throw this paper at you, ok. So, this is the paper. There you go. That is the title, ok. So, 0.0045 dB of the Shannon limit. I hope they have the BER plot. That is the BER plot down here on the left. You can see it is BER once again in log scale like I told you. It will be over N naught in dB scale, ok. So, that is what is done. So, this is what you should do. Do not ask why, ok. And you see the Shannon limit curve is there and then you have a lot of lines. And those are actual points that are achieved by simulation, ok. So, less than 0.25 dB of eb over N naught you can achieve 10 power minus 6 BER today, ok. So, that is where coding stands today. So, coding can pretty much take you to a capacity today, ok. That is the story, ok. So, what do we do? All right. So, I think that is the logical end to the course and I do not want to do anything more and maybe we will stop here.