精华内容
下载资源
问答
  • Matlab实现Viterbi译码
    2021-04-22 12:54:23

    viterbi译码算法是一种卷积码的解码算法。优点不说了。缺点就是随着约束长度的增加算法的复杂度增加很快。约束长度N为7时要比较的路径就有64条,为8时路径变为128条。 (2<

    先说编码(举例约束长度为7):编码器7个延迟器的状态(0,1)组成了整个编码器的64个状态。每个状态在编码器输入0或1时,会跳转到另一个之中。比如110100输入1时,变成101001(其实就是移位寄存器)。并且输出也是随之而改变的。

    这样解码的过程就是逆过程。算法规定t时刻收到的数据都要进行64次比较,就是64个状态每条路有两条分支(因为输入0或1),同时,跳传到不同的两个状态中去,将两条相应的输出和实际接收到的输出比较,量度值大的抛弃(也就是比较结果相差大的),留下来的就叫做幸存路径,将幸存路径加上上一时刻幸存路径的量度然后保存,这样64条幸存路径就增加了一步。在译码结束的时候,从64条幸存路径中选出一条量度最小的,反推出这条幸存路径(叫做回溯),得出相应的译码输出。

    调制方法:BPSK

    信道:channel

    G(D)=[1+D^2, 1+D+D^2]

    更多相关内容
  • Matlab实现 维特比译码

    千次阅读 2021-06-12 15:43:12
    利用matlab实现维特比译码 话不多说,直接展示代码 首先是利用卷积码进行编码 然后加入awgn噪声 最后利用维特比译码 绘制误比特率图像 卷积码进行编码 %% 初始化参数 N = 1000; %序列长度 code_in = randi(2,1,N)...

    利用matlab实现维特比译码

    话不多说,直接展示代码

    1. 首先是利用卷积码进行编码
    2. 然后加入awgn噪声
    3. 最后利用维特比译码
    4. 绘制误比特率图像

    同时我也上传所有的代码文件
    Matlab 实现维特比译码

    在使用时,首先运行encode,对于随机产生的N=1000个比特流进行卷积编码
    然后直接运行show errorbit,它会调用维特比译码的函数viterbi_hard(),同时绘制出在加入awgn白噪声后,不同信噪比下的误比特率。

    卷积码进行编码
    生成向量为 g1: [1,1,1], g2: [1,0,1]

    encode

    %%  初始化参数
    N = 1000; %序列长度
    
    code_in = randi(2,1,N)-1;
    %code_in = [1,1,0,1,1,1,0,0,1];
    N =  length(code_in);
    g1 = [1,1,1];
    g2 =  [1,0,1];
    
    %% 计算 卷积码
    %x_g1
    
    x0 = g1(1) * code_in;
    x1 = g1(2) * code_in;
    x2 = g1(3)* code_in;
    x = xor( x0(2:N), x1(1:N-1) );
    x = [ x0(1), x, x1(N) ];
    x3 = xor(x(3:N+1),x2(1:N-1));
    x_g1 = [x(1:2) ,x3, x2(N) ];
    %x_g2
    x0 = g2(1) * code_in;
    x1 = g2(2) * code_in;
    x2 = g2(3)* code_in;
    x = xor( x0(2:N), x1(1:N-1) );
    x = [ x0(1), x, x1(N) ];
    x3 = xor(x(3:N+1),x2(1:N-1));
    x_g2 = [x(1:2) ,x3, x2(N) ];
    
    %% 合并两路
    
     x = zeros(1,size(x_g1, 2)+size(x_g2, 2));
     x(1:2:end) = x_g1;
     x(2:2:end) = x_g2;
    x = x(1:length(x) - 4);
    
    

    维特比译码
    将状态转移图存在graph中
    decode

    function m = viterbi_hard(x)   
    %% 
    % a 00
    % b 10
    % c 01
    % d 11
    %x = [ 1 1 0 1 0 1 0 0 0 1];
    sizex = size(x);
    s = sizex(2)/2;
    x = [0,0,0,0, x];
    % to record the value 
    val_a = 0;
    val_b = 0;
    val_c = 0;
    val_d = 0;
    
    % graph       aa0    ab1    bc0   bd1    ca0     cb1   dc0   dd1      
    gra =          [ 0,0;    1,1;    1,0;    0,1;    1,1;    0,0;    0,1;    1,0  ];
    
    % to record route 
    ma = zeros(1,s+2);
    mb = zeros(1,s+2);
    mc = zeros(1,s+2);
    md = zeros(1,s+2);
    %% stage 1 and 2
    
    val_a = val_a + dis(gra(1,:), x(1:2));
    ma(1)=0;
    val_b = val_b + dis(gra(2,:), x(1:2));
    mb(1)=1;
    
    mc = mb;
    md = mb;
    val_c = val_b + dis(gra(3,:), x(3:4));
    mc(2)=0;
    val_d = val_b + dis(gra(4,:), x(3:4));
    md(2)=1;
    
    val_a = val_a + dis(gra(1,:), x(3:4));
    ma(2)=0;
    val_b = val_b + dis(gra(2,:), x(3:4));
    mb(2)=1;
    
    for i = 3:s+2
    %     val_a_t =val_a;
    %     val_b_t =val_b;
    %     val_c_t =val_c;
    %     val_d_t =val_d;
    %     tempa = ma;
    %     tempb = mb;
    %     tempc = mc;
    %     tempd = md;
        % for val_a
            if val_a + dis(gra(1,:), x(2*i-1:2*i)) >= val_c + dis(gra(5,:),x(2*i-1:2*i))
                tempa = mc; 
                val_a_t = val_c + dis(gra(5,:),x(2*i-1:2*i));
                tempa(i)=0;
            else
                val_a_t = val_a + dis(gra(1,:),x(2*i-1:2*i));
                tempa = ma;
                tempa(i)=0;
            end
          %for val_b
             if val_a + dis(gra(2,:), x(2*i-1:2*i)) >= val_c + dis(gra(6,:),x(2*i-1:2*i))
                tempb = mc; 
                val_b_t = val_c + dis(gra(6,:),x(2*i-1:2*i));
                tempb(i)=1;
            else
                val_b_t = val_a + dis(gra(2,:),x(2*i-1:2*i));
                tempb = ma;
                tempb(i)=1;         
             end
            
             %for val_c 
                if val_b + dis(gra(3,:), x(2*i-1:2*i)) >= val_d + dis(gra(7,:),x(2*i-1:2*i))
                tempc = md; 
                val_c_t = val_d + dis(gra(7,:),x(2*i-1:2*i));
                tempc(i)=0;
                else
                val_c_t = val_b + dis(gra(3,:),x(2*i-1:2*i));
                tempc = mb;
                tempc(i)=0;
                end
                
          %for val_c
                if val_b + dis(gra(4,:), x(2*i-1:2*i)) >= val_d + dis(gra(8,:),x(2*i-1:2*i))
                tempd = md; 
                val_d_t = val_d + dis(gra(8,:),x(2*i-1:2*i));
                tempd(i)=1;
            else
                val_d_t = val_b + dis(gra(4,:),x(2*i-1:2*i));
                tempd = mb;
                tempd(i)=1;
                end
        val_a =val_a_t;        
        val_b =val_b_t;
        val_c =val_c_t;
        val_d =val_d_t;
        ma = tempa;
        mb = tempb;
        mc = tempc;
        md = tempd;        
    end
    
    if val_a <= val_b
        m = ma;
        t = val_a;
    else
        m = mb;
       t = val_a;
    end
    
    if val_c <= t
        m = mc;
        t =val_c;
    end
    
    if val_d <= t
        m = md;
        t = val_d;
    end
    %% 去掉最开始的00
    m = m(3:s+2);
    

    译码中间用到dis 函数,测量两段序列的海明距离

    dis

    %% function to compute distances between x,y in the form of [0,0]  [1,1]
    function d = dis(x, y)   
      d = sum(xor(x,y));
    
    

    加入噪声,绘制误比特率随snr变化的曲线
    show error bit

    
    errbit  = zeros(1,21);
    for j = -5:15 
    
    y = awgn(x, j, 'measured');
    for i = 1:2*N
        if y(i) >=0.5
            y(i)=1;
        else
            y(i)=0;
        end
    end
    
    
    % 译码
    m=viterbi_hard(y); 
    errbit(j+6) = sum(m~=code_in)/N ;
    
    end
    
    logerr = 10*log10(errbit);
    plot( -5:15, logerr );
    
    展开全文
  • 维特比解码matlab代码使用维特比解码和路径度量的错误检测和纠正 该项目承担的任务是编写用于g1 = 110111和g2 = 111011的卷积(2、1、9)解码的MATLAB代码,并使用维特比算法和路径度量进行百分比错误检测和校正的...
  • matlab实现维特比译码,已用数字通信第二版实例验证通过 matlab实现维特比译码,已用数字通信第二版实例验证通过
  • 信息论课程的一套代码,附有详细的每一部分的代码说明文档。卷积编码采用自己写的代码,完成了217和319码。在MATLAB2016b环境下编译通过
  • 采用MATLAB自编函数对卷积码以及维特比译码进行仿真,且对其性能进行分析。由于卷积码有性能floor,编码增益随信噪比降低而体现不明显。  1.引言  卷积码的编码器是由一个有k位输入、n位输出,且具有m位移位...
  • Viterbi解码器的实现程序要求输入1位(nc),代码长度(l),约束长度(kc),要添加到编码后的代码字的错误数,然后程序生成给定长度的随机比特序列,使用随机生成多项式对生成多项式进行编码,将误差添加到编码...
  • 利用matlab的communication toolbox实现AWGN信道下采用QPSK调制和卷积码编码,然后接收端采用维特比译码并且采用硬判决的系统最终得到的误码率曲线,并且采用BERtool工具将其与理论值进行比较。
  • 维特比解码matlab代码Materl Viterbi解码器算法的实现 维特比算法作为卷积码的最大似然(ML)解码技术而闻名。 (n,k,m)维特比解码器中的路径存储单元负责跟踪与由路径度量单元指定的尚存路径相关联的信息位。 二...
  • 217维特比译码器的FPGA设计

    万次阅读 2019-08-10 15:23:03
    二:viterbi译码器 ...分支度量计算单元是用来计算输入信号序列与卷积码各个可能输出信号序列的似然度量,维特比的似然准则就是在寻找具有最小距离的路径。若译码器采用硬判决译码时,分支度量计算采用...

    0.完整源码获得方式

    订阅MATLAB/FPGA教程,免得获得教程案例以及任意2份完整源码

    ----------------------------------------------------------------------------------------------------

    二:viterbi译码器

       (2,1,7)卷积码译码过程的总体结构可分为4个子模块,分别是分支度量模块,加比选蝶形运算单元,幸存路径存储单元和回溯译码单元。

    译码器的结构框图如图3所示。

     

    展开全文
  • 维特比译码详解

    千次阅读 2022-03-10 12:26:18
    维特比译码算法详细介绍

    1、维特比译码简介

    目前公开的资料中,对维特比译码介绍的最详细、最通俗易懂的文章,推荐“纸上谈芯”的博文:

    卷积码译码之维特比译码算法

        纸上谈芯原文章https://blog.csdn.net/zhouxuanyuye/article/details/78278292?spm=1001.2014.3001.5506

    因此,原理性部分不再赘述,需要了解的可参考该文章。更推荐林舒的《差错控制编码(原书第2版)_[林舒.著][机械工业出版社][2007]》,本文只谈实际应用。

    补充:以下推导维特比译码算法原理

           译码器错误概率为:

                                                  \small P_E=\sum _R P(R)P(E|R)                                                         (1)

        其中,P(E|R)为译码器的条件错误概率,   定义为:

                                               \small P(E|R)=P(\hat{C}\neq C \, | R )

        因此,译码器的最小错误概率可以等效为:

                         min\, P_E=min\, P(E|R)=min \, P(\hat{C}\, \neq C\, |\,R)=max \, P(\hat{C}\, = C\,|\,R)          (2)                  根据贝叶斯公式,     

                                            P(C_i\, |\,R)=\frac{P(C_i)P(R\,|\,C_i)}{P(R)}                                                     (3)

        在先验等概率情况下, max\,P(C_i\,|\,R)\Rightarrow \,P(R\,|\,C_i)  转换成 求使得P(R|C_i)  达到最大的那个码

    字Ci。P(R|C_i) 即似然函数,译码方法为最大似然译码。                                                   

                                           P(R\, |\, C_i)=\prod_{j=1}^{n}P(r_j\, |\, C_{ij})

        若信息长度为L,每个节点有2^k条分支,总共就有:2^(k×L)条不同的路径,CMi为路径度量,表示为:

                                           CM_i=\sum_{m=1}^{L}\sum_{j=1}^{n}log(r_{mj}\, |\, C_{mij})                                                  (4)

               最大似然译码也就是求CMi的最大值,也等效为求R与码字C之间的最小欧式距离

                                           min \sum_{j=1}^{n}\left \| r_j-c_j \right \|^2                                                                    (5)

    2、工程应用

    维特比译码系统可大致分为以下几个单元:分支度量单元(BMU),加比选单元(ACSU),幸存路径存储单元(SMU),回溯路径单元(TBU)。

                                                         图1  Viterbi译码流程框图 

    维特比译码在实际实现时,大体可分为以下步骤:

    1)数据预处理:

        根据卷积码(n,k,m)参数,以及生成多项式G确定维特比算法中几个重要的数组:

    1. next_state[{2}^{m}][2^{k}] —— 根据当前输入比特(共k bit),确定寄存器下一时刻的状态(寄存器为m bit)
    2. out_put [{2}^{m}][2^{k}] —— 根据当前输入比特(共k bit),确定当前输出比特(每一时隙 k 比特输入, n bit 输出)
    3. input[{2}^{m}] [{2}^{m}] —— 根据当前状态和下一状态的组合,确定当前输入比特(对算法很重要)

         对于数组next_state, out_put,在应用matlab仿真时很容易得到。例如,(3,1,2)卷积码,生成矩   阵为G=[ 1 0 0 ; 1 1 1; 1 0 1],当输入:

    ConstraintLength = 3;
    CodeGenerator = [4,7,5];
    trellis = poly2trellis(ConstraintLength,CodeGenerator);

    可得到:

     matlab给出的网格参数trellis不包含Input参数,因此可以利用代码自行实现:

    %可以用trellis网格图 nextStates,outputs来验证计算是否正确
    for j=0:number_of_states-1      
       	
        %m为从k个输入端的信号组成的状态,总的状态数为2^k,所以循环从0到2^k-1    								
        for m=0:M-1                                             	
            
            %next_state完成从当前的状态和输入的矢量得出寄存器组的下一个状态
            [next_state,memory_contents]=nxt_stat(j,m,N,k);
            
            %存储寄存器当前输入的信息位M1
            input(j+1,next_state+1)=m; 
            
            %输出码元
            branch_output=rem(memory_contents*G',2);
            %存储寄存器下一状态(M2M3)
            nextstate(j+1,m+1)=next_state;    
            %以十进制存储所有输出码元
            output(j+1,m+1)=bin2deci(branch_output);       
        end
    end

    2)译码过程

        根据算法的特点,我们知道其核心思想就是找出众多幸存路径中汉明距离最小的那一条路径,即根据网格图,将上一节点的汉明距离,上“当前输出比特与实际接收数据的汉明距离度量”,并较所有输出可能性,择当前时隙的幸存路径,即ACS过程(Add-Compare-Select)。

        由于精力有限,本文只附上详尽的算法理解手稿,希望能帮助大家理解该过程:

    3)译码结果输出

         根据幸存路径,确定最终幸存状态数组state_sequence:

    %	从最佳路径中产生解码
    %	译码过程可从数组survivor_state的最后一个位置向前逐级译码
    state_sequence=zeros(1,depth_of_trellis+1);
    
    state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
    
    for i=1:depth_of_trellis
    
      state_sequence(1,depth_of_trellis-i+1)=
      survivor_state((state_sequence(1,depth_of_trellis+2-i)+1),depth_of_trellis+2-i);
    
    end

        最后,再根据状态序列当前状态和下一状态,反推出当前输入(用input数组确定):

    for i=1:depth_of_trellis-N
    
        %根据数组input的定义来得出从当前状态到下一个状态的输入信号矢量
    
        dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);
        dec_output_bin=deci2bin(dec_output_deci,k);
    
         %将一次译码存入译码输出矩阵decoder_output_matrix相应的位置
        decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';
    end

    最后,给出维特比译码仿真链接:

    维特比译码(3,1,2)仿真

    需要的可以自行下载

    展开全文
  • 卷积编码及维特比译码-卷积编码及维特比译码.rar 卷积编码及维特比译码相关文献 1.bmp
  • 维特比译码213,维特比译码217源码

    千次阅读 2021-04-11 13:02:08
    % 将经过信道的编码序列转换为以需要译码的个数为行数,以n为列数的矩阵 survivor_state=zeros(number_of_states,depth_of_trellis+1); % 4行,7列 (初始化) % 开始无尾信道输出解码 for i=1:depth_of_trellis-L+1 ...
  • MATLAB实现QAM调制和软解调,同时实现卷积码编码和维特比译码
  • 维特比译码

    千次阅读 2020-10-06 15:27:51
    为降低误码率,实现可靠性通信,通常采用的途径有两种:一种是通过选择高质量的传输线路、改善信道的传输特性、增加发送信号的功率、选择有较强抗干扰能力的调制解调方式等,来降低信道本身引起的误码;另一种是通过...
  • 1.仿真代码 clear all ... %Viterbi译码器回溯深度 msg = randi([0,1],1,N); %消息比特序列 msg1 = convenc(msg,tre1); %卷积编码 x1 = pskmod(msg1,M); %BPSK调制 for ii=1:length(EbN0) ii y = awgn(x1
  • Matlab卷积编码器维特比译码-通信专业课程设计

    千次阅读 热门讨论 2017-04-17 20:48:06
    首先是演示代码,首先输入输入信号,用m序列加扰(演示里只用16位长度的m序列),再1/3卷积编码,接收端先维特比解码,再解扰,得到原始信号 Demo.m   function demo input=[1 0 1 1 0 1 0 0 0 1 1];%输入信号 ...
  • BCC卷积码的维特比译码算法_matlab_demo 自己参照原理写的维特比译码算法 对(2,1,7)217卷积码数据进行加高斯白噪声,对比不同信噪比下的维特比译码误比特率 使用:在matlab直接跑CC_SimTest.m可运行
  • 维特比解码matlab代码无线网络 Matlab项目:matlab中的Viterbi算法 目标:使用维特比算法解码卷积编码的数据。 使用的技术:MatLab及其编码和解码功能用于生成网格并比较原始序列和解码序列。 说明:最初以二进制...
  • 维特比解码matlab代码使用维特比算法解码卷积码 我可以说Python比MATLAB慢,并且比C语言慢得多
  • 维特比译码

    2014-05-22 22:35:22
    维特比译码器,卷积码编码器的译码,Matlab编写,亲测通过
  • MATLAB实现维特比译码

    热门讨论 2009-09-22 17:21:38
    MATLAB代码实现了卷积编码,BPSK调制,以及维特比译码,其中主要实现维特比译码,附加了Word文档说明。
  • 卷积码是一种性能优越的信道编码,它的编码器和解码器都比较易于实现,同时还具有较强的纠错能力,这使得它的使用越来越广泛。
  • matlab viterbi译码详解

    2021-05-26 11:21:52
    %x为输入的待译码序列 x=importdata('data.txt');%长度不限,只需要长度为偶数 a=size(x); %输入序列的长度 s=a(2)/2; %译码后的m序列长度为x的一半 m=zeros(1,s); %最终结果存放 ma=zeros(1,s); %存放Fa路径的 mb=...
  • 基于matlab多种卷积码及维特比译码下的误码率分析,支持多种类型卷积码,支持多种类型文件源的通信系统仿真
  • % 2011-3-29 从matlab demos 当中找来的关于卷积编码和维特比译码的实例figure(1) %subplot(211) %EbNo = 4.5:.5:7; linEbNo = 10.^(EbNo(:).*0.1);M = 4; codeRate = 1/2; constlen = 7; k = log2(M); codegen = ...
  • (171,133)卷加码及其2/3、3/4码率删除码的编译码,对比不同码率在不同信噪比条件下的抗噪声性能
  • 自己实现维特比译码 我附上所有文件,首先运行convolve, 再跑show_ber即可

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

matlab实现维特比译码

matlab 订阅