📄 ofdm_bpsk.m
字号:
% File Name:OFDM_bpsk.m
function [ber]=simuOFDM_bpsk(SNR);
%*******给定信噪比的OFDM通信系统,估计差错概率****************
%bpsk调制
%SNR为给定信噪比,单位为dB
%ber为差错概率估计
%**************参数设置****************
%SNR=10; %信噪比取值,dB为单位
fl=128; %设置FFT长度
Ns=128; %设置一个帧结构中OFDM信号的个数
para=128; %设置并行传输的子载波个数
sr=250000; %设置符号速率
br=sr.*2; %设置每个子载波的比特率
gl=32; %设置保护时隙的长度
%**********发送端部分*********************
Signal=rand(1,para*Ns)>0.5;
%产生0,1随机数列,符号个数为para*Ns(子信道个数×每个信道中有用符号数)
SigPara=reshape(Signal,para,Ns);
%进行串并转换,将一维的信号分成行为para,列为Ns的矩阵
%x=SigPara;%由于bpsk调制,直接映射即可
%bpsk的映射
%********************************************
for j=1:Ns
for k=1:para
if(SigPara(k,j)==1)
x(k,j)=1;
else
x(k,j)=-1;
end
end
end
%*********************************************
y=ifft(x); %通过傅立叶反变换,将频域数据转换为时域数据
ich2=real(y); %I信道取变换后的实部
qch2=imag(y); %Q信道取变换后的虚部
%下面插入保护时间
ich3=[ich2(fl-gl+1:fl,:);ich2];
qch3=[qch2(fl-gl+1:fl,:);qch2];
%并串转换
ich4=reshape(ich3,1,(fl+gl)*Ns);
qch4=reshape(qch3,1,(fl+gl)*Ns);
%形成复数发送数据
TrData=ich4+qch4.*sqrt(-1);
%进入Rayleighchan信道
ts=0.0000005; %输入信号的抽样时间,单位为s
fd=1; %最大多普勒频移,单位为Hz
Tau=[0,0.0000001,0.0000002,0.0000003,0.0000004,0.0000005]; %多径时延向量,单位为s
Pdb=[0,-4,-8,-12,-16,-20]; %平均多径抽头增益向量,单位为dB
Chan=rayleighchan(ts,fd,Tau,Pdb); %建立一个频率选择性信道对象,每个离散路径为独立的瑞利衰落随机过程
ReData0=filter(1,Chan.PathGains,TrData); %经过信道传输后的数据
ReData=awgn(ReData0,SNR,'measured'); %加入高斯白噪声
%接收端
%移去保护时间
idata=real(ReData);
qdata=imag(ReData);
idata1=reshape(idata,fl+gl,Ns);
qdata1=reshape(qdata,fl+gl,Ns);
idata2=idata1(gl+1:gl+fl,:);
qdata2=qdata1(gl+1:gl+fl,:);
%FFT
Rex=idata2+qdata2*sqrt(-1);
ry0=fft(Rex);
Ge=fft(Chan.PathGains,128);
Ge=Ge';
for j=1:Ns
ry(:,j)=ry0(:,j)./Ge;
end
%进行信道均衡
%ReIChan=real(ry);%由于bpsk逆映射,数据符号保持不变
%*******************
%bpsk的逆映射;1逆映射为1,-1逆映射为0
for j=1:Ns
for k=1:para
if(real(ry(k,j))>0)
ReIChan(k,j)=1;
else
ReIChan(k,j)=0;
end
end
end
%*****************************end of bpsk逆映射***********************
ReSig=reshape(ReIChan,1,para*Ns);
%**********************画星座图**************************
figure(1)
I=real(ry);
Q=imag(ry);
plot(I,Q,'.');
title('Bpsk 星座图');
%*********************end of 星座图***************************
%符号抽样判决
%ReSig=ReSig>0.5;
%**********估计差错概率(BER)*********************
noe=sum(abs(Signal-ReSig));%统计差错个数
nod=length(Signal);%计算发错数据符号的个数
ber=noe/nod;
fprintf('差错个数=%d\n发送的符号数=%d\n差错概率估计值=%e\n',noe,nod,ber);
%end of script file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -