Ici self cancellation in ofdm

Status
Not open for further replies.
i am trying to do ici self cancellation in ofdm
i am implementing the following block diagram for which i have following code.
in this code i am not getting that how to do windowing and frequency equalization
can anyone plz help..


Code:
clear all
nFFT = 16; % fft size
nDSC = 4; % number of data subcarriers
nBitPerSym = 4; % number of bits per OFDM symbol (same as the number of subcarriers for BPSK)
nSym = 10^4; % number of symbols
EbN0dB = [0:10]; % bit to noise ratio
EsN0dB = EbN0dB + 10*log10(nDSC/nFFT) + 10*log10(16/20); % converting to symbol to noise ratio
for ii = 1:length(EbN0dB)
   % Transmitter
   ipBit = rand(1,nBitPerSym*nSym) > 0.5; % random 1's and 0's
   ipMod = 2*ipBit-1; % BPSK modulation 0 --> -1, 1 --> +1
   ipMod = reshape(ipMod,nBitPerSym,nSym).'; % grouping into multiple symbolsa
   % Assigning modulated symbols to subcarriers from [-26 to -1, +1 to +26]
   xF = [ipMod(:,[1:nBitPerSym/4]) zeros(nSym,3) ipMod(:,[(nBitPerSym/4)+1]) zeros(nSym,3) ipMod(:,[(nBitPerSym/4)+2]) zeros(nSym,3) ipMod(:,[(nBitPerSym/4)+3]) zeros(nSym,3)];
   % Taking FFT, the term (nFFT/sqrt(nDSC)) is for normalizing the power of transmit symbol to 1 
   
   xt = (nFFT/sqrt(nDSC))*ifft(fftshift(xF.')).';
   % Appending cylic prefix
   xu = [xt(:,[13:16]) xt];
   % Concatenating multiple symbols to form a long vector
   xv = reshape(xu.',1,nSym*20);
   % Gaussian noise of unit variance, 0 mean
   nt = 1/sqrt(2)*[randn(1,nSym*20) + j*randn(1,nSym*20)];
   % Adding noise, the term sqrt(80/64) is to account for the wasted energy due to cyclic prefix
   yt = sqrt(20/16)*xv + 10^(-EsN0dB(ii)/20)*nt;
   % Receiver
   yt = reshape(yt.',20,nSym).'; % formatting the received vector into symbols
   yt = yt(:,[5:20]); % removing cyclic prefix
   % converting to frequency domain
   yF = (sqrt(nDSC)/nFFT)*fftshift(fft(yt.')).'; 
   yMod = yF(:,[[1:nBitPerSym/4] 3+[nBitPerSym/4+1] 3+[nBitPerSym/4+2] 3+[nBitPerSym/4+3]]); 
   % BPSK demodulation
   % +ve value --> 1, -ve value --> -1
   ipModHat = 2*floor(real(yMod/2)) + 1;
   ipModHat(find(ipModHat>1)) = +1;
   ipModHat(find(ipModHat<-1)) = -1;
   % converting modulated values into bits
   ipBitHat = (ipModHat+1)/2;
   ipBitHat = reshape(ipBitHat.',nBitPerSym*nSym,1).';
   % counting the errors
   nErr(ii) = size(find(ipBitHat - ipBit),2);
end
simBer = nErr/(nSym*nBitPerSym);
theoryBer = (1/2)*erfc(sqrt(10.^(EbN0dB/10)));
close all; figure
semilogy(EbN0dB,theoryBer,'bs-','LineWidth',2);
hold on
semilogy(EbN0dB,simBer,'mx-','LineWidth',2);
axis([0 10 10^-5 1])
grid on
legend('theory', 'simulation');
xlabel('Eb/No, dB')
ylabel('Bit Error Rate')
title('Bit error probability curve for BPSK using OFDM')
 

Attachments

  • Untitled.png
    27.8 KB · Views: 74
Last edited by a moderator:

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…