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?
19 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
%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 commentaires
Walter Roberson
le 20 Avr 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
le 11 Juil 2018
Modifié(e) : Elkor
le 11 Juil 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.
Réponses (4)
GAJANAND
le 20 Avr 2018
hey krish if you find the solution kindly send on gajanand2007@gmail.com will be thankful
0 commentaires
Nico
le 19 Mai 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?

2 commentaires
José
le 31 Juil 2023
Hola Nico,
estoy trabajando el mismo código. Si quieres contrastamos resultados.
jose.antonio.saavedra ... gmail.
Saludos!
廷刚 赵
le 10 Juil 2024
I got the result by modifying the code, but there is a deviation from the result in the book
0 commentaires
Voir également
Catégories
En savoir plus sur PHY Components dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!