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

📄 ofdm2.m

📁 块状OFDMA仿真
💻 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 + -