Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

MiMo-OFDM ( I got this code from tis website but the result is wrong) why?

Status
Not open for further replies.

syee

Newbie level 3
Joined
Feb 6, 2019
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
65
can someone tells me why the result shows a straight line not a curve
this is copy of the code that i got online

Code:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%
% Author : Abd-El-Mageed Samy
% Email : [email]amageed.samy@yahoo.com[/email]
% Version : 1.2
% Date : 14th March 2013
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%

% Script for computing the BER of 2x2 MIMO OFDM System
% in Rayleigh Fading Channel with Zero Force Receiver.

% Note : Simulation Parameters are OFDM Specs for the IEEE 802.11a Standard
clc
clear all;
close all;
nFFT = 64; % fft size
nDSC = 52; % number of data subcarriers
nBitPerSym = 52; % number of bits per OFDM symbol (same as the number of subcarriers for BPSK)
nSym = 10^4; % number of symbols
totalBits = 2*nBitPerSym*nSym; % total number of Data Bits
bitsPerBranch = nBitPerSym*nSym; % total number of data Bits in each of the two branches
nTx = 2 ; nRx = 2 ; % 2x2 MIMO System
EbN0dB = [0:10]; % bit to noise ratio
EsN0dB = EbN0dB + 10*log10(nDSC/nFFT) + 10*log10(64/80); % converting Bit Energy into Symbol energy

no_of_error=[];
ratio=[];

for ii = 1:length(EbN0dB)

% ====================>> T R A N S M I T T E R <<====================
cc=rand(1,totalBits);
ipBit = rand(1,totalBits)> 0.5 ; % random 1's and 0's , multiplied by 2 for the two branches of the transmitting Antennas
ipMod = 2*ipBit-1; % BPSK modulation 0 --> -1, 1 --> +1
ipMod1 = ipMod(1,1:bitsPerBranch); % 1st Branch Data


ipMod2 = ipMod(bitsPerBranch+1:totalBits); % 2nd Branch Data
ipMod1 = reshape(ipMod1,nBitPerSym,nSym).'; % 1st Branch grouping into multiple symbols and transposing as Pre-IFFT Stage
ipMod2 = reshape(ipMod2,nBitPerSym,nSym).'; % 2nd Branch grouping into multiple symbols and transposing as Pre-IFFT Stage

% Assigning modulated symbols to subcarriers from [-26 to -1, +1 to +26]
x1F = [zeros(nSym,6) ipMod1(:,[1:nBitPerSym/2]) zeros(nSym,1) ipMod1(:,[nBitPerSym/2+1:nBitPerSym]) zeros(nSym,5)] ;
x2F = [zeros(nSym,6) ipMod2(:,[1:nBitPerSym/2]) zeros(nSym,1) ipMod2(:,[nBitPerSym/2+1:nBitPerSym]) zeros(nSym,5)] ;
% Taking FFT, the term (nFFT/sqrt(nDSC)) is for normalizing the power of transmit symbol to 1 
%x1t = (nFFT/sqrt(nDSC))*ifft(fftshift(x1F.')).';
a=max(max(abs(x1F)));
b=max(max(abs(x2F)));
x1t = ifft(fftshift(x1F.')).';
x1t=x1t./a;
%x2t = (nFFT/sqrt(nDSC))*ifft(fftshift(x2F.')).';
x2t = ifft(fftshift(x2F.')).';
x2t=x2t./b;
c=(nFFT/sqrt(nDSC))*ifft(fftshift(x1F.')).';
% Appending cylic prefix
x1t = [x1t(:,[49:64]) x1t];
x2t = [x2t(:,[49:64]) x2t];

% Generating White Gaussian Noise and the Rayleigh fading Channel parameters
N = 1/sqrt(2)*[randn(nRx,nSym*80) + j*randn(nRx,nSym*80)]; % white gaussian noise, 0dB variance
H = 1/sqrt(2)*[randn(nRx,nTx) + j*randn(nRx,nTx)]; % Rayleigh fading channel

% Adding Noise and Channel
xt = [reshape(x1t,1,nSym*80) ; reshape(x2t,1,nSym*80)]; % Formating & Concatenating the data from both antennas
%yt = sqrt(80/64)*H*xt + 10^(-EsN0dB(ii)/20)*N ; % y = Hx + n // the term sqrt(80/64) is to account for the cyclic prefix
yt = awgn(xt,ii);

% =======================>> R E C E I V E R <<=======================

W = pinv(H); % Pseudo Inverso of the Channel Matrix (Equalization Matrix)

% Pseudo Inverse Matrix is a 2x2 Matrix.
% yt is a 2x8000 Matrix where y1(1x8000) is the first row & y2(2x8000) is the 2nd row.

% Splitting into two Branches and reshaping for FFT
y1t = yt(1,:); 
y2t = yt(2,:);
y1t = reshape(y1t,nFFT+nFFT/4,nSym).'; 
y2t = reshape(y2t,nFFT+nFFT/4,nSym).'; 


% Removing Cyclic Prefix
y1t = y1t(:,[1:nFFT]); % 100 x 64
y2t = y2t(:,[1:nFFT]); % 100 x 64
% Applying FFT and adding the term (sqrt(nDSC)/nFFT) for normalization
y1F = a*fftshift(fft(y1t.')).'; 
y2F = b*fftshift(fft(y2t.')).'; 

% Removing Zeros
y1F = [ y1F(:,7:32) y1F(:,34:59) ];
y2F = [ y2F(:,7:32) y2F(:,34:59) ];

% ---------------------------- EQUALIZATION ----------------------------

% Reshaping to prepare for Equalization
y1F = reshape(y1F.',1,nBitPerSym*nSym);
y2F = reshape(y2F.',1,nBitPerSym*nSym);


Wf = fft(W); % Frequency Response of the Channel's Inverse
yF = [ y1F ; y2F ] ; % Reshaping into a 2x5200 Matrix for Equalization

yHat = Wf*yF ; % Equalization ==> Y = WX

% ---------------------------- DeModulation ----------------------------
ipModHat = real(yHat);
ipModHat = [ ipModHat(1,:) ipModHat(2,:) ];
f=ipModHat;

% +ve value --> 1, -ve value --> -1

ipModHat =  2*floor(ipModHat/2) + 1;
e = 2*floor(ipModHat/2) + 1;
ipModHat(find(ipModHat>1)) = +1;
ipModHat(find(ipModHat<-1)) = -1;

% converting modulated values into bits
ipBitHat = (ipModHat+1)/2;

% counting the errors

[no_of_error(ii),ratio(ii)]=biterr(ipBit , ipBitHat);
end


theoryBer = (1/2)*erfc(sqrt(10.^(EbN0dB/10)));


close all; figure
semilogy(EbN0dB,ratio,'mo-','LineWidth',2);
hold on
semilogy(EbN0dB,theoryBer,'bs-','LineWidth',2);



axis([0 10 10^-5 1])
grid on
legend('simulation' , 'theory');
xlabel('Eb/No, dB')
ylabel('Bit Error Rate')
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top