I try to implement the matlab code on BER for QPSK in OFDM over rayleigh channel
(with n taps). However the result is a straight line. There must be something
wrong in my code but I cannot figure it out what is wrong. Could you please help
me to check it. I have to hand the work soon. Please please please help. Thank
you very much.
[QUOTE]clear;
clc;
Nd; % FFT size
Nsd = 48; % Number of data subcarriers 48
Nsp = 4 ; % Number of pilot subcarriers 4
ofdmBW = 20 * 10^6 ; % OFDM bandwidth
%Derived Parameters
deltaF = ofdmBW/N; % MHz/64 = 0.3125 MHz
Tfft = 1/deltaF; % IFFT/FFT period = 3.2us
Tgi = Tfft/4;%Guard interval duration - duration of cyclic prefix
Tsignal = Tgi+Tfft; %duration of QPSK-OFDM symbol
Ncp = N*Tgi/Tfft; %Number of symbols allocated to cyclic prefix
Nst = Nsd + Nsp; %Number of total used subcarriers
nBitsPerSym=2*Nst; %For QPSK the number of Bits per Symbol is double of num of
subcarriers
%Simulation parameters
nSym=2; %Number of OFDM Symbols to transmit (I try to work out in small number
first)
EbN0dB = 0:2:45; % bit to noise ratio
EsN0dB = EbN0dB + 10*log10(Nst/N) + 10*log10(N/(Ncp+N)); % converting to symbol
to noise ratio
simulatedBER = zeros(1,length(EsN0dB));
theoreticalBER = zeros(1,length(EsN0dB));
for i=1:length(EsN0dB),
%-----------
%Transmitter
%-----------
re=rand(1,(nBitsPerSym/2)*nSym)>0.5;
im=rand(1,(nBitsPerSym/2)*nSym)>0.5;
% ----------Modulation---------
%Constellation Mapper
ip = (2*re-1) + j*(2*im-1); %
s1 = (1/sqrt(2))*ip; % normalization of energy to 1
%serial to parallel conversion
s=reshape(s1,nBitsPerSym/2,nSym).';
% Assigning modulated symbols to subcarriers from [-26 to -1, +1 to +26]
X_Freq = [zeros(nSym,6) s(:,[1:Nst/2]) zeros(nSym,1) s(:,[Nst/2+1:Nst])
zeros(nSym,5)] ;
%IFFT block
x_Time = (N/sqrt(Nst))*ifft(fftshift(X_Freq.')).';
%Adding Cyclic Prefix
ofdm_signal=[x_Time(:,N-Ncp+1:N) x_Time];
[rows cols]=size(ofdm_signal);
%-----------
%Channel Modeling
%-----------
nTap = 10;
ht = 1/sqrt(2)*1/sqrt(nTap)*(randn(nSym,nTap) + j*randn(nSym,nTap));
% computing and storing the frequency response of the channel, for use at
recevier
hF = fftshift(fft(ht,64,2));
% convolution of each symbol with the random channel
for jj = 1:nSym
xht(jj,:) = conv(ht(jj,:),ofdm_signal(jj,:));
end
xt1 = xht;
% Concatenating multiple symbols to form a long vector
xt = reshape(xt1.',1,nSym*(80+nTap-1));
% Gaussian noise of unit variance, 0 mean
nt = 1/sqrt(2)*[randn(1,nSym*(80+nTap-1)) + j*randn(1,nSym*(80+nTap-1))];
% Adding noise, the term sqrt(80/64) is to account for the wasted energy due
to cyclic prefix
%yt = sqrt(80/64)*xt + 10^(-EsN0dB(i)/20)*nt;
yt = sqrt(80/64)*xt + 10^(-EsN0dB(i)/20)*nt;
%-----------
%Receiver
%-----------
%Serial to Parallel conversion
r_Parallel=reshape(yt.',89,nSym).';
%Removing cyclic prefix
r_Parallel=r_Parallel(:,Ncp+1:(N+Ncp));
%FFT Block
r_Time = (sqrt(Nst)/N)*fftshift(fft(r_Parallel.')).';
% equalization by the known channel frequency response
yF = r_Time./hF;
%Extracting the data carriers from the FFT output
R_Freq = yF(:,[6+[1:Nst/2] 7+[Nst/2+1:Nst] ]);
%----------------------------------
%--------- QPSK demodulation ------------%
y_re = real(R_Freq); % real
y_im = imag(R_Freq); % imaginary
ipHat(find(y_re < 0 & y_im < 0)) = -1 + -1*j; % iphat= input^ hat
ipHat(find(y_re >= 0 & y_im > 0)) = 1 + 1*j;
ipHat(find(y_re < 0 & y_im >= 0)) = -1 + 1*j;
ipHat(find(y_re >= 0 & y_im < 0)) = 1 - 1*j;
%---------%
numErrors = size(find([ip- ipHat]),2); % couting the number of errors
simulatedBER(i)=numErrors/(nSym*nBitsPerSym);
theorySer_QPSK(i) = erfc(sqrt(0.5*(10.^(EsN0dB(i)/10)))) -
(1/4)*(erfc(sqrt(0.5*(10.^(EsN0dB(i)/10))))).^2;
end
semilogy(EsN0dB,simulatedBER,'r-o','LineWidth',2);
hold on;
semilogy(EsN0dB,theorySer_QPSK,'k*','LineWidth',2);
[/QUOTE]
Please check it for me and let me know which part is wrong here. Thank you so
much in advance.
Here is the result graph.
Please help: BER for QPSK in OFDM over Rayleigh matlab code doesn't work.
Started by ●September 20, 2011