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

📄 ofdm_bpsk.m

📁 OFDM系统在COST207信道下的多径仿真
💻 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 + -