📄 ofdm2.m
字号:
% ofdm.m
% 实现OFDM传输的仿真程序
function [ber] = ofdm2(ebn0,nloop)
%********************** 准备部分 ***************************
para=256; % 并行子信道的个数
fftlen=256; % FFT的长度
noc=256; % 载波的个数(这里我认为其数目和子信道数目相同)
nd=16; % 循环一次OFDM的符号个数
ml=2; % 采用QPSK调制
sr=250000; % 符号速率
br=sr.*ml; % 每个载波的比特速率
gilen=40; % 保护间隔的长度
% ebn0=3; % (Eb/N0 - Signal to noise ration per bit , SNR - Signal to noise ratio)
% nloop=1
%************************** 主循环部分 **************************
noe = 0; % 错误数据的个数
nod = 0; % 传输数据的个数
eop=0; % 错误包的个数
nop=0; % 传输包的个数
for iii=1:nloop
%****************** 发射部分 ******************************************************
%****************** 产生数据 **********************
%********destination USER
numcarrier=8;
numuser=para/numcarrier;
userdata=rand(1,numcarrier*nd*ml)>0.5; % rand : built in function
userpara=reshape(userdata,numcarrier,nd*ml); % reshape : built in function
%********other users
paradata=zeros(para,nd*ml);% 初始化进行IFFT矩阵
paradata(1:numcarrier,:)=userpara;%把IFFT矩阵的前numcarrier列设为目标用户的信息
for i=1:(numuser-1)%在IFFT矩阵中加入其他用户信息
%随机产生其他某个用户的信息并加入IFFT矩阵矩阵
disturbdata=rand(1,numcarrier*nd*ml)>0.5;
disturbpara=reshape(disturbdata,numcarrier,nd*ml);
paradata((i*numcarrier+1):(i+1)*numcarrier,:)=disturbpara;
end
%****************** QPSK调制 ***********************
paradata=paradata.*2-1;
inputdata=zeros(para,nd);
count=0;
for jj=1:nd
inputdata(:,jj)=paradata(:,(count+1))+j.*paradata(:,(count+2));
count=count+2;
end
%****************** IFFT(离散傅里叶反变换) *********
y=ifft(inputdata);
%****************** 插入保护间隔 *******************
y=reshape(y,1,para*nd);
ty=zeros(1,(length(y)+nd*gilen));
for ii=1:nd
a=para+gilen;
ty(((ii-1)*a+gilen+1):ii*a)=y(((ii-1)*para+1):ii*para);
ty(((ii-1)*a+1):((ii-1)*a+gilen))=y((ii*para-gilen+1):ii*para);
end
spow=sum(abs(ty).^2)/(nd*para); % sum : built in function
attn=0.5*spow*(10^(-ebn0/10));
attn=sqrt(attn);
%****************** 经过信道 *****************************************************
[y1]=comb1(ty,attn);
%****************** 接收部分 ******************************************************
%****************** 去除保护间隔 ********************
y2=zeros(1,length(y));
for ii=1:nd
a=para+gilen;
y2(((ii-1)*para+1):ii*para)=y1(((ii-1)*a+gilen+1):ii*a);
end
ry=reshape(y2,para,nd);
%****************** FFT(离散傅里叶变换) ************
outy=fft(ry);
%***************** QPSK解调 **************************
demodata=zeros(para,nd*ml);
demodata(:,1:2:(nd*ml-1))=0.5*(outy+conj(outy))>0;
demodata(:,2:2:nd*ml)=0.5*j*(-outy+conj(outy))>0;
%************** 并串变换 ***************************
reuserpara=zeros(numcarrier,nd*ml);
reuserpara=demodata(1:numcarrier,:);
reuserdata=reshape(reuserpara,1,numcarrier*nd*ml);
%*************** 比特误码率 (BER) *********************
% instantaneous number of error and data
eeee=0;
noe2=0;
nod2=0;
noe2=sum(abs(reuserdata-userdata)); % sum : built in function
nod2=length(userdata); % length : built in function
% cumulative the number of error and data in noe and nod
noe=noe+noe2;
nod=nod+nod2;
% % calculating PER
%
% if noe2~=0
% eop=eop+1;
% else
% eop=eop;
% end
% eop;
% nop=nop+1;
%fprintf('%d\t%e\t%d\n',iii,noe2/nod2,eop); % fprintf : built in function
end
%****************** 结果输出 ***************************
%
% per=eop/nop;
ber=noe/nod;
%****************** end of file ******************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -