Viterbi维特比译码误码率仿真,调制为QPSK,信道为高斯白噪声

news2024/10/7 16:20:56

目录

1.算法描述

2.仿真效果预览

3.MATLAB部分代码预览

4.完整MATLAB程序


1.算法描述

   整体思路如图1中所示,

       其中输入序列使用randn函数来产生,卷积也采用matlab本身的函数conv,加性高斯白噪声用wgn函数来产生,由于实验的重点在Viterbi译码,下面介绍译码的实现。

译码总体上是先通过加——比——选来得到最优路径,然后根据状态转移图来得到解码后的码字。

由图4可以看到在选择最佳路径时,第一时刻和第二时刻需要特殊处理,从第三时刻开始直到译码结束处理方式都相同。在整个过程中需要记录的是到达各个状态的累计最小汉明距离及路径。用RouteS0->RouteS3来记录到达各个状态的路径,用数组D来记录到达各个状态时的累计汉明距离。从S0状态(a状态)开始,第一时刻只能到达S0和S1状态,且输出分别为00和11,这时只记录到达S0和S1时输出与接收码字的汉明距离D(1)和D(2),第二时刻可达的状态为全部,但是到达个状态也只有一条路径,此时记录下到达四个状态的累计汉明距离及路径。从第三时刻开始,到达每个状态有两条路径,将这两天路径的累计汉明距离进行比较保存下距离小的,以及与该距离相对应的路径。由于对原序列添加了2比特的0,所以理论上最终的状态归于S0,故最终的RouteS0就是最佳路径。在这个过程中要注意使用临时变量来保存上一时刻的路径和累计距离,以免在该时刻重新赋值时发生覆盖。最后利用状态转移图来根据最佳路径得到码字。程序见附录。

2.1卷积码编码原理

       分组码是把信息序列分成长为k的许多子段,然后每个子段独立地编出各自的监督码,形成长为n的码字。每个子段的监督位只与本子段的信息位有关,而与其他子段无关。各个段形成的码字在编码译码时独立进行。为了达到一定的纠错能力和效率,分组码的码字n通常比较大。编码解码时必须把本子段的信息码存储起来再进行编码解码。这样当码长n较大时,编码解码过程所产生的时延也随之增加。若降低码长n,又会使纠错能力和效率下降。卷积码对信息位的处理与分组码完全不同,它是一种连续处理信息序列的编码方式。码字的监督位不仅与本段的信息位有关而且与其它段落的信息位也有关。整个编码过程前后相互关联,连续进行。在编码时将信息序列分成长度为k的子段,把长度为k的信息比特编为n个比特,k和n取值通常都很小,特别适合以串行形式传输信息,时延小。长为n的每个子段包括k个信息位和r=n-k个监督位,这里的监督位不仅与本段的k个信息位有关,也与前面(N-1)段的信息位有关,N为相关联的信息序列的分段数目。编码后相互关联的码元数目为nN。卷积码的纠错能力随着N的增加而增大,差错率随N的增加而指数下降。与分组码相比,在设备复杂度相同的条件下卷积码的性能优于分组码。

2.2维特比译码

       卷积码的译码方法可分为代数译码和概率译码两大类,概率译码比较常用的有两种,一种叫序列译码,另一种叫Viterbi译码法,本实验主要是Viterbi译码方法的实现。它的基本思想是把接收到的矢量,和网格图上诸种可能的路径比较,删去距离大的路径,保留距离小的路径,以距离最小路径作为发码的估值.下面利用图解的方法来说明维特比解码的方法和运作过程。设输入编码器的信息序列为(1 1 0 1 1 0 0 0 ),则由编码器输出的序列 Y=(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 ),编码器的状态转移路线为 abcdbdca。若收到的序列R=(0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0  ),对照网格图来说明维特比译码的方法。

      由于该卷积码的约束长度为 3位,因此先选择接收序列的前 6 位序列R1 =(0 1 0 1 0 1),同到达第 3时刻可能的 8 个码序列(即 8 条路径)进行比较,并计算出码距。该例中到达第3 时刻a点的路径序列是(0 0 0 0 0 0)和(1 1 1 0 1 1 ) ,它们与R1的距离分别是 3 和4;到达第 3 时刻b点的路径序列是(0 0 0 0 1 1)和(1 1 1 0 0 0) ,它们与R1的距离分别是 3 和4,到达第 3 时刻c点的路径序列是(0 0 1 1 1 0)和(1 1 0 1 1 0) ,与 R1 的距离分别是 4 和1;到达第 3 时刻d 点的路径序列是(0 0 1 1 0 1)和(1 1 0 1 1 0) ,与 R1 的距离分别是 2 和3。上述每个节点都保留码距较小的路径为幸存路径,所以幸存路径码序列是(0 0 0 0 0 0) 、 (0 0 0 0 1 1) 、 (1 1 0 1 0 1)和(0 0 1 1 0 1) ,如图4(a)所示。用与上面类同的方法可以得到第 4、5、6、7 时刻的幸存路径。需指出对于某一个节点而言比较两条路径与接收序列的累计码距时,若发生两个码距值相等,则可以任选一路径作为幸存路径,此时不会影响最终的译码结果。图 4(b)给出了第 5 时刻的幸存路径,在码的终了时刻a状态,得到一根幸存路径,如图 4(c)所示。由此看到译码器输出是R’ =(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0) ,即可变换成序列(1 1 0 1 1 0 0 0) ,恢复了发端原始信息。比较 R’和R序列,可以看到在译码过程中己纠正了在码序列第 1 和第7位上的差错。当然,差错出现太频繁,以至超出卷积码的纠错能力,则会发生误纠,这是不希望的。

选择(2,1,2)卷积码为例来说明。

     (2,1,2)码的编码器及相应的状态图能表示卷积编码器在不同输入信息序列下,编码器各状态之间的转移关系,但并不能表示出编码器状态转移与时间关系。为了表示这种状态与时间的关系,可以用网格(Terills)图来表示,如图3所示。此图是L=5时,该(2,1,2)码的状态转移时间关系图,它由节点和分支组成,共有L+m+1个时间单位(节点),以0至L +m予以标号。若编码器从S0 (00)状态开始,并且结束于S0状态,则最先的m=2个时间单位(0,1),相应于编码器由S0状态出发往各个状态行进,而最后m=2个时间单位(6,7),相应于编码器由各状态返回到S0状态。

       编码器从全为0的S0状态出发,最后又回到S0状态时所输出的码序列,称为结尾卷积码序列。因此,当送完L段信息序列后,还必须向编码器再送入m段全0序列,以迫使编码器回到S0状态。

        网格图中每一个状态有两个输入和两个输出分支,在某一时间单位(节点)i,离开每一状态的虚线分支,表示输入编码器中的信息子组=1;而实线分支表示此时刻输入编码器的信息子组=0。每一分支上的两个数字,表示第i时刻编码器输出的子组,因而网格图中的每一条路径都对应于不同输入的信息序列。由于所有可能输入的信息序列共有个(假设L为总时间),因而网格图中可能有的路径也有条,相应于个长为的不同码序列。

2.仿真效果预览

matlab2022a仿真结果如下:

3.MATLAB部分代码预览

 
Frame = 1000;%编码的帧数
for i = 1 : Frame
    i
    SignNum = 1000;%每一帧的码字数目
    Length = SignNum + 3;%添加尾比特后的原始码序列长度
    
    OrigiSeq=(sign(randn(1,SignNum))+1)/2;      %产生原始的0或1信息序列
    OrigiSeq=[OrigiSeq 0 0 0] ;                    %添加尾比特使编码后状态归零
    
    ConCode = ConEncode(OrigiSeq, Length);      %卷积编码
    QPSKCode = QPSKEncode(ConCode, Length);      %QPSK调制
    SNR = 1: 1 : 5;
 
    error = zeros(Frame,length(SNR));
    for k = 1:length(SNR)
        RecCode = awgn(QPSKCode,SNR(k),'measured');               %给信号加噪            
        DQPSKCode = QPSKDecode(RecCode, Length);     %QPSK解调
        Decoder = Viterbi(DQPSKCode, Length);        %维特比译码
        error(i,k) = sum(abs(Decoder-OrigiSeq));
    end
end
 
AveError = zeros(1,length(SNR));
for column = 1:length(SNR)
    for row = 1:Frame
        AveError(column) = AveError(column) + error(row,column);
    end
end
AveError = AveError/Frame;
 
figure;
semilogy(SNR,AveError/1000,'b-s')
 
grid on
xlabel('SNR')
ylabel('Pe')
A_032

4.完整MATLAB程序

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

V

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

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

相关文章

世上最全NVDIA GPU参数列表: 3090,4090, A40, A30,V100, A100, A800性能参数

-1)GeForce RTX 4090 GeForce RTX 4090 GPU 引擎规格:NVIDIA CUDA 核心数量16384加速频率 (GHz)2.52基础频率 (GHz)2.23显存规格:标准显存配置24 GB GDDR6X显存位宽384 位技术支持:Ray Tracing Core第 3 代Tensor Cores第 4 代N…

CRDB-多区域部署

多区域部署允许cockachdb数据库跨越多个地理区域。多区域部署的配置对集群的容错和区域性能有影响。一般来说,我们将一个cockachdb集群配置为多个区域,以实现以下两个目标中的一个或两个: 允许集群在其中一个区域的计算资源不可用时继续服务…

磨金石教育摄影技能干货分享|花朵怎样拍才能不凌乱

喜欢养花种花的朋友,除了享受花朵在自己精心培育下绽放之外,给爱花拍照发在朋友圈炫耀也是一大乐趣之一。 但是别看花朵静静地盛开,娇艳欲滴,想要拍得好看却不是一件容易的事。作为摄影小白常常遇到的情况就是,拍出的花…

即兴发言怎样避免语无伦次?记住这个即兴发言万能公式

作为PMO和项目经理,经常要组织和参与各种会议,在会议中难免需要即兴发言,但是很多人即兴发言时总语无伦次,不知所云,而PMO和项目经理又是依靠外在表现来体现自己的专业性的,这时候就很难获得被人的认可&…

Docker Desktop Installer 安装无反应的,如何解决?

docker教程 Docker 教程 | 菜鸟教程 下载地址: Docker Desktop 官方下载地址: Install on Windows | Docker DocumentationHow to install Docker Desktop for Windowshttps://docs.docker.com/desktop/install/windows-install/ 问题:出…

webpack

webpack一、前端工程化1、前端开发历程2、什么是前端工程化3、前端工程化的解决方案二、webpack的基本使用1、什么是webpack2、列表隔行变色例子3、安装和配置webpack1.安装webpack2.配置webpack4、webpack.config.js的作用5、配置webpack.config.js自定义打包入口和出口三、we…

乘用车排气系统流场的数值模拟

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题背景及意义 1 1.2 国内外研究现状 1 1.3 课题主要研究内容 2 第2章 流体力学及流场分析软件的介绍 4 2.1 概述 4 2.2 流体力学及应用现状 4 2.3 Solidworks软件的应用范围 5 2.4 Flow Simulation 软件简介 5 第3章 排气系统理论…

软件测试的行业现状,我们的未来在哪里?

1.现状 1.1建立软件测试团队的公司规模 可看出主要当前是以中小型公司为主,因为大厂毕竟就那么几个,数量少。 1.2软件测试团队的规模 可看出主要目前的软件测试团队主要是以50人以内的团队为主(外包除外)。 1.3各公司软件测试工作的规范程度 可看出大…

优化器scipy.optimize参考指南

原文:https://mp.weixin.qq.com/s/BDHXQHXSzDk-RTi-VNMNEw 1 scipy.optimize简介 该scipy.optimize包提供几种常用的优化算法。 该模块包含: 1、使用多种算法(例如BFGS,Nelder-Mead单形,牛顿共轭梯度,C…

在线预约系统开发的用途_分享在线预约小程序的作用

在微信小程序上进行在线预约,不管是商家还是顾客,都可以自由选择时间,顾客还可以通过预约小程序,了解到所选服务的详情和功能特色,不必等到去店内听介绍,顾客能节省等候时间,商家能解放招待人力…

【34-业务开发-基础业务-属性组和基本属性-属性组和基本属性建立关联-属性组和基本属性解除关联-未关联属性查询-确认新增】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

【动手学深度学习】权重衰减(含Pytorch从零开始实现的源代码)

目录:权重衰减一、理论知识二、高维线性回归的实现步骤2.1 准备数据2.2 初始化模型参数2.3 定义L2L_2L2​范数惩罚2.4 定义训练代码实现2.5 是否加入正则化2.5.1 忽略正则化2.5.2 加入正则化三、简单实现四、源代码一、理论知识 前面我们已经介绍学习了过拟合的问题…

从发现问题到创造价值 数据智能如何助力商家双11高质量增长?

近年来,随着消费者的购买行为趋于多样化,很多品牌商家开始布局多平台及多渠道的经营,但随之也带来跨平台多渠道经营的数据不互通、生意数字难以追踪的难题。许多商家也借助双11等大促节点,围绕线下和线上开展全域营销,…

[附源码]java毕业设计宿舍管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Bio-Helix丨Bio-Helix艾美捷100bp DNA ladder说明书

Bio-Helix艾美捷100bp DNA ladder (11条条带,100-1,500pb)背景: PCR产物和许多专有质粒的独特组合,用适当的限制性酶消化,产生11个片段,适合用作琼脂糖凝胶电泳的分子量标准。DNA包括100-1500个碱基对的片段。500和15…

【Java开发】 Spring 05 :Project Reactor 响应式流框架(以Reactive方式访问Redis为例)

响应式编程基于 Project Reactor(Reactor 是一个运行在 Java8 之上的响应式框架)的思想,当你做一个带有一定延迟的才能够返回的 IO 操作时,不会阻塞,而是立刻返回一个流,并且订阅这个流,当这个流…

【论文阅读】社交网络传播最大化问题-03

Leader-aware community detection in complex networksLeader-aware community detection algorithm - 领导感知社区检测算法创新点相关工作概念定义基础概念创新概念1. (领导力)2. (边缘紧性)3.(引力)模型…

【javaEE】网络原理(传输层Part1)

努力经营当下,直至未来明朗! 文章目录前言传输层1. 介绍UDP协议2.【TCP】(重难考点)TCP可靠传输的机制1. 确认应答2. 超时重传3. 连接管理(三次握手、四次挥手)【面试题!!】THINK前言…

项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)

目录 说明 外键列设置后自增失效特性演示 ID不设置自增策略,报错问题和解决 设置自增策略冲突问题和解决。 说明 记录在使用SpringBoot MyBatisPlus操作数据库以及和前端页面交互时遇到的问题和解决方式。 1.表主键字段设置外键之后,自增功能失效…

Spring Security使用JSON格式登录

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 Spring Security中默认的登录参数传递的格式是key/value形式,也是表单登录格式。在实际项目中我们可能会通过Json…