📄 alamouti_ofdm.m
字号:
%Simulation program to realize Alamouti-OFDM transmission system on
%rayleigh multipath channel
clear all;
%********************** preparation part ***************************
Nt=2; % transmit antenna Nt
Nr=1; % Receive antenna Nr
para=512; % Number of parallel channel to transmit (points)
fftlen=1024; % FFT length
Nc=512; % Number of carrier
frame=10; %number of zheng
average=10;
N_ofdm=4; % Number of information OFDM symbol for per frame
nd=2; % two time slot
level=2; % Modulation level : QPSK
sr=250000; % Symbol rate
br=sr.*level; % Bit rate per carrier
gilen=128; % Length of guard interval (points)
L=3;
for jj=1:average
for kk=1:frame
L1=norepeatint(1,L,[0 20]);
L2=norepeatint(1,L,[0 20]);
for ebn0=0:3:21
%************************** main loop part **************************
number=0; %Number of error bit
ratio=0; %ratio of error bit
err_sig=0; %total number of error signal
for i=1:(N_ofdm/nd)
%************************** transmitter *********************************
%************************** Data generation ****************************
Source_data=randint(1,para*nd,2^level); %1*(128*2) rand : built in function
%************************** QPSK modulation *****************************
Modul_data=pskmod(Source_data,2^level)/sqrt(Nt); %128*2
%****************************STBC**************************************
for m=1:para*nd/2
STBC_data(:,(2*m-1):2*m)=[Modul_data(2*m-1) -conj(Modul_data(2*m));Modul_data(2*m) conj(Modul_data(2*m-1))];
end
STBC_data1=STBC_data(1,:);
STBC_data2=STBC_data(2,:);
%****************** Serial to parallel conversion ***********************
SP_data1=conj(reshape(STBC_data1,2,para))';
SP_data2=conj(reshape(STBC_data2,2,para))';
%******************* IFFT ************************
Prep_data1=crmapping(SP_data1,para,fftlen,nd); %128*6
Ifft_data1=ifft(Prep_data1)*sqrt(fftlen); % ifft : built in function
Prep_data2=crmapping(SP_data2,para,fftlen,nd); %128*6
Ifft_data2=ifft(Prep_data2)*sqrt(fftlen);
%********* Gurad interval insertion **********
Gii_data1=[Ifft_data1(fftlen-gilen+1:fftlen,:);Ifft_data1]; %160*6
Gii_data2=[Ifft_data2(fftlen-gilen+1:fftlen,:);Ifft_data2]; %160*6
%******************P/S**************************
PSdata1=reshape(Gii_data1,1,(fftlen+gilen)*nd);
PSdata2=reshape(Gii_data2,1,(fftlen+gilen)*nd);
fftlen2=fftlen+gilen;
%********* Attenuation Calculation *********
spow=sum(abs(PSdata1).^2+abs(PSdata2).^2)/(Nt*nd*fftlen2); % sum : built in function %signal power???每个符号的能量
attn=sqrt(spow/(2*level*(10.^(ebn0/10))));
noise1=attn.*(randn(1,fftlen+gilen)+j*randn(1,fftlen+gilen));
noise2=attn.*(randn(1,fftlen+gilen)+j*randn(1,fftlen+gilen));
%******************channel*********************************
L_diff1=L1-L1(1);
hh1=10.^(-L_diff1/10);
h1=hh1/sqrt(sum(abs(hh1).^2));
H1=fft(h1,fftlen);
L_diff2=L2-L2(1);
hh2=10.^(-L_diff2/10);
h2=hh2/sqrt(sum(abs(hh2).^2));
H2=fft(h2,fftlen);
%***********************end*******************************
%*************************** Receiver *****************************
A1=PSdata1(1:(fftlen+gilen));A2=PSdata1((fftlen+gilen+1):(fftlen+gilen)*nd);
B1=PSdata2(1:(fftlen+gilen));B2=PSdata2((fftlen+gilen+1):(fftlen+gilen)*nd);
r1 = filter(h1,1,A1) + filter(h2,1,B1) + noise1;
r2 = filter(h1,1,A2) + filter(h2,1,B2) + noise2;
R=[r1 r2];
%******************S/P********************************
SPdata=reshape(R,fftlen2,nd);
%****************** Guard interval removal *********
Gir_data=SPdata(gilen+1:fftlen2,:); %128*6
%****************** FFT ******************
fft_data=fft(Gir_data)/sqrt(fftlen); % fft : built in function
Fft_data=crdemapping(fft_data,para,fftlen,nd);
%********************P/S*********************************
PS_data=reshape(Fft_data,1,para*nd);
%*******************STBC Decode****************************
GG=reshape(conj(reshape(PS_data,para,nd))',1,para*nd);
HH1=conj(crdemapping(conj(H1)',para,fftlen,1))';
HH2=conj(crdemapping(conj(H2)',para,fftlen,1))';
for n=1:para*nd/2
x1=GG(2*n-1);
x2=GG(2*n);
De_STBC(2*n-1)=(x1*conj(HH1(n))+conj(x2)*HH2(n));%/(abs(HH1(n)).^2+abs(HH2(n)).^2);
De_STBC(2*n)=(x1*conj(HH2(n))-conj(x2)*HH1(n));%/(abs(HH1(n)).^2+abs(HH2(n)).^2);
end
%***************** demoduration **************************
Demodul_data=pskdemod(De_STBC*sqrt(Nt),2^level);
%************************** Signal Error Rate (SER) ****************************
[number,ratio]=symerr(Source_data,Demodul_data);
err_sig=err_sig+number;
end
SS(kk,ebn0)=err_sig;
end
end
ser(jj,:)=sum(SS)/para/N_ofdm/frame;
end
SER=sum(ser)/average;
%********************** Output result ***************************
ebn0=0:3:21;
semilogy(ebn0,SER,'-*r')
%******************** end of file *********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -