m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真

news2024/11/26 20:22:14

目录

1.算法描述

2.仿真效果预览

3.MATLAB部分代码预览

4.完整MATLAB程序


1.算法描述

 

       从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。

这里,我们采用如下的数据帧方式进行:

       首先,每次发送的数据长度为:221,进行CRC校验之后为253,然后通过卷积编码之后的长度为512,注意,这里对于213卷积编码,需要将编码前的数据自动加3个0进行补偿。

 

 里,我们使用卷积编码的参数为213系统,编码码率为1/2,所以这里就不需要打孔了。

所以整个卷积编码的结构为校验,编码,译码,校验,四个部分构成。

参数指标:

2.仿真效果预览

matlab2013B仿真结果如下:

 

 

3.MATLAB部分代码预览

........................................................................
for kk = 1:length(EbNo)
    disp('当前EbNo:');
    EbNo(kk)
    
    totalNumErr = 0;
    count       = 0;
    SNR         = 10^(EbNo(kk)/10);
    N0          = 2*10^(-EbNo(kk)/10);
    sigma       = 1/(sqrt(SNR)/2);   
    ii          = 0;
    Dsd         = 36;          %db数
    Dsr         = 36;
    Drd         = 36;
    Qsd         = sqrt(10^(Dsd/10));
    Qsr         = sqrt(10^(Dsr/10));
    Qrd         = sqrt(10^(Drd/10));     
    LL          = 2;
     
    while (totalNumErr < Error_Num)
        totalNumErr
       %%
        RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(count)));
       %%
        %发送端
        %发送端
        %产生数据
        data       = round(rand(1,N-M)); 
        %卷积213编码
        u          = turbo_encode(data) ;
        u          = [u 0 0];
        %交织
        u1         = interlace(u,16,16); 
        %BPSK
        tx         = 2*u1 - 1;    
 
       %%
        %编码协作协议
        %编码协作协议
        %安论文中的卷积编码协作的结构框图进行设计
        %首先对于 发送信息分为两路进行发送
        Trans_N1    = tx;        
        Trans_N2    = tx;
        %ii=1的时候,发送自身的码字,而ii=2的时候发送协作的码字,从而达到时隙的效果
        ii          = ii + 1;        
 
        %将N1发送给目的地
        %将N1发送给目的地
        %作为发送信源
        %进行AF中继
        %信道增益
        Hsd=Qsd*(randn);
        Hsr=Qsr*(randn);
        Hrd=Qrd*(randn);
        %协作节点的放大增益
        B=sqrt(1/(abs(Qsr)^2*1));
        %===============================
        %最大合并比加权因子计算(第i个支路的可变增益加权系数为该分集之路的信号幅度与噪声功率之比)
        %计算增益
        A0=conj(Hsd)/(1/(sqrt(LL)*EbNo(kk)));
        A1=B*conj(Hsr)*conj(Hrd)/((B^2*(abs(Hsr))^2+1)*(1/(sqrt(LL)*EbNo(kk))));           
        %接收
        MIMO_Rx =  Trans_N1/max(abs(Trans_N1))+ 1/(sqrt(SNR))*randn(size(Trans_N1));
        Ysr      = Hsr*MIMO_Rx;
        Yrd      = Hrd*Ysr*B;
        Ysd      = Hsd*MIMO_Rx;
        Y        = A0*Ysd+A1*Yrd; 
        %接收到的二进制信号
        MIMO_Rx1 = Y;    
        Rec_data1= sign(MIMO_Rx1); 
           
        %将N1发送给用户2
        %将N1发送给用户2              
        %接收
        MIMO_Rx2   = Trans_N1/max(max(Trans_N1))+ 1/(sqrt(SNR))*randn(size(Trans_N1));
        Ysr        = Hsr*MIMO_Rx2;
        Yrd        = Hrd*Ysr*B;
        Ysd        = Hsd*MIMO_Rx2;
        Y          = A0*Ysd+A1*Yrd;       
        %接收到的二进制信号
        MIMO_Rx12  = Y;   
        Rec_data12 = sign(MIMO_Rx2);                     
 
        %第二时隙,用户2向目的端发送用户1的第二帧信号,即用户2重新编码得到的关于U1分组的N2比特校验码字对应的调制信号
        %在USER2中,将接收到的N1序列重新进行编码,然后将其中的序列N2发送给目的地
        %译码+校验:
        [Data_CRC2,LQs]         = turbo_decode(Rec_data12(1:end-2),zeros(N-M+3,1),Frame_Length); 
        %编码
        Ldpc_trans_data_user2  = turbo_encode(Data_CRC2) ;
        Ldpc_trans_data_user2  = [Ldpc_trans_data_user2 0 0];
        Trans_N2_user2         = Ldpc_trans_data_user2;%N2序列
        Trans_N2_user3         = 2*Trans_N2_user2-1;
           
        %---------------------协作MIMO----------------------------------
        Hsd=Qsd*(randn);
        Hsr=Qsr*(randn);
        Hrd=Qrd*(randn);
        %协作节点的放大增益
        B=sqrt(1/(abs(Qsr)^2*1));
        %===============================
        %最大合并比加权因子计算(第i个支路的可变增益加权系数为该分集之路的信号幅度与噪声功率之比)
        %计算增益
        A0=conj(Hsd)/(1/(sqrt(LL)*EbNo(kk)));
        A1=B*conj(Hsr)*conj(Hrd)/((B^2*(abs(Hsr))^2+1)*(1/(sqrt(LL)*EbNo(kk))));           
        %接收
        MIMO_Rx =  Trans_N2/max(abs(Trans_N2))+ 1/(sqrt(SNR))*randn(size(Trans_N2));
        Ysr      = Hsr*MIMO_Rx;
        Yrd      = Hrd*Ysr*B;
        Ysd      = Hsd*MIMO_Rx;
        Y        = A0*Ysd+A1*Yrd; 
        %接收到的二进制信号
        MIMO_Rx2 = Y;
        Rec_data2= sign(MIMO_Rx2);   
        YY1 = [MIMO_Rx12,MIMO_Rx2]';               
        YY2 = [Rec_data12]';        
        Tx  = reshape(YY2 - sqrt(-1)*YY2,Nt, Frame_Length/Nt);    
        RayleighMat = (rand(Nr, Nt) + j*rand(Nr, Nt));   
        rr          = size(RayleighMat*Tx,1);
        cc          = size(RayleighMat*Tx,2);
        r           = RayleighMat*Tx;  
        Hs          = RayleighMat;                                    
        HQ          = Hs*Q;         
 
        
        
       %%
        %下面开始联合迭代
        %下面开始联合迭代
        rr = r;     
        %初始半径,这里将搜索的范围变大,就是将系数alpha定为12.
        RR =(12*Nt)*(2/(10^(SNR/10)));                                   
 
        %按英文论文所示转变为实信号
        rev1=[real(rr);imag(rr)];  
        H1  = RayleighMat;
        %按英文论文所示信道转变为实矩阵
        HH=[real(H1(:,:)) -imag(H1(:,:));
            imag(H1(:,:))  real(H1(:,:))];              
 
        LA  = zeros(1,Frame_Length/2);
        LDs = 0;
        LD  = zeros(1,Frame_Length/2);
        LE  = zeros(1,Frame_Length/2);
 
        for Nout = 1:OUT_Iter
            if Nout == 1
               LA = zeros(1,Frame_Length/2);
            else
               LA = LA2; 
            end
            %球形map
            for J=1:Frame_Length/2                                            
                rev          = rev1(:,J);                
                %先计算|r-g*Si|^2
                [y_norm,LDs] = func_FP_MAP(rev,RR,HH,[-1,1],SNR);
                for jj=1:Nt
                    y_2norm(Nt*J+jj-Nt)=y_norm(jj)+j*y_norm(jj+Nt);                  
                end
                %每一个比特的后验似然比信息为
                LD(J) = LDs;
            end   
            %外部迭代主要计算 
            LE = LD - LA;
            %解交织
            LE_itrlac_code = de_interlace(LE,16,16); %用于LDPC译码节点更新
            DM_msg  = reshape(real(y_2norm),log2(P),Nt*Frame_Length/2);
            for ii2 = 1:length(DM_msg)
                if DM_msg(ii2)~=0
                   DM_msg2(ii2) = abs(DM_msg(ii2)+1)/2;
                else
                   DM_msg2(ii2) = 0; 
                end
            end       
            DM_msg3 = de_interlace(DM_msg,16,16); %用于LDPC译码节点更新
            %内部迭代卷积里面
            [z_hat,LQ] = turbo_decode(DM_msg3(1:end-2),LE_itrlac_code',Frame_Length);
            x_hat      = z_hat;
            %交织
            tmp = LQ(1:length(LE_itrlac_code)) - LE_itrlac_code;
            %交织
            LA2 = interlace(tmp,16,16);             
        end
        %===========================================================================
        count       = count + 1;
        totalNumErr = totalNumErr + biterr(round(x_hat), data);
    end
    BERs(kk) = totalNumErr/(count*Frame_Length);
end
01_054_m

4.完整MATLAB程序

matlab源码说明_我爱C编程的博客-CSDN博客

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种在行末隐藏有效载荷的新供应链攻击技术研判

近期&#xff0c;Phylum检测到数十个新发布的Pypi软件包执行供应链攻击&#xff0c;在这些软件包中&#xff0c;通过隐藏的__import__将窃取程序投递到开发人员的机器上。攻击者利用代码审核者所使用IDE默认的不换行代码显示设置隐藏自身的行为与载荷&#xff0c;本文将就其中出…

栈简介、手写顺序栈、手写链栈和栈的应用

一. 简介 1. 什么是栈&#xff1f; 栈是一种只能从表的一端存取数据且遵循 "先进后出"&#xff08;"后进先出"&#xff09; 原则的线性存储结构。栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。 C#中提供顺序栈&#xff1a;Stack&…

【MySQL基础】如何安装MySQL?如何将MySQL设置成服务?

目录 一、MySQL的安装 1、解压配置 2、步骤安装 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、MySQL的安装 MySQL的安装有两种方式&#xff1a;解压配置和步骤安装 1、解压配置 需提前从官网直接下载压缩包&#xff0c;进…

【MySQL篇】第二篇——库的操作

目录 创建数据库 创建数据库案例 字符集和校验规则 查看系统默认字符集以及校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库删除 备份和恢复 备份 还原 注意事…

常见磁盘调度算法总结

磁盘调度算法&#x1f4d6;1. 最短寻道时间优先&#xff08;SSTF&#xff09;&#x1f4d6;2. 电梯算法&#xff08;SCAN或C-SCAN&#xff09;&#x1f4d6;3. 最短定位时间优先&#xff08;SPTF&#xff09;&#x1f4d6;4. 总结由于IO的高成本&#xff0c;操作系统在决定发送…

C语言 0 —— 计算机硬件架构及信息在计算机中的表示

当前的计算机系统&#xff0c;如Window &#xff0c;Linux&#xff0c;Mac 基本都是基于冯诺依曼的驱动架构设计的。 冯诺依曼架构输入设备先输入公式&#xff0c;给运算器&#xff0c;运算器先算 先算2*5 &#xff0c;临时放在CPU内部寄存器中&#xff0c;寄存器不够用的时候会…

vscode插件开发(四)Webview(1)

上一篇详细讲解了命令&#xff0c;这回我们一起来看一下Webview。vscode的插件其实可以分为两种&#xff0c;一种是webview插件&#xff0c;另一种是非webview插件。 webview插件的自由度很高&#xff0c;可以满足开发者的各种定制化的要求&#xff1b;而非webview插件只能使用…

我悟了!Mysql事务隔离级别其实是这样!

问题描述 ​ 最近几天在忙项目&#xff0c;有个项目是将业务收集到的数据变动&#xff0c;异步同步到一张数据表中。在测试的过程时&#xff0c;收到QA的反馈&#xff0c;说有订单的数据同步时好时坏。我怀着疑惑的表情打开了那段代码&#xff0c;它的逻辑大概是这样的&#x…

Zookeeper实现分布式锁的原理。

之前学习Redis时候&#xff0c;我们利用Redis实现了分布式锁。 黑马点评项目Redis实现分布式锁_兜兜转转m的博客-CSDN博客 为什么提出了分布式锁的概念呢&#xff1f; 因为在单体项目中&#xff0c;锁是基于JVM虚拟机实现的&#xff0c;在分布式情况下&#xff0c;JVM就不唯…

FullGC频繁,线程数持续增长排查

告警 线上应用fullgc频繁&#xff0c;收到告警 GC监控—堆内存不足 查看近12小时的监控&#xff0c;发现Survivor区一直处于 满状态、fullgc非常频繁、但没有内存溢出的现象&#xff0c;很明显是堆内存不足 GC日志分析—暂停时间并不长 因为fullgc相当频繁&#xff0c;抽…

项目管理(知识体系概述)

项目的定义:为创造独特的产品、服务或者成果进行的临时性工作。 项目的特性:1、独特的产品、服务、成果;2、临时性工作。 项目管理的目的(为了解决什么问题): 1、达成业务目标 2、满足相关方期望 3、提供项目的可预测性 4、提高项目的成果性。 5、在适当的时刻交付…

机器人运动学标定:基于考虑约束的指数积的运动学标定方法——只需要测量位置,避免冗余约束

文章目录写在前面为什么要消除归一化和正交化操作&#xff1f;只用位置而不是位姿去做标定的原因基于消除冗余约束步骤的参数辨识模型分析参考文献写在前面 基于指数积的运动学标定方法介绍&#xff1a; 机器人运动学标定&#xff1a;基于指数积的串联机构运动学标定 机器人运…

Vue表单修饰符:v-model.lazy、v-model.number、v-model.trim

表单修饰符有&#xff1a;lazy、number、trim&#xff1b;修饰符加在v-model后面&#xff1b; lazy修饰符&#xff1a; v-model的作用是双向绑定表单&#xff0c;能获取到input输入框的值&#xff0c;而且是实时获取的&#xff0c;就是当你输入框里的值发生改变就会获取到&…

【Shell 脚本速成】02、Shell 变量详解

目录 一、变量介绍 变量存取原理 二、变量定义 2.1 什么时候需要定义变量&#xff1f; 2.2 定义一个变量 定义变量举例&#xff1a; 定义变量演示&#xff1a; 2.3 取消变量 unset 2.4 有类型变量 declare declare 命令参数&#xff1a; 案例演示&#xff1a; 三…

向前迈进!走入GC世界:G1 GC原理深入解析

第零章&#xff1a;名词解释 mutator&#xff1a;应用线程 STW&#xff1a;Stop-The-World&#xff0c;指除了GC线程&#xff0c;其它所有线程全部暂停的一段时间 并发&#xff1a;指代GC线程与mutator在同一时刻执行任务 并行&#xff1a;指代多个GC线程在同一时刻执行任务…

一站式元数据治理平台——Datahub

一站式元数据治理平台——Datahub万字保姆级长文——Linkedin元数据管理平台Datahub离线安装指南 - 独孤风 - 博客园 (cnblogs.com)企业级数据治理工作怎么开展&#xff1f;Datahub这样做 - 独孤风 - 博客园 (cnblogs.com)【DataHub】 现代数据栈的元数据平台–如何与spark集成…

如何设计金融机构多场景关键应用下的存储架构

【摘要】银行、保险等金融机构存在多场景下的关键应用,如何选择适合各场景下的存储,如何设计适合业务的存储架构,显得尤为重要。本文从当前主流存储架构分析入手,提出金融机构业务场景分析与架构选型思路,以Glusterfs为例,分享如何根据业务场景的特点,有针对性的选取适合…

SQL优化

文章目录提升group by的效率分页查询优化覆盖索引子查询起始位置重定义检查 where,order by,group by后面的列尽量使用 varchar 代替 char。&#xff08;SQL 性能优化&#xff09;如果修改 / 更新数据过多&#xff0c;考虑批量进行提升group by的效率 select user_id,user_nam…

spring-security源码学习总结

由于SpringBoot 对 Security 的支持类均位于org.springframework.boot.autoconfigure.security包下&#xff0c;主要通过 SecurityAutoConfiguration 自动配置类和 SecurityProperties 属性配置来完成&#xff0c;所以需要下载springboot源码深入学习 SecurityAutoConfiguratio…

云原生边缘设备解决方案Akri on k3s初体验

作者&#xff1a; 涂家英&#xff0c;SUSE 资深架构师&#xff0c;专注 Cloud-Native 相关产品和解决方案设计&#xff0c;在企业级云原生平台建设领域拥有丰富的经验。 写在前面 k3s 是 SUSE 推出的为物联网和边缘计算构建的经过认证的 Kubernetes 发行版&#xff0c;它可以帮…