I am trying to run a basic ofdm code from 'MIMO-OFDM Wireless Communication with Matlab' book using Matlab but I keep getting a blank simulation page. Can I know what is the problem with the code?

5 views (last 30 days)
%OFDM_basic.m
clear all
NgType=1; %NgType=1/2 for cyclic prefix/zeropadding
if NgType==1, nt='CP'; elseif NgType==2, nt='ZP';
end
Ch=0; %Ch=0/1 for AWGN/multipath channel
if Ch==0, chType='AWGN'; Target_neb=100; else chType='CH'; Target_neb=500; end
figure(Ch+1),clf
PowerdB=[0 -8 -17 -21 -25]; %channel tap power profile 'dB'
Delay=[0 3 5 6 8]; %channel delay 'sample'
Power=10.^(PowerdB/10); %Channel tap power profile 'linear sample'
Ntap=length(PowerdB); %Channel tap number
Lch=Delay(end)+1; %Channel length
Nbps=4; M=2^Nbps; %Modulation order =2//4/6 for QPSK/16QAM/64QAM
Nfft=64; %FFT SIZE
Ng=Nfft/4; %GI(Guard interval)length(Ng= for no GI)
Nsym=Nfft+Ng; %Symbolduration
Nvc=Nfft/4; %Nvc=0: noVC(Virtual Carrier)
Nused=Nfft-Nvc;
EbN0=[0:5:30]; %EbN0
N_iter=1e5; %Number of iterations for each EbN0
Nframe=3; %Number of symbols per frame
sigPow=0; %Signal power initialization
file_name=['OFDM_BER_' chType '_' nt '_''GL' num2str(Ng) '.dat'];
fid=fopen(file_name,'w+');
norms=[1 sqrt(2) 0 sqrt(10) 0 sqrt(42)]; %BPSK 4-QAM 16-QAM
for i=0:length(EbN0)
rng(0,'v5uniform'); rng(0,'v5normal');
Ber2=ber(); %BER initialisation
Neb=0; Ntb=0; %Initialise the number of error/total bits
for m=1:N_iter
%Tx__________________________________________________________________
X=randi(1,Nused*Nframe,M); %bit:integer vector
Xmod=qammod(X,M,0,'gray')/norms(Nbps);
if Ngtype~=2, x_GI=zeros(1,Nframe*Nsym+Ng);
%Extend an OFDM symbol by Ng zeros
end
kk1=[1:Nused/2]; kk2=[Nused/2+1:Nused]; kk3=1:Nfft;kk4=1:Nsym;
for k=1:Nframe
if Nvc~=0, X_shift=[0 Xmod(kk2) zeros(1, Nvc-1) Xmod(kk1)];
else
X_shift=[Xmod(kk2) Xmod(kk1)];
end
x=ifft(X_shift);
x_GI(kk4)=guard_interval(Ng,Nfft,NgType,x);
kk1=kk1+Nused; kk2=kk2+Nused;kk3=kk3+Nfft; kk4=kk4+Nsym;
end
if Ch==0, y=x_GI; %No channel
else %multipath Fading
channel=(randn(1,Ntap)+j*randn(1,Ntap)).*sqrt(Power/2);
h=zeros(1,Lch); h(Delay+1)=channel;%cir:channelimpulse response
y =conv(x_GI,h);
end
if 1i==0 %only to measure signal power for adding AWGN noise
y1= y(1:Nframe*Nsym); sigPow=sigPow+y1*y1'; continue;
end
%Add AWGN noise________________________________________________
snr = EbN0(i)+10*(Nbps*(Nused/Nfft)); %SNR vs Eb/N0 by Eq.(4.28)
noise_mag = sqrt((10.^(-snr/10))*sigPow/2);
y_GI = y+ noise_mag*(randn(size(y)) +1j*randn(size(y)));
%Rx________________________________________________________________________
kk1=(NgType==2)*Ng+[1:Nsym]; kk2=1:Nfft;
kk3=1:Nused; kk4=Nused/2+Nvc+1:Nfft; kk5(Nvc~=0)+[1:Nused/2];
if Ch==1
H=fft([h zeros(1,Nfft-Lch)]); %Channel frequency response
H_shift(kk3)=[H(kk4) H(kk5)];
end
for k=1:Nframe
Y(kk2)= fft(remove_GI(Ng,Nsym,NgType,y_GI(kk1)));
Y_shift= [Y(kk4) Y(kk5)];
if Ch==0, Xmod_r(kk3)=Y_shift;
else
Xmod_r(kk3)= Y_shift./H_shift; %Equaliser-channel compensation
end
kk1=kk1+Nsym; kk2=kk2+Nfft; kk3=kk3+Nused; kk4=kk4+Nfft; kk5=kk5+Nfft;
end
X_r=qammod(Xmod_r*norms(Nbps),M,'gray');
Neb=Neb+sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps)));
Ntb=Ntb+Nused*NFrame*Nbps; %[BER,Neb,Ntb] =ber(bit_Rx,bit,nbps);
if Neb>Target_neb,break;end
end
if 1i==0,sigPow=sigPow/Nsym/Nframe/N_iter;
else
Ber =Neb/ntb;
fprintf('EbN0=%3d[db],BER=%4d/%8d=%11.3e\n', EbN0(1i),Neb,Ntb,Ber)
fprintf(fid,'%d\t%11.3e\n', EbN0(1i), Ber);
if ber<1e6, break; end
end
end
if(fid~=0),fclose(fid); end
plot_ber(file_name,Nbps);
  3 Comments
Walter Roberson
Walter Roberson on 20 Apr 2018
ber and plot_ber are not part of any Mathworks toolbox, and I do not find them in the File Exchange either. I am not finding it via Google either.
Elkor
Elkor on 11 Jul 2018
Edited: Elkor on 11 Jul 2018
First,You have to change to Ber2=Ber(). Second,You have to use routines for GI,BER(PROGRAM 4.3)for their initilatization All routines must be in the same folder as ofdm-basic.m(e.g., guard_interval.m,remove_GI.m,plot_ber.m,function_ber.m,function_Q.m).All credits go to my smart colleague.

Sign in to comment.

Answers (4)

GAJANAND
GAJANAND on 20 Apr 2018

hey krish if you find the solution kindly send on gajanand2007@gmail.com will be thankful


Long Cao
Long Cao on 16 May 2019
hey krish if you find the solution kindly send on zlongcao238@gmail.com will be thankful

Nico
Nico on 19 May 2023
I think the randi-parameters are wrong.
In original code it was
X= randint(1,Nused*Nframe,M); % bit: integer vector
ought to be like
X= randi([0 M-1],Nused*Nframe,1); % bit: integer vector
in recent Matlab.
I get plots, but simulation deviates heavily from analytic result with configuration same as above code. Did anyone get more satisfying results?

廷刚 赵
廷刚 赵 on 10 Jul 2024
I got the result by modifying the code, but there is a deviation from the result in the book

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!