B8ZS SCRAMBLING TECHNIQUE FOR LINE CODING WITH MATLAB CODE FOR ENCODING AND DECODING

B8ZS SCRAMBLING TECHNIQUE FOR LINE CODING WITH MATLAB CODE FOR ENCODING AND DECODING

Basic

Binary 8 Zero Substitution (B8ZS) works in a similar way to AMI by changing poles for each binary 1. Moreover when it found 8 consecutive 0’s it replace them by ‘000VB0VB’. Here, V means violation (same to previous non-zero bit) and B means Balancing (opposite of previous non-zero bit).

Here is an example of B8ZS line coding for bits 10000000010001.

Conversion from bitstream to signal is called encoding.

Conversion from signal to bitstream is called decoding.

Coding With MatLab

For encoding we need the bitstream first. In MatLAB that can be defined as array or we can take input from user. Both ways are given below:

bits = [1 0 1 1 1 0 0 1];

or,

bits = input('prompt');

With bitstream we need bit rate that means how much bit(s) will appear in each second. This can be also defined as a variable or can be taken as input. Normally bit rate is considered as 1 bit per second. So we will define it to 1.

bitrate = 1;

We need a sampling for each bit. So that MatLAB needs to know how much sample point will be appeared for each bit. Low sampling can loss data or cannot define bits accurately. Very high sampling can cause slow your program. Here we will define it as 1000.

n = 1000;

MatLAB needs to know the total time needed for the bitstream. Sometimes total time T may be given or said to take as input. If not then we need to find it by dividing length of bitstream with bitrate.

T = length(bits)/bitrate;

We have a sampling for each bit we have declared previously. Now we need to find total sample point needed for whole bitstream. We can find it by multiplying sample point of each bit with the number of bits as below.

N = n*length(bits);

Now, we need to found time for each sample point. For this we divide the whole time (T) with number of total sample points (N).

dt = T/N;

We are near to the main process. Now we will define the time domain. That is the all values of X-axis. For this we need to declare an array from time 0 to time T by partitioning with dt. That is an array like this.

t = 0:dt:T;

For better performance we need to set all values of the result (amplitue domain) to 0. We can do this task with a build in function zeros().

x = zeros(1,length(t));

Here we need an additional variable to save the previous bit. The previous bit at the first point is given in the problem statement. If not by default we will declare it to 1. Here I am declaring it 1 that is the previous bit had positive voltage.

lastbit = 1;

Here we need another variable for counting number of consecutive 0’s. That is the counter variable. As there is no zero counted at start it is declared as 0.

counter = 0;

Here each bit is checked. If the bit is 0 then counter is increased by 1. In this case there is no need to make any change in amplitude domain because that (x(i)) is by default 0.

Then we will seek for 8 consecutive 0. If counter is equal to 8 that means 8 consecutive zero. Otherwise it will enter in else statement. There it will set the counter value to 0. Because the consecution of 0 is broken. The the value of amplitude domain (x) will be redefined by opposite value of lastbit for that bit. And lastbit will be changed (negated).

If there is found 8 consecutive 0,s then it will enter the if condition (see in code below). And for this case we will start re filling from 7 bit earlier. First three bits of them is filled by 0. Fourth bit is filled with the same value of lastbit. Fifth value will be filled by opposite of lastbit (opposite value of fourth bit) and lastbit will be changed (negated) as changed in graph. Sixth value will be filled by 0. Seventh value will be filled with the same value of last bit (same value of fifth bit). Eighth value (current bit that is passed through condition immediately) will be filled by opposite value of lastbit (opposite value of seventh bit) and lastbit will be changed (negated). As we considered 8 consecutive 0’s. So counter will be redefined 0 again.

for i=1:length(bits)
  if bits(i)==0
    counter = counter + 1;
    if counter==8
      x((i-1-7)*n+1:(i-7)*n) = 0;
      x((i-1-6)*n+1:(i-6)*n) = 0;
      x((i-1-5)*n+1:(i-5)*n) = 0;
      x((i-1-4)*n+1:(i-4)*n) = lastbit;
      x((i-1-3)*n+1:(i-3)*n) = -lastbit;
      lastbit = -lastbit;
      x((i-1-2)*n+1:(i-2)*n) = 0;
      x((i-1-1)*n+1:(i-1)*n) = lastbit;
      x((i-1)*n+1:i*n) = -lastbit;
      lastbit = -lastbit;
      counter = 0;
    end
  else
    counter = 0;
    x((i-1)*n+1:i*n) = -lastbit;
    lastbit = -lastbit;
  end
end

Everything required for encoding is done. We will now plot the result (amplitude domain) on respect to time domain. Here is the plot. Here ‘Linewidth’, 3 means the signal line will be bold three times than original signal.

plot(t, x, 'Linewidth', 3);

Code For Encoding

bits = input('prompt');
bitrate = 1;
n = 1000;
T = length(bits)/bitrate;
N = n*length(bits);
dt = T/N;
t = 0:dt:T;
x = zeros(1,length(t));
counter = 0;
lastbit = 1;
for i=1:length(bits)
  if bits(i)==0
    counter = counter + 1;
    if counter==8
      x((i-1-7)*n+1:(i-7)*n) = 0;
      x((i-1-6)*n+1:(i-6)*n) = 0;
      x((i-1-5)*n+1:(i-5)*n) = 0;
      x((i-1-4)*n+1:(i-4)*n) = lastbit;
      x((i-1-3)*n+1:(i-3)*n) = -lastbit;
      lastbit = -lastbit;
      x((i-1-2)*n+1:(i-2)*n) = 0;
      x((i-1-1)*n+1:(i-1)*n) = lastbit;
      x((i-1)*n+1:i*n) = -lastbit;
      lastbit = -lastbit;
      counter = 0;
    end
  else
    counter = 0;
    x((i-1)*n+1:i*n) = -lastbit;
    lastbit = -lastbit;
  end
end
plot(t, x, 'Linewidth', 3);

For decoding we need a counter that will count how much bit has been decoded. We will define the initial value of the counter to 0.

counter = 0;

Here we also need a variable to store lastbit. We will use the same variable we used in encoding. But as the value of that has been changed so we will define it’s value again.

lastbit = 1;

Now we need a loop again to decode the signal. The loop will run from 1 to length of t. That is same times of total sample point.

In the loop we will test whether t(i) is greater than the counter. If it is true then we will increase the value of counter. Here we will check each bit whether it is equal to lastbit value (Note: We will never assign the value of lastbit variable to 0. So lastbit is either 1 or -1).

If the condition is matched then we found a set of 8 consecutive 0 ‘s. If condition is false program will turn to else statement. There if the bit is 0 we will assign 0 to result(counter). If not (the bit is 1 or -1) we will assign 1 to result(counter) and change (negate) the value of lastbit (because 1 caused a transition while encoding).

If the condition is true that is found any set of 8 consecutive 0’s then we will enter the if statement. Remind that while passing through past three bit we assigned 0 to them (actually they were 0). They are also in our sequence. As the value will be ultimately 0 so there is no need to change them. Just change the current bit and next four bit to 0. That is result(counter) to result(counter). Increase the value of counter by 4 so that at next turn the loop don’t assign any value again to the result array. If 8 zero passed the process will run as before again.

Look the loop below.

for i = 1:length(t)
  if t(i)>counter
    counter = counter + 1;
    if x(i)==lastbit
      result(counter:counter+4) = 0;
      counter = counter + 4;
    else
      if(x(i)==0)
        result(counter) = 0;
      else
        result(counter) = 1;
        lastbit = -lastbit;
      end
    end
  end
end

After this decoding is also done. We need to display it. We can display that by just writing the variable without semi-colon. Or this can shown with disp() function.

disp('B8ZS Decoding:');
disp(result);

Full Code (Encoding and decoding)

bits = input('prompt');
bitrate = 1;
n = 1000;
T = length(bits)/bitrate;
N = n*length(bits);
dt = T/N;
t = 0:dt:T;
x = zeros(1,length(t));
counter = 0;
lastbit = 1;
for i=1:length(bits)
  if bits(i)==0
    counter = counter + 1;
    if counter==8
      x((i-1-7)*n+1:(i-7)*n) = 0;
      x((i-1-6)*n+1:(i-6)*n) = 0;
      x((i-1-5)*n+1:(i-5)*n) = 0;
      x((i-1-4)*n+1:(i-4)*n) = lastbit;
      x((i-1-3)*n+1:(i-3)*n) = -lastbit;
      lastbit = -lastbit;
      x((i-1-2)*n+1:(i-2)*n) = 0;
      x((i-1-1)*n+1:(i-1)*n) = lastbit;
      x((i-1)*n+1:i*n) = -lastbit;
      lastbit = -lastbit;
      counter = 0;
    end
  else
    counter = 0;
    x((i-1)*n+1:i*n) = -lastbit;
    lastbit = -lastbit;
  end
end
plot(t, x, 'Linewidth', 3);
counter = 0;
lastbit = 1;
for i = 1:length(t)
  if t(i)>counter
    counter = counter + 1;
    if x(i)==lastbit
      result(counter:counter+4) = 0;
      counter = counter + 4;
    else
      if(x(i)==0)
        result(counter) = 0;
      else
        result(counter) = 1;
        lastbit = -lastbit;
      end
    end
  end
end
disp('B8ZS Decoding:');
disp(result);

I think, your experience with this tutorial is quite good. You can notify me anything related to this tutorial via comment or contact form.

Thanks.

Leave a Reply

Your email address will not be published. Required fields are marked *