基于OFDM的IEEE802.11a系统仿真

1 前言

WiFi是一种非常普及的无线局域网WLAN技术,其技术规范微IEEE的802.11协议族。1998年IEEE802.11组织将OFDM作为了物理层标准,将OFDM技术引入WiFi,整整领先LTE系统10年。从IEEE802.11a以后的WiFi规范都把OFDM作为主要的技术部分。
本文首先介绍IEEE802.11的OFDM技术标准的详细情况,然后给出一个简化的IEEE802.11a OFDM系统的仿真,在仿真中暂不考虑扰码和卷积编码等,OFDM系统物理层采用802.11a系统物理层参数,1个长训练符号+6个OFDM符号构成1帧,设置信道为瑞利衰落信道,最大多普勒频移为100Hz,仿真信噪比Eb/N0为0~30db,选择QPSK调制和16QAM调制,比较接收端采用理想信道估计和利用训练符号进行信道估计时的误比特率性能。

2 IEEE802.11的OFDM技术

在WiFi系统的规范中,每个频点的带宽固定为20MHz,与LTE系统的最大频点带宽相同,但是不像LTE系统那样灵活可变。
WiFi系统的OFDM基波频率(也是子载波间隔)固定为312.5KHz,因此20MHz的带宽最多可部署20e6/3122.5e3=64个子载波,不过在IEEE802.11a/g的规范中只使用了52个子载波,等到IEEE802.11n提升到56个子载波。子载波越多,显然数据吞吐量越大(一个OFDM符号承载更多的数据信息)。
根据基波的频率,可知基波周期固定为3.2us,也就是OFDM符号时长为3.2us。
WiFi系统固定采用64阶的IFFT来生成OFDM信号,采样点的时间间隔为50us(3.2us/64),对应采样率为20MHz。由于IFFT的阶数小,因此设备的开销小。作为一种10多年前部署的技术,这样设计是很正常的。
WiFi系统的GI在IEEE802.11a/g中固定为0.8us,而在IEEE802.11n中GI缩短为0.4us。在WiFi中,GI对应的时间段也同时在实施循环前缀CP。
OFDM符号的传送周期为基波周期与GI的和,具体到IEEE802.11a/g,就是4us传送一个OFDM符号,OFDM的符号速率为250ksps。而到了IEEE802.11n,就是4us或3.6us传送一个OFDM符号,对应的符号速率为250ksps或277.8ksps。
IEEE802.11a OFDM系统的主要参数总结如下表:
在这里插入图片描述

3 单径信道下的IEEE802.11a系统仿真

3.1 参数设置

Nsp=52;             %系统子载波数(不包括直流载波)
Nfft=64;            % FFT 长度
Ncp=16;             % 循环前缀长度
Ns=Nfft+Ncp;        % 1个完整OFDM符号长度
noc=53;             % 包含直流载波的总的子载波数
Nd=6;               % 每帧包含的OFDM符号数(不包括训练符号)
M1=4;               % QPSK调制
M2=16;              % 16-QAM调制
sr=250000;          % OFDM符号速率
EbNo=0:2:30;      	% 归一化信噪比
Nfrm=10000;                         % 每种信噪比下的仿真帧数
ts=1/sr/Ns;                         % OFDM符号抽样时间间隔
t=0:ts:(Ns*(Nd+1)*Nfrm-1)*ts;       % 抽样时刻
fd=100;                             % 最大多普勒频移
h=rayleigh(fd,t);                   % 生成单径Rayleigh衰落信道

%训练符号频域数据,采用802.11a中的长训练符号数据
Preamble=[1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...
    1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1];
Preamble1=zeros(1,Nfft);
Preamble1(2:27)=Preamble(27:end);                   % 训练符号重排后的数据
Preamble1(39:end)=Preamble(1:26);
preamble1=ifft(Preamble1);                          % 训练符号时域数据
preamble1=[preamble1(Nfft-Ncp+1:end) preamble1];    % 加入循环前缀

程序说明:
生成单径的瑞利衰落信道的采样周期和信号的采样周期一致。

3.2 不同信噪比下的系统仿真

for ii=1:length(EbNo)
    
    %**************************发射机部分 *****************************
    msg1=randsrc(Nsp,Nd*Nfrm,[0:M1-1]);         % QPSK信息数据
    msg2=randsrc(Nsp,Nd*Nfrm,[0:M2-1]);         % 16-QAM信息数据
    data1=pskmod(msg1,M1,pi/4);                 % QPSK调制
    data2=qammod(msg2,M2)/sqrt(10);             % 16-QAM调制并归一化

    data3=zeros(Nfft,Nd*Nfrm);                  % 根据FFT要求,对数据重排
    data4=zeros(Nfft,Nd*Nfrm);

    data3(2:27,:)=data1(27:end,:);
    data3(39:end,:)=data1(1:26,:);

    data4(2:27,:)=data2(27:end,:);
    data4(39:end,:)=data2(1:26,:);
        
    clear data1 data2;                          % 清除不需要的临时变量

    data3=ifft(data3);                          % IFFT变换
    data4=ifft(data4);

    data3=[data3(Nfft-Ncp+1:end,:);data3];      % 加入循环前缀
    data4=[data4(Nfft-Ncp+1:end,:);data4];

    spow1=norm(data3,'fro').^2/(Nsp*Nd*Nfrm);   % 计算数据符号能量
    spow2=norm(data4,'fro').^2/(Nsp*Nd*Nfrm);
        
    data5=zeros(Ns,(Nd+1)*Nfrm);                % 加入训练符号
    data6=data5;
    for indx=1:Nfrm
        data5(:,(indx-1)*(Nd+1)+1)=preamble1.';
        data5(:,(indx-1)*(Nd+1)+2:indx*(Nd+1))=data3(:,(indx-1)*Nd+1:indx*Nd);
            
        data6(:,(indx-1)*(Nd+1)+1)=preamble1.';
        data6(:,(indx-1)*(Nd+1)+2:indx*(Nd+1))=data4(:,(indx-1)*Nd+1:indx*Nd);
    end
        
    clear data3 data4
        
    data5=reshape(data5,1,Ns*(Nd+1)*Nfrm);              % 并串变换    
    data6=reshape(data6,1,Ns*(Nd+1)*Nfrm);
      
    sigma1=sqrt(1/2*spow1/log2(M1)*10.^(-EbNo(ii)/10)); % 根据EbNo计算噪声标准差
    sigma2=sqrt(1/2*spow2/log2(M2)*10.^(-EbNo(ii)/10));
        
        
    for indx=1:Nfrm
        dd1=data5((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1)); % 当前帧的发射数据
        dd2=data6((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
          
        hh=h((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));      % 当前帧对应的信道参数 
        
        % 信号通过单径Rayleigh衰落信道,并加入高斯白噪声
        r1=hh.*dd1+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));   
        r2=hh.*dd2+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));
            
        r1=reshape(r1,Ns,Nd+1);                         % 串并变换
        r2=reshape(r2,Ns,Nd+1);

        r1=r1(Ncp+1:end,:);                             % 移除循环前缀
        r2=r2(Ncp+1:end,:);            

           
        %%%%%%%%%%%%%%% 理想信道估计 %%%%%%%%%%%%%%%%%%%%%%%%%   
        hh=reshape(hh,Ns,Nd+1);                     % 信道参数数据重排
        hh=hh(Ncp+1:end,:);
        x1=r1(:,2:end)./hh(:,2:end);                % 理想信估计结果
        x2=r2(:,2:end)./hh(:,2:end);

        x1=fft(x1);                                 % fft运算
        x2=fft(x2);

        x1=[x1(39:end,:);x1(2:27,:)];               % 数据重排
        x2=[x2(39:end,:);x2(2:27,:)];

        x1=pskdemod(x1,M1,pi/4);                    % 数据解调
        x2=qamdemod(x2*sqrt(10),M2);
        [neb1(indx),temp]=biterr(x1,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1)); % 统计一帧中的错误比特数
        [neb2(indx),temp]=biterr(x2,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
            
        %%%%%%%%%%%%%% 根据训练符号进行的信道估计 %%%%%%%%%%%%%%%%%%%%%%%  

        R1=fft(r1);                                 % fft运算
        R2=fft(r2);

        R1=[R1(39:end,:);R1(2:27,:)];               % 数据重排
        R2=[R2(39:end,:);R2(2:27,:)];
       
        HH1=(Preamble.')./R1(:,1);                  % 信道估计
        HH2=(Preamble.')./R2(:,1);                   
        
        HH1=HH1*ones(1,Nd);                         % 根据信道估计结果进行信道补偿
        HH2=HH2*ones(1,Nd);

        x3=R1(:,2:end).*HH1;                        
        x4=R2(:,2:end).*HH2;

        x3=pskdemod(x3,M1,pi/4);                    % 数据解调
        x4=qamdemod(x4.*sqrt(10),M2);        

         [neb3(indx),temp]=biterr(x3,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1)); % 统计一帧中的错误比特数
         [neb4(indx),temp]=biterr(x4,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
   end
   ber1(ii)=sum(neb1)/(Nsp*log2(M1)*Nd*Nfrm);     % 理想信道估计的误比特率
   ber2(ii)=sum(neb2)/(Nsp*log2(M2)*Nd*Nfrm);

   ber3(ii)=sum(neb3)/(Nsp*log2(M1)*Nd*Nfrm);     % 根据训练符号信道估计的误比特率
   ber4(ii)=sum(neb4)/(Nsp*log2(M2)*Nd*Nfrm);
            
end

程序说明:

  1. 关于计算噪声标准差的推导:
    在这里插入图片描述
  2. 信号通过单径瑞利衰落信道,并叠加高斯白噪声
    因为是单径信道,因此直接将信号矢量与信道矢量对应相乘,再叠加高斯白噪声。即:
r1=hh.*dd1+sigma1(randn(1,length(dd1))+j*randn(1,length(dd1)));   
r2=hh.*dd2+sigma2(randn(1,length(dd2))+j*randn(1,length(dd2)));

3.3 不同信噪比下的系统性能

程序如下:

semilogy(EbNo,ber1,'-ro',EbNo,ber3,'-rv',EbNo,ber2,'-r*',EbNo,ber4,'-rd')
grid on
title('OFDM系统误比特率性能')
legend('QPSK理想信道估计','QPSK训练符号信道估计','16-QAM理想信道估计','16-QAM训练符号信道估计')
xlabel('信噪比(EbNo)')
ylabel('误比特率')

仿真结果如下:
在这里插入图片描述
从上述仿真结果可以看到,理想的信道估计性能要优于利用训练符号进行信道估计的性能,这是因为信道在1帧的时间内,并不是不变的(有多谱勒频移),所以利用训练符号得到的信道估计值进行信道均衡,不可避免的会产生误差。

4 多径信道下的IEEE802.11a系统仿真

4.1 参数设置

OFDM系统参数和第2节的参数设置相同,只是信道由单径信道变为了2径信道。

Nsp=52;             %系统子载波数(不包括直流载波)
Nfft=64;            % FFT 长度
Ncp=16;             % 循环前缀长度
Ns=Nfft+Ncp;        % 1个完整OFDM符号长度
noc=53;             % 包含直流载波的总的子载波数
Nd=6;               % 每帧包含的OFDM符号数(不包括训练符号)
M1=4;               % QPSK调制
M2=16;              % 16-QAM调制
sr=250000;          % OFDM符号速率
EbNo=0:2:30;      	% 归一化信噪比
Nfrm=10000;                         % 每种信噪比下的仿真帧数
ts=1/sr/Ns;                         % OFDM符号抽样时间间隔
t=0:ts:(Ns*(Nd+1)*Nfrm-1)*ts;      % 抽样时刻
fd=100;                             % 最大多普勒频移
h=rayleigh(fd,t);                   % 生成单径Rayleigh衰落信道
h1=sqrt(2/3)*h;
h2=sqrt(1/3)*rayleigh(fd,t);
h2=[zeros(1,4) h2(1:end-4)];
%训练符号频域数据,采用802.11a中的长训练符号数据
Preamble=[1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...
    1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1];
Preamble1=zeros(1,Nfft);
Preamble1(2:27)=Preamble(27:end);                   % 前导重排后的数据
Preamble1(39:end)=Preamble(1:26);
preamble1=ifft(Preamble1);                          % 训练符号时域数据
preamble1=[preamble1(Nfft-Ncp+1:end) preamble1];    % 加入循环前缀

程序说明:
对于生成的2径信道,时延分别为0和20e-8s(对应延迟4个采样点),并且第2径平均功率比第1径低3dB。

4.2 不同信噪比下的系统仿真

for ii=1:length(EbNo)
     %**************************发射机部分 *****************************
    msg1=randsrc(Nsp,Nd*Nfrm,[0:M1-1]);         % QPSK信息数据
    msg2=randsrc(Nsp,Nd*Nfrm,[0:M2-1]);         % 16-QAM信息数据

    data1=pskmod(msg1,M1,pi/4);                 % QPSK调制
    data2=qammod(msg2,M2)/sqrt(10);             % 16-QAM调制并归一化

    data3=zeros(Nfft,Nd*Nfrm);                  % 根据FFT要求,对数据重排
    data4=zeros(Nfft,Nd*Nfrm);

    data3(2:27,:)=data1(27:end,:);
    data3(39:end,:)=data1(1:26,:);

    data4(2:27,:)=data2(27:end,:);
    data4(39:end,:)=data2(1:26,:);
        
    clear data1 data2;                           % 清除不需要的临时变量

    data3=ifft(data3);                          % IFFT变换
    data4=ifft(data4);

    data3=[data3(Nfft-Ncp+1:end,:);data3];      % 加入循环前缀
    data4=[data4(Nfft-Ncp+1:end,:);data4];

    spow1=norm(data3,'fro').^2/(Nsp*Nd*Nfrm);   % 计算符号能量
    spow2=norm(data4,'fro').^2/(Nsp*Nd*Nfrm);
        
    data5=zeros(Ns,(Nd+1)*Nfrm);                % 加入训练符号
    data6=data5;
    for indx=1:Nfrm
        data5(:,(indx-1)*(Nd+1)+1)=preamble1.';
        data5(:,(indx-1)*(Nd+1)+2:indx*(Nd+1))=data3(:,(indx-1)*Nd+1:indx*Nd);
         
        data6(:,(indx-1)*(Nd+1)+1)=preamble1.';
        data6(:,(indx-1)*(Nd+1)+2:indx*(Nd+1))=data4(:,(indx-1)*Nd+1:indx*Nd);
    end
        
    clear data3 data4;                                  % 清除不需要的临时变量
        
    data5=reshape(data5,1,Ns*(Nd+1)*Nfrm);               % 并串变换    
    data6=reshape(data6,1,Ns*(Nd+1)*Nfrm);
        
    data51=zeros(1,length(data5));
    data61=zeros(1,length(data6));
    data51(5:end)=data5(1:end-4);
    data61(5:end)=data6(1:end-4);
       
    sigma1=sqrt(1/2*spow1/log2(M1)*10.^(-EbNo(ii)/10)); % 根据EbNo计算噪声标准差
    sigma2=sqrt(1/2*spow2/log2(M2)*10.^(-EbNo(ii)/10));

    for indx=1:Nfrm
        dd1=data5((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
        dd2=data6((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
        dd3=data51((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
        dd4=data61((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
            
        hh=h((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));      % 当前帧的单径信道参数
        hh1=h1((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));    % 当前帧的2径信道参数
        hh2=h2((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
            
        % 信号通过单径衰落信道,并加入高斯白噪声
        r1=hh.*dd1+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));   
        r2=hh.*dd2+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));
            
        % 信号通过2径衰落信道,并加入高斯白噪声
        r11=hh1.*dd1+hh2.*dd3+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));   
        r21=hh1.*dd2+hh2.*dd4+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));   

        r1=reshape(r1,Ns,Nd+1);                     % 串并变换
        r2=reshape(r2,Ns,Nd+1);

        r11=reshape(r11,Ns,Nd+1);
        r21=reshape(r21,Ns,Nd+1);

        r1=r1(Ncp+1:end,:);                         % 移除循环前缀
        r2=r2(Ncp+1:end,:);            

        r11=r11(Ncp+1:end,:);  
        r21=r21(Ncp+1:end,:);
            
        R1=fft(r1);                                 % fft运算
        R2=fft(r2);

        R11=fft(r11);
        R21=fft(r21);

        R1=[R1(39:end,:);R1(2:27,:)];               % 数据重排
        R2=[R2(39:end,:);R2(2:27,:)];
        R11=[R11(39:end,:);R11(2:27,:)];
        R21=[R21(39:end,:);R21(2:27,:)];
          
        HH1=(Preamble.')./R1(:,1);                  % 信道估计
        HH2=(Preamble.')./R2(:,1);                   
        
        HH11=(Preamble.')./R11(:,1);            
        HH21=(Preamble.')./R21(:,1); 
            
        HH1=HH1*ones(1,Nd);
        HH2=HH2*ones(1,Nd);
        HH11=HH11*ones(1,Nd);
        HH21=HH21*ones(1,Nd);        
            
        x1=R1(:,2:end).*HH1;                        % 信道补偿
        x2=R2(:,2:end).*HH2;
        x3=R11(:,2:end).*HH11;                      
        x4=R21(:,2:end).*HH21;
        
        x1=pskdemod(x1,M1,pi/4);                    % 数据解调
        x2=qamdemod(x2.*sqrt(10),M2);
            
        x3=pskdemod(x3,M1,pi/4);                  
        x4=qamdemod(x4.*sqrt(10),M2);        

        [neb1(indx),temp]=biterr(x1,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1)); % 统计一帧中的错误比特数
        [neb2(indx),temp]=biterr(x2,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
        [neb3(indx),temp]=biterr(x3,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1)); 
        [neb4(indx),temp]=biterr(x4,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
    end
    ber1(ii)=sum(neb1)/(Nsp*log2(M1)*Nd*Nfrm);     % 理想信道估计的误比特率
    ber2(ii)=sum(neb2)/(Nsp*log2(M2)*Nd*Nfrm);

    ber3(ii)=sum(neb3)/(Nsp*log2(M1)*Nd*Nfrm);     % 非理想信道估计的误比特率
    ber4(ii)=sum(neb4)/(Nsp*log2(M2)*Nd*Nfrm);           
end

程序说明:
信道通过2径信道时并叠加高斯白噪声的代码:

r11=hh1.*dd1+hh2.*dd3+sigma1*(randn(1,length(dd1))+j*randn(1,length(dd1)));   
        r21=hh1.*dd2+hh2.*dd4+sigma2*(randn(1,length(dd2))+j*randn(1,length(dd2)));   

4.3 不同信噪比下的系统性能

semilogy(EbNo,ber1,'-ro',EbNo,ber3,'-rv',EbNo,ber2,'-r*',EbNo,ber4,'-rx')
grid on
title('OFDM系统误比特率性能')
legend('QPSK 单径信道','QPSK 2径信道','16-QAM 单径信道','16-QAM 2径信道')
xlabel('信噪比(EbNo)')
ylabel('误比特率')

在这里插入图片描述
从上述仿真结果可以看到,系统在单径和2径信道下的性能接近,说明只要信道最大延迟不超过循环前缀的长度,在解调过程中就不会产生码间串扰。

参考:
《详解Matlab/Simulink通信系统建模与仿真》

  • 8
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值