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