Friday 24 January 2014

16 QAM simulation in MATLAB

Introduction

QAM is a method for using a single channel as two separate channels that are orthogonal to each other. The information is divided into Inphase and Quadrature components. The outputs of both modulators are algebraically summed and the result is then transmitted. Due to the orthogonal characteristics of the two channels, the Inter Symbol Interference, ISI between the Inphase and the Quadrature components is reduced. This ensures the transmission with reduced probability of bit error, which is the desired objective for the establishment of error free communication system.
Using the MATLAB Communication Tool Box the channel is modeled with Additive White Gaussian Noise (AWGN). That gets added with the information signal sent from the transmitter with in the channel. As this corrupted data is received at the receiver, the signal is demodulated first. Then we shall do error analysis that will include the use of Eye Diagrams and Scatter Plots. Constellation Diagrams will be used for the decision making.
QAM Modulator



QAM Demodulator
The motivation for using QAM in wireless communication comes from the fact that Double Side Band AM occupy twice the bandwidth requirement for Base band signals. This disadvantage can be overcome by using Quadrature Amplitude Modulation (QAM). In QAM two DSB signals are transmitted using the carrier of the same frequency but in Phase Quadrature. Both the halves are used, thus the bandwidth efficiency is increased. With this scheme we can transmit at twice the symbol rate as compared to a simple base band communication system. As shown in Fig 1 the two input signals are to be transmitted. The 1st input ‘m1(t)’is multiplied by cosω1t to get the ‘I’ component and the 2nd input ’m2(t)is’ multiplied by sinω2t to get the ‘Q’ Quadrature component which are then added and sent.
The output modulated signal φ(t) is coherently (synchronously) detected at the demodulator side and where the two base band signals are separated and received using two local carriers in phase Quadrature as shown in Fig below

MATLAB Code:

In this modulator, 4 bits are transmitted per symbol, i.e. Rb = 4Rs. Where Rs and Rb are symbol rate and bit rate respectively. The symbols are distributed in four different amplitudes and 12 different phases as shown in the following Fig. 3.

16 QAM constellation Diagram
  1. A random binary data stream is generated. Total number of bits is 1 million at the moment in our matlab code. We can change it to any number by simply changing the variable ‘n’ in our code. 
  2. The binary data is transformed to symbols of 4 bit each. Thus ranging from 0 to 15. Total symbols will be n/4. In our case there are 25000 symbols. 
  3. These symbols are modulated using 16 QAM scheme. We can increase the error performance by increasing the output message frequency, Fs. 
  4. This data stream is transmitted over a channel modeled by Additive White Gaussian Noise. 
  5. The corrupted data is demodulated. 
  6. First we found the Probability of Symbol Error by comparing the symbols transmitted and symbols that are received. 
  7. Then the 25,000 received (demodulated) symbols are reshaped back to 100,000 bits. These received (noisy) bits are compared with the transmitted bits to compute the Probability of Bit Error.
a brief description of MATLAB functions used within code are



16 QAM MATLAB code


clear all; clc;
M = 16; %possible no of messages or symbols
k = log2(M); % no of bits per codeword(symbol)
no_of_bits = 100000; % total no of bits = 100,000
EbNo = 10; %dBs
Fs=2; %output message sampling frequency

%%%%%%%%%%%%%%%%%% The Transmitter%%%%%%%%%%%%%%
x = randint(no_of_bits,1); % 100,000 random binary 1's and 0's
figure;
subplot(211);
stem(x(1:40));% a stem of first 60 bits.
title('(1st 40 out of 100,000) Message Bits');
xlabel('Bits-->'); ylabel('Bit value');

% symbol generation
r=reshape(x,k,length(x)/k)';
xsym=bin2dec(num2str(r));

% Stem of first 10 Symbols
subplot(212);
stem(xsym(1:10));
title('(1st 10 out of 25,000)Message Symbols');
xlabel('Symbols-->'); ylabel('Magnitude');

%%%%%%%%% 16-QAM %%%%%%%%
t_x = dmodce(xsym,1,Fs, 'qask',M);%%%%the transmitted signal, s(t)

%%%%%%%%%%%%%%%%%%%the Channel%%%%%%%%%%%%%%%%%
SNR = EbNo + 10*log10(k);
r_x = awgn(t_x,SNR,'measured');%% the received Signal, r(t)=s(t)+no_of_bits(t)
% Scatter Plot of received signal
h = scatterplot(r_x,1,1);
grid
title('Received Signal Constellation');
axis([-5 5 -5 5]);

%*****************Demodulation*****************************
zT = ddemodce(r_x,1,Fs, 'qask', M);
z_bits = reshape(de2bi(zT,'left-msb').',prod(size(de2bi(zT,'left-msb'))),1); %vector regeneration
figure
stem(z_bits(1:40))
ylim([-0.2 1.2])
xlabel('Bits-->'); ylabel('Bit value');
title('(1st 40 out of 100,000) Received Bits')
disp('Total number of bits transmitted ');
disp(length(x))
[Total_number_of_erroneous_bits_received,Probability_of_bit_error] = biterr(x,z_bits)% the bit error computation
[Total_number_of_erroneous_symbols_received,Probability_of_symbol_error] = symerr(xsym,zT)% the symbol error computation


No comments:

Post a Comment