基于802.11n物理层的OFDM通信链路simulink仿真,包括FEC编码、插入导频、OFDM成帧、STBC编码

简介: 基于802.11n物理层的OFDM通信链路simulink仿真,包括FEC编码、插入导频、OFDM成帧、STBC编码

1.算法描述

    随5G的推广和下一代无线通信系统的兴盛,怎样应对现有频谱资源的紧缺与改善信息传输的质量成了迫在眉睫的难题,对重要技术的开发利用提出了更高的要求。其中,以MIMO多入多处技术与OFDM正交频分复用技术的结合效果最为突出。通过子载波的正交性以及多天线传输的优势,在不需要额外地增加带宽的情况下极大地提高了通信系统地性能,目前此技术已经成为了无线通信系统的主流。

    在通信系统中,信道所能提供的带宽通常比传送一路信号所需的带宽要宽得多。如果一个信道只传送一路信号是非常浪费的,为了能够充分利用信道的带宽,就可以采用频分复用的方法。OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。

     OFDM中的各个载波是相互正交的,每个载波在一个符号时间内有整数个载波周期,每个载波的频谱零点和相邻载波的零点重叠,这样便减小了载波间的干扰。由于载波间有部分重叠,所以它比传统的FDMA提高了频带利用率。在OFDM传播过程中,高速信息数据流通过串并变换,分配到速率相对较低的若干子信道中传输,每个子信道中的符号周期相对增加,这样可减少因无线信道多径时延扩展所产生的时间弥散性对系统造成的码间干扰。另外,由于引入保护间隔,在保护间隔大于最大多径时延扩展的情况下,可以最大限度地消除多径带来的符号间干扰。如果用循环前缀作为保护间隔,还可避免多径带来的信道间干扰。

   OFDM技术将高速的宽带信号变换为窄带信号,再调制到并行的子载波上进行传输。这样的使得之前的频率选择性信道变为了平坦的子信道,且因为其码元周期较长,它的抗码间干扰能力也较强。其中,OFDM的正交性可以从频域和时域的角度解释如下图所示:

87eb81f5537c207778b90cc014ab862c_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

    一个OFDM符号的时域信号和频域信号。其中时域信号图3-2中每个子载波在一个OFDM 符号周期内都包含整数倍的周期,而且各个相邻子载波之间相差1个周期,各子载波信号之间满足交性。 信号在经过无线信道传输后,有效信息会和一些干扰的噪声信息信息叠加在一起,这会大大影响整个通信系统的准确性,因此需要信号检测技术将有用的信息分离出来,来保证接收到收到信息的可靠性。常见的信号检测有线性检测和非线性检测,此次设计采用的是线性检测中的MMSE算法,通过加权矩阵使接收到的信号分离成互不相关的信号从而可以得到有效的信息。

    由于无线通信系统的不确定性,数据在传输过程中时常会出现误码、丢包的情况,导致整个通信系统性能恶化。所以设计合理的信道编码方式,可以有效提高系统的抗干扰能力。FEC前向纠错码是指通过在传输列中加入冗余码进行纠错,此次设计的前向纠错码采用的是卷积编码。它在发送的信息比特时会加入冗余的纠错比特,纠错比特能够在接收端接收到信息后对信息进行判断,找到错误的信息比特并进行纠错。其中,纠错的比特不仅会与自身所在的码元有关,还会与前后码元有关,使得他的纠错能力会更好,提高整个系统发送信息的准确性。但是通过引入冗余数据,降低了传输的数据的效率,所以在设计FEC码时也应考虑冗余的位数。

  总体设计思路如图3所示:

a42421eb71048d2db888e2914796f5dd_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

   与以前的协议相比,802.11n协议具有较大的性能提升,主要是因为其采用MIMO技术和OFDM技术的结合,以及大量优化系统的算法,从而凸显其优越性。MIMO OFDM[6]可以有效解决带宽效率和多径干扰问题,通过其子载波正交及其循环前缀的优势能够有效提高系统的抗干扰能力,MIMO则通过多天线技术可以实现多个数据流的传输。两者的结合结合,既能实现高速率传输,又能通过分编码实现很强的可靠性。本章对此次设计中的重要技术及其相关算法作相关研究,并对其TGn信道进行研究学习。

2.仿真效果预览
matlab2022a仿真结果如下:

84313a95c311a1e1cb11bbd31a92e4c6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
f72195b67aca906a5a8b84eb7dadb4ed_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

3.MATLAB核心程序

ffa828130ca7687736e2a27e8158b8b0_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

     通过Matlab/Simulink仿真平台搭建基于802.11n的无线通信系统,分别从发送端、信道和接收端进行模块设计,其中发射端包括信源、FEC编码、调制,插入导频、OFDM成帧、STBC编码、插入循环前缀、IFFT等,信道设计采用的是TGn室内信道模型,接收端对照发射端有着相应的信号处理,其主要的分析模块有信道估计、MIMO信号检测,SNR估计。
global PER_snr snr_idx;
% Initialize vectors
STBC = ch_and_rx(1);
Nss  = ch_and_rx(2);
Nsts = Nss + STBC;
Nltf = Nsts;
if (Nsts==3) % use 4 TRN symbols for NSTS=3
   Nltf = 4;
end
 
Nrx  = ch_and_rx(3);
ch_est  = ch_and_rx(3+(1:16*56));
rx_data = ch_and_rx((4+16*56+4*56*(Nltf)):end);
 
%%%% Form channel matrix构建信道矩阵 y = ha + r,由信号的冲激响应构成
idx = 0;
H = zeros(4,4,56);
for c=1:4
    for r=1:4
        H(r,c,:) = ch_est(idx+(1:56));
        idx=idx+56;
    end
end
H = H(1:Nrx,1:Nsts,:);  %% channel matrix is Nrx x Nst 构建相应的发射端接收端的信道矩阵
 
%%%% Rx data symbols...构造接收信号矩阵
idx = 0;
nsymdata = (length(rx_data)/4/56);%接收符号的数目
rdata = zeros(4,56,nsymdata);
for n=1:nsymdata
    for m=1:Nrx
        rdata(m,:,n) = rx_data(idx+(m-1)*56+(1:56));
    end
    idx=idx+4*56;
end
 
%%%%
%%%% STBC or MMSE...进行STBC解码或者MMSE信号检测
%%%%
if (STBC)    
    %%%% Form space-time decoding matrices 构造空时解码矩阵
    for k=1:56
        if (STBC==1 && Nss==1)
            % 加权矩阵 假设用两个符号来表示状态信息
            Heff(:,:,k) = [      H(1,1,k)      -H(1,2,k); ...  
                            conj(H(1,2,k)) conj(H(1,1,k)) ];  
        elseif (STBC==1 && Nss==2)
            Heff(:,:,k) = [      H(1,1,k)      -H(1,2,k)       H(1,3,k)              0;  ...  
                            conj(H(1,2,k)) conj(H(1,1,k))             0  conj(H(1,3,k)); ...  
                                 H(2,1,k)      -H(2,2,k)       H(2,3,k)              0;  ...
                            conj(H(2,2,k)) conj(H(2,1,k))             0  conj(H(2,3,k)) ];  
        elseif (STBC==1 && Nss==3)
            Heff(:,:,k) = [      H(1,1,k)      -H(1,2,k)       H(1,3,k)              0        H(1,4,k)              0;  ...  
                            conj(H(1,2,k)) conj(H(1,1,k))             0  conj(H(1,3,k))              0  conj(H(1,4,k)); ...  
                                 H(2,1,k)      -H(2,2,k)       H(2,3,k)              0        H(2,4,k)              0;  ...
                            conj(H(2,2,k)) conj(H(2,1,k))             0  conj(H(2,3,k))              0  conj(H(2,4,k)); ...  
                                 H(3,1,k)      -H(3,2,k)       H(3,3,k)              0        H(3,4,k)              0;  ...
                            conj(H(3,2,k)) conj(H(3,1,k))             0  conj(H(3,3,k))              0  conj(H(3,4,k)) ];  
        elseif (STBC==2 && Nss==2)
            Heff(:,:,k) = [      H(1,1,k)      -H(1,2,k)       H(1,3,k)      -H(1,4,k);  ...  
                            conj(H(1,2,k)) conj(H(1,1,k)) conj(H(1,4,k)) conj(H(1,3,k)); ...
                                 H(2,1,k)      -H(2,2,k)       H(2,3,k)      -H(2,4,k);  ...
                            conj(H(2,2,k)) conj(H(2,1,k)) conj(H(2,4,k)) conj(H(2,3,k)) ];  
        end
    end
%%%% Compute noise power...
    N_o = 0;
    for k=1:56
        He = Heff(:,:,k);
        N_o = N_o + (1/56)*sum(sum(He.*conj(He)))/Nrx;     % Signal power
    end
    snr_val = PER_snr(snr_idx);
    N_o = N_o * 10^(-snr_val/10);     
    
    %%%% Compute space-time detector coeff's
    C = zeros(Nss*2,Nss*2,56);
    for k=1:56
        %%%% MMSE coeff's
        He = Heff(:,:,k);
        C(:,:,k) = inv(He'*He + N_o*eye(Nss*2))*He';
        %C(:,:,k) = inv(He'*He)*He';
    end
    
    %%%% Compute space-time decoding outputs
    idx = 0;
    detout = zeros(4*56*nsymdata,1);
   
    for n=1:2:nsymdata
        for k=1:56
            if (STBC==1 && Nss==1)
                % MMSE_det outputs
                detset = C(:,:,k) * [ rdata(1,k,n); ...
                                      conj(rdata(1,k,n+1)) ];
                detout(k+idx+0*56) = detset(1);         % first symbol in time, ss1
                detout(k+idx+4*56) = conj(detset(2));   % second symbol in time, ss1
               
            elseif (STBC==1 && Nss==2)
                % MMSE_det outputs
                detset = C(:,:,k) * [ rdata(1,k,n); ...
                                      conj(rdata(1,k,n+1)); ...
                                      rdata(2,k,n); ...
                                      conj(rdata(2,k,n+1)) ];
                detout(k+idx+0*56) = detset(1);         % first symbol in time, ss1
                detout(k+idx+4*56) = conj(detset(2));   % second symbol in time, ss1
                detout(k+idx+1*56) = detset(3);         % first symbol in time, ss2
                detout(k+idx+5*56) = conj(detset(4));   % second symbol in time, ss2
                
            elseif (STBC==1 && Nss==3)
                % MMSE_det outputs
                detset = C(:,:,k) * [ rdata(1,k,n); ...
                                      conj(rdata(1,k,n+1)); ...
                                      rdata(2,k,n); ...
                                      conj(rdata(2,k,n+1)); ...
                                      rdata(3,k,n); ...
                                      conj(rdata(3,k,n+1)) ];
                detout(k+idx+0*56) = detset(1);         % first symbol in time, ss1
                detout(k+idx+4*56) = conj(detset(2));   % second symbol in time, ss1
                detout(k+idx+1*56) = detset(3);         % first symbol in time, ss2
                detout(k+idx+5*56) = conj(detset(4));   % second symbol in time, ss2
                detout(k+idx+2*56) = detset(5);         % first symbol in time, ss3
                detout(k+idx+6*56) = conj(detset(6));   % second symbol in time, ss3
                
            elseif (STBC==2 && Nss==2)
                % MMSE_det outputs
                detset = C(:,:,k) * [ rdata(1,k,n); ...
                                      conj(rdata(1,k,n+1)); ...
                                      rdata(2,k,n); ...
                                      conj(rdata(2,k,n+1)) ];
                detout(k+idx+0*56) = detset(1);         % first symbol in time, ss1
                detout(k+idx+4*56) = conj(detset(2));   % second symbol in time, ss1
                detout(k+idx+1*56) = detset(3);         % first symbol in time, ss2
                detout(k+idx+5*56) = conj(detset(4));   % second symbol in time, ss2
              
            end
        end
        idx=idx+8*56;
    end
 
else
 
    %%%% Compute noise power...
    N_o = 0;
    for k=1:56
        He = H(:,:,k);
        N_o = N_o + (1/56)*sum(sum(He.*conj(He)))/Nrx;     % Signal power
    end
    snr_val = PER_snr(snr_idx);
    N_o = N_o * 10^(-snr_val/10);       
    
    %%%%% MMSE linear detector (no STBC)
    C = zeros(Nsts,Nrx,56);
    for k=1:56
        %%%% MMSE coeff's
        He = H(:,:,k);
        C(:,:,k) = inv(He'*He + N_o*eye(Nrx)) * He'; 
        %C(:,:,k) = inv(He'*He) * He';
    end
    %%%% MMSE_det outputs
    idx = 0;
    detset = zeros(4,1);
    detout = zeros(4*56*nsymdata,1);
    
    for n=1:nsymdata
        for k=1:56
            % MMSE_det outputs
            detset(1:Nsts) = C(:,:,k)*rdata(1:Nrx,k,n);
            detout(k+idx+0*56) = detset(1);
            detout(k+idx+1*56) = detset(2);
            detout(k+idx+2*56) = detset(3);
            detout(k+idx+3*56) = detset(4);
           
        end
        idx=idx+4*56;
    end
    
end
% MMSE_det module output
dataout = detout;
相关文章
|
12天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
32 1
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
46 4
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现16QAM调制解调通信系统,使用Verilog语言编写,包括信道模块、误码率统计模块。通过设置不同SNR值(如8dB、12dB、16dB),仿真测试系统的误码性能。项目提供了完整的RTL结构图及操作视频,便于理解和操作。核心程序实现了信号的生成、调制、信道传输、解调及误码统计等功能。
43 3
|
14天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了256QAM调制解调算法的仿真效果及理论基础。使用Vivado 2019.2进行仿真,分别在SNR为40dB、32dB和24dB下生成星座图,并导入Matlab进行分析。256QAM通过将8比特数据映射到复平面上的256个点,实现高效的数据传输。Verilog核心程序包括调制、信道噪声添加和解调模块,最终统计误码率。
27 0
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
### 简介 本项目采用VIVADO 2019.2进行了十六进制相位移键控(16PSK)算法仿真,结果显示,在SNR=30dB时效果为Tttttttttttttt12,在SNR=20dB时效果为Tttttttttttttt34。系统RTL结构如Tttttttttttttt555555所示。16PSK是一种高效的相位调制技术,能在每个符号时间内传输4比特信息,适用于高速数据传输。其工作原理包括将比特流映射到16个相位状态之一(Tttttttttttttt777777),并通过匹配滤波和决策进行解调。具体Verilog核心程序见完整代码。
36 1
|
移动开发 算法 异构计算
m基于FPGA的64QAM调制解调通信系统verilog实现,包含testbench,不包含载波同步
m基于FPGA的64QAM调制解调通信系统verilog实现,包含testbench,不包含载波同步
301 1
|
6月前
解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题
解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题
173 0
|
资源调度 算法
m基于扩频解扩+LDPC编译码的通信链路matlab误码率仿真,调制对比QPSK,16QAM,64QAM,扩频参数可设置
m基于扩频解扩+LDPC编译码的通信链路matlab误码率仿真,调制对比QPSK,16QAM,64QAM,扩频参数可设置
248 2
|
算法 异构计算 Windows
m基于FPGA的DQPSK调制解调通信系统verilog实现,包含testbench,不包含载波同步
m基于FPGA的DQPSK调制解调通信系统verilog实现,包含testbench,不包含载波同步
313 1
|
机器学习/深度学习 传感器 编解码
【OFDM通信】OFDM仿真设计(卷积编码、自动增益控制、极大似然判决、QPSK收发、帧检测)附matlab代码
【OFDM通信】OFDM仿真设计(卷积编码、自动增益控制、极大似然判决、QPSK收发、帧检测)附matlab代码