精华内容
下载资源
问答
  • 对《通信原理》第七版(3,1,3)卷积码,进行维特比译码,适合参考。
  • Forward Viterbi AlgorithmForward Viterbi algorithm based on the Python code found at: ...

    Forward Viterbi Algorithm

    Forward Viterbi algorithm based on the Python code found at: http://en.wikipedia.org/wiki/Viterbi_algorithm

    Also included is an example based on the one from the Wikipedia page for a simple 2-state model with 4 observations. To paraphrase:

    Bob tells Alice his daily activities (observations) and Alice wants to determine the most likely weather each day (states). Since Alice lives far away, the weather is unknown to her (hidden). Assuming that the states behave as a Markov process, and the observations have a statistical dependency on the states, the Viterbi algorithm can find the most likely weather pattern (path).

    More information can be found at:

    http://en.wikipedia.org/wiki/Viterbi_algorithm

    展开全文
  • 维特比解码matlab代码使用维特比算法解码卷积码 我可以说Python比MATLAB慢,并且比C语言慢得多
  • 该脚本根据一组观察、状态之间的转移概率、初始概率和观察概率计算最可能的状态序列。
  • 维特比算法实际是用动态规划求解隐马尔可夫模型解码问题,即用动态规划求概率最大路径(最优路径)。代码中有示例,来自李航《统计学习方法》function [Delta,Psi,P,I] = Viterbi(A,B,Pi,O)% 函数功能:利用维特比算法...

    维特比算法实际是用动态规划求解隐马尔可夫模型解码问题,即用动态规划求概率最大路径(最优路径)。代码中有示例,来自李航《统计学习方法》

    function [Delta,Psi,P,I] = Viterbi(A,B,Pi,O)

    % 函数功能:利用维特比算法找到观测序列O的最优路径

    %

    % 参考文献:李航《统计学习方法》

    %

    % 思路:

    % 1,初始化

    % delta_1(i) = Pi_i * b_i(o1), i = 1,2,...,N

    % psi_1(i) = o, i = 1,2,...,N

    % 2,递推,对于t = 2,3,...,T

    % delta_t(i) = max_1-from-1-to-N(delta_t-1(j) * a_ji) * b_i(ot), i = 1,2,...,N

    % psi_t(i) = arg max_1-from-1-to-N(delta_t-1(j) * a_ji), i = 1,2,...,N

    % 3,终止

    % 最优路径概率P* = max_1-from-1-to-N(delta_T(i))

    % 最优路径终点i*_T = arg max_1-from-1-to-N(delta_T(i))

    % 4,最优路径回溯,对于t = T-1,T-2,...,1

    % i*_t = psi_t+1(i*_t+1)

    % 最优路径I* = (i*_1,i*_2,...,i*_T)

    % 【提示:“思路”中的i,j和本程序中的i,j不存在对应关系,只是方便理解原理】

    %

    % 输入:模型参数A,B,Pi,观测序列O

    % 输出:Delta矩阵:在时刻t状态为i的所有单个路径中概率最大值构成的矩阵,

    % 为N*K阶,即行数表示状态数,列数表示时刻。

    % Psi矩阵:在时刻t状态为i的所有单个路径中概率最大路径的第t-1个结点构成的矩阵,

    % 为N*K阶,即行数表示状态数,列数表示时刻。且第一列为0。

    % P:观测序列O的最优路径概率。

    % I:观测序列O的最优路径。

    %

    % 示例:(李航《统计学习方法》P186例10.3)

    % 输入

    % A =

    % 0.5000 0.2000 0.3000

    % 0.3000 0.5000 0.2000

    % 0.2000 0.3000 0.5000

    % B =

    % 0.5000 0.5000

    % 0.4000 0.6000

    % 0.7000 0.3000

    % Pi =

    % 0.2000

    % 0.4000

    % 0.4000

    % O1 =

    % 1

    % 2

    % 1

    % 输出:

    % >>[D,Psi,P,I] = Viterbi(A,B,Pi,O1)

    % D =

    % 0.1000 0.0280 0.0076

    % 0.1600 0.0504 0.0101

    % 0.2800 0.0420 0.0147

    % Psi =

    % 0 3 2

    % 0 3 2

    % 0 3 3

    % P =

    % 0.0147

    % I =

    % 3

    % 3

    % 3

    A_size = size(A);

    O_size = size(O);

    N = A_size(1,1);%状态集个数

    M = A_size(1,2);

    K = O_size(1,1);

    % 计算Delta矩阵第一列值

    Delta = zeros();

    for i = 1:M

    Delta(i,1) = Pi(i) * B(i,O(1,1));

    end

    % 递推计算Delta矩阵剩下值

    Delta_j = zeros();

    Psi = zeros();

    Psi(:,1) = 0;

    for t = 2:K

    for j = 1:N

    for i = 1:M

    Delta_j(i,1) = Delta(i,t-1) * A(i,j) * B(j,O(t,1));

    end

    [max_delta_j,psi] = max(Delta_j); %找到概率最大值

    Psi(j,t) = psi; %放置Psi矩阵

    Delta(j,t) = max_delta_j; %放置Delta矩阵

    end

    end

    [P_better,psi_k] = max(Delta(:,K));

    P = P_better; % 最优路径概率

    I = zeros();

    I(K,1) = psi_k;

    for t = K-1:-1:1

    I(t,1) = Psi(I(t+1,1),t+1); %路径回溯得到最优路径

    end

    展开全文
  • matlab实现的维特比译码,已用数字通信第二版实例验证通过
  • 111011的卷积(2、1、9)解码的MATLAB代码,并使用维特比算法和路径度量进行百分比错误检测和校正的分析。 [问。 B-48] 输入: 选择一个4位数据字(1 1 0 1)作为卷积编码器的输入,并获得相应的代码字。 获得的码字...
  • Viterbi-Algorithm(维特比算法

    万次阅读 2018-07-08 16:39:01
    维特比算法是一个特殊但应用最广的动态规划算法。利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图-篱笆网了(Lattice)的有向图最短路径问题而提出来的。它之所以重要,是因为...

    CSDN博客:皮乾东
    知乎:Htrying
    微博:Htring的微博
    微信公众号:自然语言处理爱好者(ID:NLP_lover)
    文章来自:《数学之美》

    Viterbi-Algorithm算法

    维特比算法是一个特殊但应用最广的动态规划算法。利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图-篱笆网了(Lattice)的有向图最短路径问题而提出来的。它之所以重要,是因为凡是使用隐马尔科夫模型描述的问题都可以用它解码,包括当前的数字通信、语音识别、机器翻译、拼音转汉字、分词等。

    背景

    假定用户(盲打时)输入的拼音时 y1,y2,...,yN y 1 , y 2 , . . . , y N ,对应的汉字是 x1,x2,...,xN x 1 , x 2 , . . . , x N (虽然真正的输入法产品都是以词作为输入单位的,为了便于说明问题及简单起见,以字为单位来解释维特比算法),那么根据当前介绍的工具:

    x1,x2,...,xN=ArgMaxxXP(x1,x2,...,xN|y1,y2,...,yN)=ArgMaxxXNi=1P(yi|xi)P(xi|xi1) x 1 , x 2 , . . . , x N = A r g M a x x ∈ X ⁡ P ( x 1 , x 2 , . . . , x N | y 1 , y 2 , . . . , y N ) = A r g M a x x ∈ X ⁡ ∏ i = 1 N P ( y i | x i ) P ( x i | x i − 1 ) (1)

    输入的可见序列为 y1,y2,...,yN y 1 , y 2 , . . . , y N ,而产生他们的隐含序列是 x1,x2,...,xN x 1 , x 2 , . . . , x N 。可以用下图描述这样一个过程:
    这里写图片描述

    这是一个相对简单的隐马尔科夫链,没用状态跳跃,也没有自环。 P(xi|xi1) P ( x i | x i − 1 ) 是状态之间的转移概率, P(yi|xi) P ( y i | x i ) 是每个状态的产生概率。现在,这个马尔科夫链的每个状态的输出是固定,但是每个状态的值可以变化。比如输出读音”zhong”的字可以是”中”、”种“等多个字。我们不妨抽象一点,用符号 xij x i j 表示状态 xi x i 的第 j j 个可能的值。如果把每个状态按照不同的值展开,就得到下面这个篱笆网络(Lattice):

    这里写图片描述
    在上图中,每个状态有3个或4个值,当然时间中它们可以有任意个值。

    那么从第一个状态到最后一个状态的任何一条路径(Path)都可能产生我们观察到的输出序列Y。当然这些路径的可能性不一样,而我们要做的就是找到最可能的这条路径,并不是很难。但麻烦的是这样的路径组合数非常多,会让序列状态数的增长呈指数式增长。汉语中每个无声调的拼音对应13个左右的国标汉字,假定句子长为10个字,那么这个组合数为13105×1014这个计算量就相当的大了。因此,需要一个最好能和状态数目成正比的算法,而这个算法在1967年首次提出,即维特比算法。

    主要内容

    维特比算法基础

    1.如果概率最大的路径P(或者说是最短路径)经过某个点,比如下图中的 x22 x 22 ,那么这条路径上从起始点S到 x22 x 22 的这一段路径Q,一定是S到 x22 x 22 之间的最短路径。否则,用S到 x22 x 22 的最短路径R代替Q,便构成了一条比P更短的路径,这就和之前的假设矛盾了。

    2.从S到E路径必定经过第i时刻的某个状态,假定第i时刻有k个状态,那么如果记录了从S到i个状态的所有k个节点(所有时刻的所有状态)的最短路径,最终的最短路径必经过其中的一条。这样,在任何时刻,只要考虑非常有限条候选路径即可。

    3.结合以上两点,假定当我们从状态i进入到i+1时,从S到i上各个节点的最短路径已经找到,并且记录到这些节点上,那么在计算出从起点S到第i+1状态的某个结点的最短路径时,只要考虑从S到前一个状态i所有的k个节点的最短路径,以及从这k个节点到 xi+1,j x i + 1 , j 的距离即可。
    这里写图片描述

    维特比算法

    1.从点S触发,对于第一个状态 x1 x 1 的各个节点,不妨假定有 n1 n 1 个,计算出S到它们的距离 d(S,x1i) d ( S , x 1 i ) ,这里的 x1i x 1 i 表示的是状态1的节点,因为只有一步,所以这些都是S到它们各自的最短路径。

    2.(算法的关键)对于第二个状态 x2 x 2 的所有节点,要计算S到它们的最短距离,我们知道,对于特定的节点 x2i x 2 i ,可以经过状态1的 n1 n 1 中的任何一个节点 x1i x 1 i ,当然,对应的路径长度就是 d(S,x2i)=d(S,x1j)+d(x1j,x2i) d ( S , x 2 i ) = d ( S , x 1 j ) + d ( x 1 j , x 2 i ) 。由于j有 n1 n 1 种可能性,我们要一一计算,然后找出最小值。即

    d(S,x2i)=minI=1,n1d(S,x1j)+d(x1j,x2i) d ( S , x 2 i ) = m i n I = 1 , n 1 d ( S , x 1 j ) + d ( x 1 j , x 2 i )

    这样对于第二个状态的每个节点,需要进行 n1 n 1 次乘法计算。假定这个状态有 n2 n 2 个节点,把S这些节点的距离都计算一遍,就有 O(n1n2) O ( n 1 ⋅ n 2 ) 次计算。

    接下来,类似地按照上述方法从第二个状态走到第三个状态,一直走到最好一个状态,就得到了整个网格从头到尾的最短路径。每一步计算的复杂度都和相邻两个状态 Si S i Si+1 S i + 1 各自的节点数目 ni,ni+1 n i , n i + 1 的乘积成正比,即 O(nini+1) O ( n i ⋅ n i + 1 ) 。如果假定这个在这个隐含马尔可夫链中节点最多的状态有D个节点,也就是说整个网格的宽度为D,那么任何一步的复杂度不超过 O(D2) O ( D 2 ) ,由于网格长度是N,所以整个维特比算法的复杂度是 O(ND2) O ( N ⋅ D 2 ) .

    回到最初的问题中,计算量基本上是 13×13×10=1690103 13 × 13 × 10 = 1690 ≈ 10 3 ,这样就降低了很大的计算量。

    总的来说,无论在语音识别、输入法打字中,输入都是按照流(Stream)的方式进行的,只要处理每个状态的时间比讲话,或者打字速度,那么无论输入有多长,解码过程永远就是实时的。
    这里写图片描述

    展开全文
  • 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 );
    
    展开全文
  • viterbi算法

    2015-05-08 20:45:53
    viterbi decode matlab代码; 包括自己实现的matlat viterbi 译码和调用matlab内部模块的代码
  • 维特比解码matlab代码维特比解码器 Matlab Viterbi解码器的实现此程序要求输入1位(nc),代码长度(l),约束长度(kc),要添加到编码后的代码字的错误数,然后程序生成...然后使用维特比解码算法(网格图)进行解码
  • 参考资料:参见 K Vasudevan 的“数字通信和信号处理”一书中的第 3.3.1 节
  • 软输入软输出维特比算法 (SOVA) 解码器的实现。 该实现假设有限长度的网格窗口可用于前向和后向递归。 因此,它非常类似于 SOVA 解码器的硬件实现。 注意:在 MATLAB R13 上的最佳性能! (另请检查: ...
  • Matlab实现Viterbi译码

    2021-04-22 12:54:23
    viterbi译码算法是一种卷积码的解码算法。优点不说了。缺点就是随着约束长度的增加算法的复杂度增加很快。约束长度N为7时要比较的路径就有64条,为8时路径变为128条。 (2<先说编码(举例约束长度为7):编码器7个...
  • 维特比算法作为卷积码的最大似然(ML)解码技术而闻名。 (n,k,m)维特比解码器中的路径存储单元负责跟踪与由路径度量单元指定的尚存路径相关联的信息位。 二进制卷积码由三元组(n,k,m)表示,其中: 每当接收...
  • 该提交考虑了一个案例,您可以根据一件挂在外面的衬衫的状态来推断它是什么天气。... 维特比算法用于解码状态。 所以我的提交完成了这项工作。 该示例可能会更改为包含可以通过 HMM(隐马尔可夫模型)建模的各种问题。
  • hmm算法matlab实现和实例

    热门讨论 2011-10-09 16:48:45
    hmm算法matlab实现和实例 hmm_em.m function [LL, prior, transmat, obsmat, nrIterations] = ... dhmm_em(data, prior, transmat, obsmat, varargin) % LEARN_DHMM Find the ML/MAP parameters of an HMM with ...
  • 此代码实现了卷积码的维特比算法。 输入是接收到的序列(原始编码序列加上噪声)和编码器状态图。 输出是原始编码序列和解码序列。 编码器状态图必须通过矩阵 3 维矩阵 H 提供。还提供了一个 pdf 文件,指示如何...
  • 参考资料:参见 K Vasudevan 所著“数字通信和信号处理”一书中的第 5.2 节
  • 专门为基因结构查找问题编写的 Viterbi 算法matlab 版本的一般实现。 但是,可以对其进行修改以适应用户的目标。 输入: 转移概率矩阵排放概率矩阵初始概率矩阵状态矩阵(即外显子,内含子,基因间等) 序列...
  • 2 维特比译码原理Viterbi译码是卷积码的最大似然译码算法,是一种实用化的概率算法。它的基本思想是把已接收序列与所有可能的发送序列作比较,选择其中码距最小的一个序列作为发送序列。从图2的卷积码网格图可以看出...
  • 目标:使用维特比算法解码卷积编码的数据。 使用的技术:MatLab及其编码和解码功能用于生成网格并比较原始序列和解码序列。 说明:最初以二进制形式生成随机数据(仅1000位0或1),而不使用rand函数。 第1部分编码:...
  • hmm算法matlab实现

    2018-05-10 10:54:53
    隐马尔科夫模型HMM的具体算法代码,学习HMM不可多得的好资源。
  • 列表式的 Viterbi 译码算法 Matlab实现

    千次阅读 2019-06-16 15:14:36
    传统Viterbi译码算法只保留一条最佳路径, 该算法指出当进入每一状态的最佳路径与进入该状态的第二条最佳路径“太近”时就发出重传该帧的请求。但是他们都没有利用第二条最佳路径、第三条最佳路径等的信息来进行译码...
  • MATLAB实现的维特比译码

    热门讨论 2009-09-22 17:21:38
    MATLAB代码实现了卷积编码,BPSK调制,以及维特比译码,其中主要实现维特比译码,附加了Word文档说明。
  • 参考: R. Raheli、A. Polydoros 和 Ching-Kae Tzou,“每个幸存者处理:不确定环境中 MLSE 的一般方法”,在 IEEE Transactions on Communications,第一卷。 43,没有。 2/3/4,第 354-364 页,1995 年 2 月/3 月/...
  • 维特比解码matlab代码CS5114维特比项目 2014年夏天,我在VT参加了CS5114,算法理论。 我们的第一个项目是分析动态编程算法,我选择研究用于解码卷积码的Viterbi算法。 该存储库包括该项目的结果。 内容 该存储库包含...
  • 维特比解码matlab代码YAMCRF-另一个Matlab条件随机场工具包 苏志良(c)2011版权所有。保留所有权利。 作者:苏志良 (zsu2 [at] buffalo [dot] edu) University at Buffalo, SUNY South China Agricultrual ...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 269
精华内容 107
关键字:

维特比算法matlab

matlab 订阅