www.pudn.com > ofdm.zip > ofdm.m


para=256; % Number of parallel channel to transmit (points) 
fftlen=256; % FFT length 
noc=256; % Number of carrier 
nd=1; % Number of information OFDM symbol for one loop 
ml=2; % Modulation level : QPSK 
sr=250000; % Symbol rate 
br=sr.*ml; % Bit rate per carrier 
% gilen=15; % Length of guard interval (points) 
fullen=gilen+para; %ofdm符号总长 
% ebn0=7; %Eb/N0 
snr=10^(ebn0/10); 
 
deltad=0; %时延 
deltaf=0; %频偏 
 
%************************** main loop part ************************** 
 
%************************** transmitter ********************************* 
 
%************************** Data generation ****************************  
 
seldata=rand(1,para*nd*ml)>0.5; % rand : built in function 
 
%****************** Serial to parallel conversion *********************** 
 
paradata=reshape(seldata,para,nd*ml); % reshape : built in function 
 
%************************** QPSK modulation *****************************  
 
[ich,qch]=qpskmod(paradata,para,nd,ml); 
kmod=1/sqrt(2); % sqrt : built in function 
ich1=ich.*kmod; 
qch1=qch.*kmod; 
 
%******************* IFFT ************************ 
 
x=ich1+qch1.*i; 
y=ifft(x); % ifft : built in function 
ich2=real(y); % real : built in function 
qch2=imag(y); % imag : built in function 
 
%********* Gurad interval insertion ********** 
 
[ich3,qch3]= giins(ich2,qch2,fftlen,gilen,nd); 
fftlen2=fftlen+gilen; 
 
%********* Attenuation Calculation ********* 
 
spow=sum(ich3.^2+qch3.^2)/nd./para; % sum : built in function 
attn=0.5*spow*sr/br*10.^(-ebn0/10); 
attn=sqrt(attn); 
 
%*************************** Receiver ***************************** 
 
%*************************加频率偏移和时延*************************** 
 
[ich3,qch3]=delay(ich3,qch3,length(ich3),deltad); 
y=ich3+qch3.*i; 
for k=1:length(ich3); 
y(k)=y(k)*exp(i*2*pi*deltaf*k/para); 
end 
ich3=real(y); 
qch3=imag(y); 
%for k=1:length(ich3); 
%y(k)=y(k)*exp(i*2*pi*deltaf*k/para); 
%end 
 
 
%***************** AWGN addition *********  
 
% [ich4,qch4]=comb(ich3,qch3,attn); 
 
ich4 = ich3; 
qch4 = qch3; 
y=ich4+qch4.*i; 
 
%****************** Guard interval removal ********* 
 
[ich5,qch5]= girem(ich4,qch4,fftlen2,gilen,nd); 
 
%****************** FFT ****************** 
 
rx=ich5+qch5.*i; 
ry=fft(rx);   % fft : built in function 
 
ich6=real(ry);  % real : built in function 
qch6=imag(ry);  % imag : built in function 
 
%***************** demoduration ******************* 
 
ich7=ich6./kmod; 
qch7=qch6./kmod; 
figure(1); 
plot(ich7(:,1),qch7(:,1),'*');grid on; 
[demodata]=qpskdemod(ich7,qch7,para,nd,ml);