动态规划法之移位译码问题

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Viterbi译码原理 Viterbi译码作为一种高效的纠错编码技术,在数字通信领域具有广泛的应用前景。它通过动态规划的方法在网格图中搜索最优路径,实现了在低信噪比和复杂信道条件下的可靠数据传输。卷积码和Viterbi算法在非常低的信噪比下性能不佳,复杂度随约束长度增加而增加;Turbo码是一种高级的前向纠错码,由两个或多个卷积编码器和一个随机交织器组成,使用迭代解码来逼近最大似然解码的性能,在较低信噪比下接近香农极限的性能。后续我们会介绍Turbo码原理和解码算法。 阅读详情

前言
  同学找我看看一段不到90行的代码,我从下午2点多收到代码,但是直到6点多才完全看懂。可能因为之前没有看题目就直接看代码,所以直接上手就比较痛苦,花的时间也就比较长了。(自我安慰中%>_<%)

题目描述
  题目是一道ACM题,当时看的时候只有15%的通过率,所以也属于比较难的题目了。
  题目的意思大概意思是:移位密码是一种将消息中的每个字符都转换为其他的字符,按照相应的规律。如果有整数K=3,那么字符串 “we will meet at midnight” 将加密为 “zhzloophhwdwplgqljkw”,也就是向后移三位,按照这样的规律。
  先输入一定数量的单词作为字典,然后输入一段表示密文的字符串。根据字符串来解析得到单词,得到的单词都在开始输入的字典里面,结果输出根据密文字符串得到的最少单词。
  具体的要求大家可以去查看,这里我就不在赘述了。《题目链接》

源码参考

# include <iostream>
# include <set>
# include <map>
# include <vector>
# include <list>
# include <cstring>
# include <string>
# include <cstdlib>
using namespace std ;
const int MAX = 1e9 ;
string t ;
int cnt , len ;
string ss [ 100000 ] ;
map < string , int > mmap ;
vector < int > vec ;
int stmin  ; //表示单词数最少的一种情况
int  k  ;
int ansk ;//表示密码采用的K值
void DP ( ){
        int llist [ 300 ] = { 0 } ;
        int num [ 300 ] = { 0 } ;
        int dp [ 300 ] = { 0 } ;
        memset ( dp , -1 , sizeof ( dp ) ) ;
        dp [ 0 ] = 0 ;
        for ( int i = 1 ; i <= len ; i ++ ) {
                int minn = MAX , pos = -1 ;
                map < string , int > :: iterator tmp ;
                for ( int j = 0 ; j < i ; j ++ ) {
                        if ( j == i - 1 ) {
                                if ( llist [ i - 1 ] == i - 2 )     break ;
                        }
                        if ( dp [ j ] != -1 && dp [ j ] + 1 < minn ) {
                                string s ;
                                for ( int h = j ; h < i ; h ++ )
                                        s += t [ h ] ;
                                map < string , int > :: iterator it = mmap . find ( s ) ;
                                if ( it != mmap . end ( ) ) {
                                        minn = dp [ j ] + 1 ;
                                        pos = j ;
                                        tmp = it ;
                                }
                        }
                }
                if ( minn != MAX ) {
                        dp [ i ] = minn ;
                        num [ i ] = tmp -> second ;
                        llist [ i ] = pos ;
                }
        }
        if ( dp [ len ] != -1 && dp [ len ] < stmin && len > dp [ len ] * 2 ) {
                stmin = dp [ len ] ;
                ansk = k ;
                vec . clear ( ) ;
                for ( int i = len ; i ; i = llist [ i ] ) {
                        vec . push_back ( num [ i ] ) ;
                }
        }
}

int main ( )
{
        cin . sync_with_stdio ( false ) ;
        while ( getline ( cin , t ) , t [ 0 ] ) {
                mmap [ t ] = cnt ;
                ss [ cnt ++ ] = t ;
        }   //输入单词
        while ( getline ( cin , t ) , t [ 0 ] != '0' ) {
                stmin = MAX ;
                len = t . size ( ) ;
                for ( k = 0 ; k < 26 ; k ++ ) {
                        DP ( ) ;
                        for ( int i = 0 ; i < len ; i ++ ) {
                                t [ i ] = ( t [ i ] -'a' + 25 ) % 26 + 'a' ;
                        }   //讲K值从0到25循环判断
                }
                if ( stmin == MAX )     cout << "NO SOLUTIONS" << endl ;
                else {
                        cout << "k=" << ansk << ':' ;
                        for ( int i = vec . size ( ) - 1 ; i >= 0 ; i -- ) {
                                cout << ' ' << ss [ vec [ i ] ] ;   //输出结果
                        }
                        cout << endl ;
                }
        }
}
从纠错到5G:卷积码与维特比译码是如何塑造现代通信的? 本文探讨了卷积码与维特比译码在现代通信中的关键作用,从信息论基础到5G技术的演进。通过分析卷积码的编码原理和维特比算法的最优路径搜索,揭示了它们在无线通信、深空链路等场景中的核心价值,并展望了其在未来通信系统中的持续影响。 阅读详情

相关推荐

深入解析[2,1,7]卷积码的MATLAB仿真:从编码到维特比译码的完整实现

本文深入解析了[2,1,7]卷积码的MATLAB仿真实现,从编码原理到维特比译码算法,提供了完整的实现步骤和性能分析。通过详细的代码示例和调试技巧,帮助读者掌握卷积码在无线通信中的应用,并探讨了软判决译码和并行处理等进阶方向。

weixin_29031161的博客 415

原码、反码、补码及移位操作

所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。    反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。 1、原码、反码和补码的表示方法 (1)    原码:在数值前直接加一符号位的表示法

hunnu_denny的专栏 2万+

从纠错到5G:硬判决维特比译码的演进、局限与软判决进阶指南

本文探讨了维特比译码算法从硬判决到软判决的技术演进及其在现代通信系统中的应用。详细分析了硬判决维特比译码的局限性和软判决技术带来的2dB编码增益,并介绍了5G系统中混合译码架构的实践与优化。文章还涵盖了硬件加速和神经译码器的最新进展,为通信工程师提供了全面的技术指南。

weixin_30784501的博客 387

维特比译码的数学之美:从卷积码到动态规划的硬件实现

本文深入剖析了维特比译码的数学原理与硬件实现艺术。文章从卷积码与网格图出发,阐释了动态规划(加比选操作)的核心思想,并重点探讨了如何将算法高效转化为Verilog硬件电路,涵盖硬/软判决的电路差异、幸存路径管理策略以及整体架构设计中的性能与资源权衡。

vv45678的博客 896

【教程4>第7章>第2节】卷积编码与Viterbi译码理论概述和FPGA设计构架

1.通过MATLAB编写一个卷积编码与Viterbi译码算法,作为FPGA设计时的参考依据;2.实现基于FPGA的217卷积编码器;3.实现基于FPGA的维特比译码器——BM分支度量模块;4.实现基于FPGA的维特比译码器——ACS加比选单元;5.实现基于FPGA的维特比译码器——幸存路径存储单元;6.实现基于FPGA的维特比译码器——回溯译码单元;7.卷积编码+维特比译码整体实现;8.卷积编码+维特比译码的编码增益分析和FPGA误码率统计;

FPGA/MATLAB学习教程/源码/项目合作开发 945

【卷积】卷积编码Viterbi译码理论与误码率matlab仿真

卷积码为(2,1,7)标准卷积码,约束长度为7比特,码生成矢量G1=1111001,G2=1011011,(G2反相后输出),该码型共有64个状态。(2,1,7)卷积码的编码结构图如图1所示,该编码器中的寄存器的初值全为0,,输入1比特,根据生成多项式进行运算后,得到2比特的输出,输出后移位寄存器向右移位一次,并重复编码过程。(2,1,7)卷积码译码过程的总体结构可分为4个子模块,分别是分支度量模块,加比选蝶形运算单元,幸存路径存储单元和回溯译码单元。译码器的结构框图如图3所示。

FPGA/MATLAB学习教程/源码/项目合作开发 1579

卷积码编码和维特比译码的MATLAB仿真程序

卷积码编码和维特比译码的MATLAB仿真程序。卷积码是通信系统中广泛使用的前向纠错编码,而维特比译码是实现其最大似然译码的高效算法。

listhi520的博客 1085

卷积码Viterbi译码算法原理及C语言实现

具体而言,卷积码的编码过程是将输入数据和编码器中的状态进行异或操作,输出码字为各个状态对应的结果。Viterbi译码算法是一种最大似然译码算法,根据接收到的含有噪声的码字,寻找出最有可能的原始数据序列。(2) 递推计算:根据接收到的码字和当前状态,计算下一时刻各个状态的路径度量,并记录每个状态的前驱状态。以上代码实现了一个简单的卷积码Viterbi译码算法,通过接收到的码字进行译码,并输出解码结果。(1) 初始化:将所有状态的路径度量初始化为一个很大的值,选择路径度量最小的状态作为起始状态。

2301_79331421的博客 826

m基于FPGA的217卷积编码维特比译码verilog实现,包含testbench不使用IP核

维特比译码是用于最大似然序列估计的一种动态规划算法,广泛应用于卷积编码以及其他序列编码的译码过程中。在卷积编码中,维特比译码器通过构造一棵称为“状态转移图”或“trellis”的树状结构来寻找最有可能的原始信息序列路径。它主要通过卷积算子将信息序列映射成冗余度更高的码字序列。假设维特比译码器面对的是接收到的带有噪声的码字序列y(n),其目标是最小化汉明距离或最大化似然性。其中,prev(Sk​) 表示状态Sk​ 的前驱状态集合,P(y(n)∣Sk​) 是给定当前状态Sk​ 下观测到y(n) 的概率。

fpga/matlab/simulink算法仿真工程 1381

卷积码的维特比译码实现及性能对比(Matlab实现)

我们通过Matlab编写了维特比译码的示例代码,并对不同卷积码的性能进行了对比分析。卷积码的编码方式可以由生成多项式来表示,其中生成多项式的次数决定了卷积码的约束长度。卷积码是一种常用的纠错编码方式,具有较好的纠错性能和高效的解码算法。维特比译码算法的基本思想是,在每个时刻选择最可能的路径,从而找到最优的码字序列。以上是对卷积码的维特比译码实现及性能对比的简要介绍,希望对您有所帮助。为了对不同卷积码的性能进行对比分析,我们选取了常用的几个卷积码,并通过模拟验证其译码性能。二、Matlab实现。

ByteGlide的博客 557

实现卷积编码与维特比译码的C语言项目

卷积编码是一种前向纠错编码技术,它通过将数据流与特定的编码器结构相结合,生成一个扩展的数据序列,从而在接收端恢复原始数据时可以纠正一定数量的错误。卷积编码器的典型结构包含几个移位寄存器和模二加法器。这种方法增加了冗余信息,允许在不重传数据的情况下检测并纠正传输错误,从而提高了数据传输的可靠性。

weixin_42476987的博客 1145

基于FPGA的16QAM+卷积编码Viterbi译码通信系统开发,包含帧同步,高斯信道,误码统计,可设置SNR

本文介绍了基于FPGA的16QAM通信系统开发,系统包含帧同步、卷积编码和维特比译码模块。系统采用16QAM调制解调技术,通过正交调幅法实现信号调制,并详细阐述了16QAM原理、帧同步方法和(2,1,7)卷积编码的维特比译码算法。系统在Vivado2022.2环境下测试,展示了不同SNR条件下的性能表现。提供了Verilog顶层模块接口定义,包含数据输入、调制输出、解调处理及误码统计等信号。该系统实现了从调制、编码到解调、译码的完整通信链路,具有可配置SNR参数和误码统计功能。完整代码可通过博客获取。

fpga/matlab/simulink算法仿真工程 917

MATLAB实现维特比译码与卷积码编码全套教程

卷积码是一种广泛应用于通信系统中的前向纠错编码技术。它通过将输入数据流与一组固定的系数进行卷积操作,生成含有冗余信息的编码数据。这增加了数据的冗余度,使得接收方能够在一定程度的噪声干扰下,通过译码算法重构原始数据。维特比译码算法,是基于动态规划的原理,用于解决卷积码的译码问题。其核心思想是将接收到的编码序列转化成一个树状结构,在树的每个节点上计算一种度量,称为路径度量(path metric)。在树的每一步,我们保留具有最高路径度量的路径,从而使得搜索最优路径变得可行。

weixin_42551310的博客 1284

基于FPGA的QPSK+卷积编码Viterbi译码通信系统开发,包含帧同步,高斯信道,误码统计,可设置SNR

本文介绍了一种基于FPGA的QPSK通信系统,该系统结合了卷积编码和维特比译码技术。系统包含QPSK调制解调、217卷积编码、维特比译码、帧同步和误码统计等模块。通过Vivado2022.2测试表明,加入卷积编码后系统在低信噪比(SNR=7dB)下性能显著提升,相比无编码系统误码率明显降低。文章详细阐述了QPSK调制原理、帧同步机制以及卷积编码和维特比译码的算法理论,并给出了Verilog核心程序结构。该系统适用于无线通信等信道条件恶劣的场景,能够有效提高通信链路可靠性。

fpga/matlab/simulink算法仿真工程 1220

MATLAB实现维特比译码完整项目实战(含全部源文件)

定义生成多项式(八进制)% K=3% 创建Trellis结构% 设置初始状态(通常为0)是神器,一行代码搞定整个状态转移逻辑。生成的trellis结构体包含:字段名含义输入符号数(2)输出符号数(4)numStates状态总数(4)nextStates状态转移矩阵outputs输出映射表可以用验证是否正确。假设你拿到了一个叫lab5.zip的项目包,里面有:convolve.m:主控脚本,负责全流程仿真;show_ber.m。

weixin_35006125的博客 638

手把手教你用SAM模型实现精准图像分割:从环境配置到实战应用

本文详细介绍了如何使用Meta推出的Segment Anything Model(SAM)实现精准图像分割,从环境配置到实战应用的全流程。特别针对电商场景中的商品分割需求,提供了硬件配置、模型下载、API使用及优化策略等实用指南,帮助开发者快速掌握这一强大的深度学习工具。

pepsi的博客 1062

基于FPGA的8PSK+卷积编码Viterbi译码通信系统,包含帧同步,信道,误码统计,可设置SNR

本文介绍了一种基于FPGA的8PSK+卷积编码Viterbi译码通信系统开发方案。系统包含8PSK调制/解调、帧同步、217卷积编码、维特比译码、AWGN信道和误码统计等模块,支持SNR参数设置。通过Verilog实现并在Vivado2022.2环境下测试,展示了不同SNR(7dB/10dB/15dB)下的星座图效果。系统采用8PSK相位调制实现3比特/符号传输,并详细阐述了帧同步、卷积编码和维特比译码等关键技术原理。文中给出了Verilog程序接口和测试方法,最后提供了完整的算法代码获取途径。

fpga/matlab/simulink算法仿真工程 1333

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系,多少钱一套预算?

RCL-0923光伏电站电压\功率自动控制装置(光伏AVC/AGC),能够接收调度DMS下发的调节目标(电压或无功),按既定策略的调节目标计算光伏电站无功功率出力需求,支持总有、无功,最大可调范围、逆变器个数等数据的上送,通过选择控制设备并进行无功功率出力分配,并将最终控制指令自动下达给被控制设备,最终实现光伏电站无功功率控制,实现无功功率、并网点电压的监测和控制,跟踪调度中心下发的电压或无功调节目标值,实现分布式电源的可观可测,可调可控。光伏5G多合一融合终端的功能:群调群控/AGC/AVC功能。

分布式DTU物联网DTU 2607

【硬件测试】基于FPGA的8PSK+卷积编码Viterbi译码硬件片内测试,包含帧同步,信道,误码统计,可设置SNR

本文介绍了基于FPGA的8PSK+卷积编码Viterbi译码通信系统开发,包含帧同步、高斯信道和误码统计功能。系统采用8PSK调制方式,通过卷积编码和维特比译码实现前向纠错,支持SNR参数设置。文章详细阐述了8PSK调制原理、帧同步机制和卷积编码算法,提供了Verilog程序接口和开发板移植方法。硬件测试在vivado2022.2环境下完成,通过ila模块实现了在线数据采集和SNR设置功能。系统包含完整的发射接收模块,可在单板内完成通信测试。

fpga/matlab/simulink算法仿真工程 971

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 509

基于STM32设计的掌上游戏机(运行NES游戏模拟器)详细开发过程

利用STM32单片机移植NES游戏模拟器,完成NES游戏开发,可以玩标准的NES游戏,已测试超级玛丽、魂斗罗之类的都可以正常运行。

4万+

【硬件测试】基于FPGA的QPSK软解调+卷积编码Viterbi译码系统开发,包含帧同步,信道,误码统计,可设置SNR

摘要:本文介绍了一个基于FPGA的QPSK通信系统开发,该系统包含软解调、卷积编码和维特比译码功能。系统采用(2,1,7)卷积码和QPSK调制,支持帧同步、AWGN信道模拟及误码统计,并通过VIO模块实现SNR参数在线配置。硬件测试表明,在SNR=2dB时误码率为0,性能优于传统解调方式。系统由数据源、调制解调、信道编解码等模块组成,采用Verilog实现并通过ILA进行实时监测。该设计融合了QPSK调制、软解调算法和维特比译码技术,为无线通信系统提供了可靠的FPGA实现方案。

fpga/matlab/simulink算法仿真工程 1291

① Django手把手从零开发个人博客-前言

手把手教你从零开始玩转手把手教你从零开始玩转Django,全面学习并了解django的运行机制、开发全流程及线上部署。Django,全面学习并了解django的运行机制、开发全流程及线上部署。 专栏介绍 本套教程遵循Django的设计思想,开门见山,快速切入主题,拒绝拖沓,在实战中学习每一个知识点,提高学习的趣味性以及个人成就感,并且能快速将所学运用到实际项目中。 将从零手把手带着你一步步完成博客的每一个功能,通过实现博客文章列表页、文章详情页、作者页面等功能来学习和了解django的视图查询模块相关知.

轻编程的博客 513
上一篇: 约瑟夫环问题
下一篇: Win7重装后修复Ubuntu引导项
潘建成
博客等级 码龄12年 139粉丝 120原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值