⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdmce1_mmse.m

📁 这些代码包括ofdm的实现和信道估计,可以运行,有指导程序的说明文档.
💻 M
字号:

% ofdmce1_mmse.m
%
% Simulation program to realize OFDM transmission system
%
% Programmed by T.Yamamura and H.Harada
%
% GI CE GI data GI data...(data 6symbols)
% (CE: Chanel estimation symbol, GI Guard interval)
%
%function[ber,per]=ofdmce1_mmse(snr_in_db)
%********************** preparation part ***************************

para=52;    % Number of parallel channel to transmit (points)
fftlen=64;  % FFT length
noc=53;     % Number of carriers
nd=6;       % Number of information OFDM symbol for one loop
knd=1;      % Number of known channel estimation (CE) OFDM symbol
ml=2;       % Modulation level : QPSK
sr=250000;  % OFDM symbol rate (250 ksyombol/s)
br=sr.*ml;  % Bit rate per carrier
gilen=16;   % Length of guard interval (points)
ebn0=3;     % Eb/N0

%%%%%%%%%%%%% fading initialization %%%%%%%%%%%

tstp=1/sr/(fftlen+gilen); % Time resolution
itau=[0];       % Arrival time for each multipath normalized by tstp 
dlvl1=[0];      % Mean power for each multipath normalized by direct wave.
n0=[6];	        % Number of waves to generate fading n0(1),n0(2)
th1=[0.0];      % Initial Phase of delayed wave
itnd1=[1000];   % set fading counter        	
now1=1;         % Number of directwave + Number of delayed wave
fd=150;         % Maximum Doppler frequency
flat=0;         % Flat or not (see ofdm_fading.m)
itnd0=nd*(fftlen+gilen)*20; % Number of fading counter to skip 
%%%%%%%%%%%%% mmse initialization %%%%%%%%%%%
bita=1/16;
gilen=16;
fftlen=64;
L=gilen;
bita=1/16;% the number of qpsk 
SNR=exp(ebn0*log(10)/10);
tao_rms=L/4;
for m=1:52
    for n=1:52
        if(m==n) R_HH(m,n)=1;
        else 
        %R_HH(m,n)=(1-exp(-L*((1/tao_rms)+2*pi*i*(m-n)/fftlen)))/(tao_rms*(1-exp(-(L/tao_rms)))*(1/tao_rms+2*pi*i*(m-n)/fftlen));
        R_HH(m,n)=(1-exp(-2*pi*i*L*(m-n)/fftlen))/(2*pi*i*L*(m-n)/fftlen);
    end
    end
end
B_inter=zeros(52,52);
for i=1:52
    B_inter(i,i)=bita/SNR;
end
B_inter1=R_HH+B_inter;
B_inter2=inv(B_inter1);
B_inter3=R_HH*B_inter2;

%************************** main loop part **************************

nloop=1000;  % Number of simulation loops

noe = 0;    % Number of error data
nod = 0;    % Number of transmitted data
eop=0;      % Number of error packet
nop=0;      % Number of transmitted packet

%************************** transmitter *****************************
for iii=1:nloop
   
seridata=rand(1,para*nd*ml)>0.5;  %  DC=0

paradata=reshape(seridata,para,nd*ml); %size(51  *  nd*ml)

%-------------- ml modulation ---------------- 

[ich,qch]=qpskmod(paradata,para,nd,ml);
kmod=1/sqrt(2);
ich=ich.*kmod;
qch=qch.*kmod;

% CE data generation
kndata=zeros(1,fftlen);
kndata0=2.*(rand(1,52)>0.5)-1;
kndata(2:27)=kndata0(1:26);
kndata(39:64)=kndata0(27:52);
ceich=kndata; % CE:BPSK
ceqch=zeros(1,64);

%------------- data mapping (DC=0) -----------

[ich1,qch1]=crmapping(ich,qch,fftlen,nd);

ich2=[ceich.' ich1]; % I-channel transmission data
qch2=[ceqch.' qch1]; % Q-channel transmission data

%------------------- IFFT  -------------------

x=ich2+qch2.*i;
y=ifft(x);
ich3=real(y);
qch3=imag(y);


%---------- Gurad interval insertion ---------

fftlen2=fftlen+gilen;
[ich4,qch4]= giins(ich3,qch3,fftlen,gilen,nd+1);

%---------- Attenuation Calculation ----------

spow=sum(ich4.^2+qch4.^2)/nd./para;
attn=0.5*spow*sr/br*10.^(-ebn0/10);
attn=sqrt(attn);


%********************** fading channel ****************************** 
%If you would like to simulate performance under fading, please remove "*"
%from the following four sentenses
[ifade,qfade,ramp,rcos,rsin]=sefade(ich4,qch4,itau,dlvl1,th1,n0,itnd1,now1,length(ich4),tstp,fd,flat);
itnd1 = itnd1+itnd0;  % Updata fading counter
ich4=ifade;
qch4=qfade;

%***************************  Receiver  *****************************
%--------------- AWGN addition --------------- 
[ich5,qch5]=comb(ich4,qch4,attn);
%ich5=ich4;
%qch5=qch4;
%----Perfect fading compensation for one path fading ----
%If you would like to simulate performance under perfect compensation, please remove "*"
%from the following four sentenses
%ifade2=1./ramp.*(rcos(1,:).*ich5+rsin(1,:).*qch5);
%qfade2=1./ramp.*(-rsin(1,:).*ich5+rcos(1,:).*qch5);
%ich5=ifade2;
%qch5=qfade2;

%----------- Guard interval removal ----------
[ich6,qch6]= girem(ich5,qch5,fftlen2,gilen,nd+1);

%------------------  FFT  --------------------
rx=ich6+qch6.*i;
ry=fft(rx);
ich7=real(ry);
qch7=imag(ry);

%-------------- Fading compensation by CE symbol --------------
%
%If you would like to simulate performance under CE-based compensation, please remove "*"
%in this area
%

% preparation known CE data
RT_syb0((1:26),1)=ry((2:27),1);
RT_syb0((27:52),1)=ry((39:64),1);

T_syb=diag(kndata0);
hls1=inv(T_syb)*RT_syb0;
hls=[hls1,hls1,hls1,hls1,hls1,hls1,hls1];
hls_H=hls';
R_hh=hls*hls_H;
B_inter=zeros(52,52);
for i=1:52
    B_inter(i,i)=bita/SNR;
end
B_inter1=R_HH+B_inter;
B_inter2=inv(B_inter1);
B_inter3=R_HH*B_inter2;
H_lmmse1=B_inter3*hls1;
H_lmmse=[H_lmmse1,H_lmmse1,H_lmmse1,H_lmmse1,H_lmmse1,H_lmmse1,H_lmmse1];
ry1((1:26),:)=ry((2:27),:);
ry1((27:52),:)=ry((39:64),:);
rx1=ry1./H_lmmse;
ich7=real(rx1);
qch7=imag(rx1);

%---------- CE symbol removal ----------------

ich8=ich7(:,knd+1:nd+1);
qch8=qch7(:,knd+1:nd+1);
ich9=ich8;
qch9=qch8;

% DC and pilot data removal
%[ich9,qch9]=crdemapping(ich8,qch8,fftlen,nd);

%----------------- demoduration --------------

ich10=ich9./kmod;
qch10=qch9./kmod;
[demodata]=qpskdemod(ich10,qch10,para,nd,ml);   

%--------------  error calculation  ----------

demodata1=reshape(demodata,1,para*nd*ml);
noe2=sum(abs(demodata1-seridata));
nod2=length(seridata);

% calculating PER
if noe2~=0
   eop=eop+1;
else
   eop=eop;
end   
   eop;
   nop=nop+1;
   
% calculating BER
noe=noe+noe2;
nod=nod+nod2;

fprintf('%d\t%e\t%d\n',iii,noe2/nod2,eop);
   
end

per=eop/nop;
ber=noe/nod;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -