基于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;
相关文章
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
157353 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
17008 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
5天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1311 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3416 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
8天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
5天前
|
人工智能 自然语言处理 程序员
如何在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型?
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
934 14
|
12天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1938 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
|
12天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。

热门文章

最新文章