CHAPTER 5
DESIGN AND IMPLEMENTATION
 OF OFFSET TECHNIQUE
 FOR 8-PSK  
Introduction
Simulation Codes
Simulation Results and Analysis
Conclusion
DESIGN AND IMPLEMENTATION OF 
OFFSET TECHNIQUE FOR 8-PSK  
- Introduction
 
- OQPSK
 
Offset quadrature phase-shift keying (OQPSK) is a variant of QPSK. Taking four values of the phase (two bits) at a time to construct a QPSK symbol can allow the phase of the signal to jump by as much as 180° at a time. When the signal is low-pass filtered (as is typical in a transmitter), these phase-shifts result in large amplitude fluctuations, an undesirable quality in communication systems. By offsetting the timing of the odd and even bits by one bit-period, or half a symbol-period, the in-phase and quadrature components will never change at the same time. This will limit the phase-shift to no more than 90° at a time. This yields much lower amplitude fluctuations than non-offset QPSK and is sometimes preferred in practice. The sudden phase-shifts occur about twice as often as for QPSK (since the signals no longer change together), but they are less severe. In other words, the magnitude of jumps is smaller in OQPSK when compared to QPSK.
Same idea can be applied to higher order M-PSK and other linear modulation techniques. In this section 8-Offset phase shift keying (8-OPSK) is implemented using matlab and BER performance of 8-OQPSK is compared with 8-PSK.
- Simulation Codes
 - Offset 8-PSK
 
M = 8;            len = 2048;
x = randi([0 M-1],len, 1);  z = de2bi(x);
 a = z(:,1)'; 	b = z(:,2)';	c = z(:,3)';
a1 = [];		b1 = [];	c1 = [];		x1 = [];
 for p = 1:len
    a1 = [a1 a(p) a(p) a(p)];  b1 = [b1 b(p) b(p) b(p)];	c1 = [c1 c(p) c(p) c(p)];
end
 a1 = [a1 0 0];	b1 = [0 b1 0];	c1 = [0 0 c1];
 for p = 1:3*len+2
    x1 = [221; c1(p) b1(p) a1(p)];
end
 d = bi2de(x1);	 ini_phase = 0;
modmap = zeros(1,8);
modmap(1) = cos(ini_phase + pi/8) +   1i * sin(ini_phase + pi/8);
modmap(2) = cos(ini_phase + 3*pi/8) + 1i * sin(ini_phase + 3*pi/8);
modmap(3) = cos(ini_phase + 7*pi/8) + 1i * sin(ini_phase + 7*pi/8);
modmap(4) = cos(ini_phase + 5*pi/8) + 1i * sin(ini_phase + 5*pi/8);
modmap(5) = cos(ini_phase + 15*pi/8) + 1i * sin(ini_phase + 15*pi/8);
modmap(6) = cos(ini_phase + 13*pi/8) + 1i * sin(ini_phase + 13*pi/8);
modmap(7) = cos(ini_phase + 9*pi/8) + 1i * sin(ini_phase + 9*pi/8);
modmap(8) = cos(ini_phase + 11*pi/8) + 1i * sin(ini_phase + 11*pi/8);
 y = genqammod(d,modmap);
hScope = commscope.ScatterPlot;
update(hScope, y)
- Variant of Offset 8-PSK
 
M = 8; len = 1000;
msg = randi([0 M-1],len,1); 
z = de2bi(msg);
a = z(:,1)'; b = z(:,2)'; c = z(:,3)';
a1 = []; b1 = []; c1 = []; x1 = [];
for p = 1:len
    a1 = [a1 a(p) a(p) a(p)];
    b1 = [b1 b(p) b(p) b(p)];
    c1 = [c1 c(p) c(p) c(p)];
end
a1 = [a1 0]; b1 = [b1 0]; c1 = [0 c1];
for p = 1:3*len+1
    x1 = [221; a1(p) b1(p) c1(p)];
end
d = bi2de(x1); ini_phase = 0;
modmap = zeros(1,8);
modmap(1) = cos(ini_phase + pi/8) +   1i * sin(ini_phase + pi/8);
modmap(2) = cos(ini_phase + 3*pi/8) + 1i * sin(ini_phase + 3*pi/8);
modmap(3) = cos(ini_phase + 7*pi/8) + 1i * sin(ini_phase + 7*pi/8);
modmap(4) = cos(ini_phase + 5*pi/8) + 1i * sin(ini_phase + 5*pi/8);
modmap(5) = cos(ini_phase + 15*pi/8) + 1i * sin(ini_phase + 15*pi/8);
modmap(6) = cos(ini_phase + 13*pi/8) + 1i * sin(ini_phase + 13*pi/8);
modmap(7) = cos(ini_phase + 9*pi/8) + 1i * sin(ini_phase + 9*pi/8);
modmap(8) = cos(ini_phase + 11*pi/8) + 1i * sin(ini_phase + 11*pi/8);
y = genqammod(d,modmap);
hScope = commscope.ScatterPlot;
update(hScope, y);
- Comparison of BER Performance of Offset 8-PSK and
 
 Non-offset 8-PSK
clc; clear all;  close all;
SamplesPerFrame = 120;  maxNumErrs=100; maxNumBits=1e6;
M = 8;
s = RandStream.create('mt19937ar', 'seed',529558);
prevStream = RandStream.setGlobalStream(s);
hInt2Bit1 = comm.IntegerToBit('BitsPerInteger',3,'OutputDataType','uint8');
hBit2Int1 = comm.BitToInteger('BitsPerInteger',3,'OutputDataType','uint8');
hMod = comm.PSKModulator('ModulationOrder',M,'SymbolMapping','gray', ...
                    'PhaseOffset',0,'BitInput',false);
hDemod = comm.PSKDemodulator('ModulationOrder',M,'SymbolMapping','gray', ...
         'PhaseOffset',0,'BitOutput',false,'OutputDataType','uint8', ...
         'DecisionMethod','Hard decision');
hChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
                    'BitsPerSymbol',log2(M),'SignalPower',1);
hphase =  comm.PhaseNoise('Level',[-60 -80],'FrequencyOffset',[20 200]); 
hSymError = comm.ErrorRate; hBitError = comm.ErrorRate; EbNoVec = 0:2:15;                             
SERVec1 = zeros(size(EbNoVec)); BERVec1 = zeros(size(EbNoVec));
SERVec2 = zeros(size(EbNoVec)); BERVec2 = zeros(size(EbNoVec));
txbits = randi([0 1], SamplesPerFrame, 1, 'uint8'); 
for p = 1:length(EbNoVec);
  reset(hSymError);  reset(hBitError);
  hChan.EbNo = EbNoVec(p);
  SER = zeros(3,1); BER = zeros(3,1);                          
  while (BER(2)<maxNumErrs) && (BER(3)<maxNumBits)
    txSym = step(hBit2Int1, txbits); tx = step(hMod, txSym); 
    rx2 = step(hChan, tx);  rx = step(hphase, rx2);
    rxSym = step(hDemod, rx); rxBits = step(hInt2Bit1, rxSym);           
    SER = step(hSymError, txSym, rxSym); BER = step(hBitError, txbits, rxBits);   
  end
  SERVec1(p) = SER(1);  BERVec1(p) = BER(1);
  if (BER(1) <= 1e-4)||(SER(1) <= 1e-4) , break , end
end
release(hphase);    release(hChan);
release(hMod); release(hDemod); release(hInt2Bit1); release(hBit2Int1);
for q = 1:length(EbNoVec);
  reset(hSymError); reset(hBitError);  hChan.EbNo = EbNoVec(q);
  SER = zeros(3,1); BER = zeros(3,1);                          
  while (BER(2)<maxNumErrs) && (BER(3)<maxNumBits)
      b1 = [];  b2 = [];  b3 = [];
for r = 1:length(txbits)/3
    b1 = [b1; txbits(3*r-2);txbits(3*r-2);txbits(3*r-2)];
    b2 = [b2; txbits(3*r-1);txbits(3*r-1);txbits(3*r-1)];
    b3 = [b3; txbits(3*r);txbits(3*r);txbits(3*r)];
end
    b1 = [b1;0;0];  b2 = [0;b2;0];  b3 = [0;0;b3];  tbits = [];
for r = 1 : length(b1)
    tbits = [20bits;b1(r);b2(r);b3(r)];
end
    txSym2 = step(hBit2Int1, tbits);  tx2 = step(hMod, txSym2);                  
    rx3 = step(hChan, tx2); rx4 = step(hphase, rx3);
    rxSym2 = step(hDemod, rx4); rxBits2 = step(hInt2Bit1, rxSym2);           
   SER = step(hSymError, txSym2, rxSym2);BER = step(hBitError, tbits, rxBits2);   
  end
  SERVec2(q) = SER(1);  BERVec2(q) = BER(1);
  if (BER(1) <= 1e-4)||(SER(1) <= 1e-4) , break , end
end
RandStream.setGlobalStream(prevStream);
semilogy(EbNoVec,SERVec1,EbNoVec,SERVec2);  axis([0 15 1e-4 1])
legend  ( '8 PSK', 'OPSK','Location','SouthWest');
xlabel  ( 'Eb/No (dB)' ); ylabel( 'Error Probability' );
title   ( 'Symbol Error Probability' );   grid on;  
semilogy(EbNoVec,BERVec1,EbNoVec,BERVec2);     axis([0 15 1e-4 1])
legend  ( '8 PSK', 'OPSK','Location','SouthWest');
xlabel  ( 'Eb/No (dB)' ); ylabel( 'Error Probability' );
title   ( 'Bit Error Probability' );   grid on;
- Simulation Results
 
Fig. 5.1 Constellation Diagram of Offset 8-PSK
Fig. 5.2 Constellation Diagram of Variant of Offset 8-PSK
Fig. 5.3 Comparison of BER performance of Offset 8-PSK and 8-PSK
- Conclusion
 
In this chapter, it is concluded that that offset techniques can be applied to higher order modulation methods such as 8-PSK which is not mentioned in prior art and from Fig. 5.1, it is observed that by applying offset technique to 8-PSK, signal transition does not goes through the origin. Fig. 5.2 shows the alternative form. Moreover, from Fig. 5.3, it is concluded that BER performance of offset M- PSK (M=8) remains same as normal non-offset M-PSK(M=8).
No comments:
Post a Comment