声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3399|回复: 2

[其他相关] [求助]viterbi译码源程序

[复制链接]
发表于 2006-4-24 17:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位高手,谁提供一下实现(3,1,3)viterbi译码的源程序,不胜感激!!!
回复
分享到:

使用道具 举报

发表于 2006-5-15 10:26 | 显示全部楼层

回复:(zw123)[求助]viterbi译码源程序

<P>/*<BR>**   File:Viterbi.cpp<BR>**   功能:给定HMM和观察序列,求最可能的状态<BR>*/</P>
<P>//#include "StdAfx.h"<BR>#include &lt;math.h&gt;<BR>#include "hmm.h"<BR>#include "nrutil.h"</P>
<P>#define VITHUGE  100000000000.0</P>
<P>/**************************************************************************<BR>** 函数名称:Viterbi<BR>** 功能:Viterbi算法<BR>** 参数:phmm:HMM结构指针<BR>**       T:观察值的个数<BR>**       O:观察序列<BR>**       delta,psi为中间变量<BR>**       q:求得的最佳状态序列<BR>**       pprob:概率<BR>**/<BR>void Viterbi(HMM *phmm, int T, int *O, double **delta, int **psi, <BR> int *q, double *pprob)<BR>{<BR> int  i, j; /* 状态下标 */<BR> int   t; /* 时间下标 */ </P>
<P> int maxvalind;<BR> double maxval, val;</P>
<P> /* 1. 初始化  */<BR> <BR> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR> {<BR>  delta[1] = phmm-&gt;pi * (phmm-&gt;B[O[1]]);<BR>  psi[1] = 0;<BR> } </P>
<P> /* 2. 递归 */<BR> <BR> for (t = 2; t &lt;= T; t++) <BR> {<BR>  for (j = 1; j &lt;= phmm-&gt;N; j++) <BR>  {<BR>   maxval = 0.0;<BR>   maxvalind = 1; <BR>   for (i = 1; i &lt;= phmm-&gt;N; i++) <BR>   {<BR>    val = delta[t-1]*(phmm-&gt;A[j]);<BR>    if (val &gt; maxval) {<BR>     maxval = val; <BR>     maxvalind = i; <BR>    }<BR>   }<BR>   <BR>   delta[t][j] = maxval*(phmm-&gt;B[j][O[t]]);<BR>   psi[t][j] = maxvalind; </P>
<P>  }<BR> }</P>
<P> /* 3. 终止 */</P>
<P> *pprob = 0.0;<BR> q[T] = 1;<BR> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR> {<BR>  if (delta[T] &gt; *pprob) <BR>  {<BR>   *pprob = delta[T]; <BR>   q[T] = i;<BR>  }<BR> }</P>
<P> /* 4. Path (state sequence) backtracking */</P>
<P> for (t = T - 1; t &gt;= 1; t--)<BR>  q[t] = psi[t+1][q[t+1]];</P>
<P>}</P>
<P>/**************************************************************************<BR>** 函数名称:ViterbiLog<BR>** 功能:Viterbi算法<BR>** 参数:phmm:HMM结构指针<BR>**       T:观察值的个数<BR>**       O:观察序列<BR>**       delta,psi为中间变量<BR>**       q:求得的最佳状态序列<BR>**       pprob:概率<BR>**/<BR>void ViterbiLog(HMM *phmm, int T, int *O, double **delta, int **psi,<BR>        int *q, double *pprob)<BR>{<BR> int     i, j;   /* 状态下标 */<BR> int     t;      /* 时间下标 */<BR> <BR> int     maxvalind;<BR> double  maxval, val;<BR> double  **biot;</P>
<P> /* 0. 预处理 */</P>
<P> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR>  phmm-&gt;pi = log(phmm-&gt;pi);<BR> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR>  for (j = 1; j &lt;= phmm-&gt;N; j++) <BR>  {<BR>   phmm-&gt;A[j] = log(phmm-&gt;A[j]);<BR>  }</P>
<P> biot = dmatrix(1, phmm-&gt;N, 1, T);<BR> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR>  for (t = 1; t &lt;= T; t++) <BR>  {<BR>   biot[t] = log(phmm-&gt;B[O[t]]);<BR>  }<BR> <BR> /* 1. 初始化  */<BR> <BR> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR> {<BR>  delta[1] = phmm-&gt;pi + biot[1];<BR>  psi[1] = 0;<BR> }<BR> <BR> /* 2. 递归 */<BR> <BR> for (t = 2; t &lt;= T; t++) <BR> {<BR>  for (j = 1; j &lt;= phmm-&gt;N; j++) <BR>  {<BR>   maxval = -VITHUGE;<BR>   maxvalind = 1;<BR>   for (i = 1; i &lt;= phmm-&gt;N; i++) <BR>   {<BR>    val = delta[t-1] + (phmm-&gt;A[j]);<BR>    if (val &gt; maxval) <BR>    {<BR>     maxval = val;<BR>     maxvalind = i;<BR>    }<BR>   }<BR> <BR>   delta[t][j] = maxval + biot[j][t]; <BR>   psi[t][j] = maxvalind;<BR> <BR>  }<BR> }<BR> <BR> /* 3. 终止 */<BR> <BR> *pprob = -VITHUGE;<BR> q[T] = 1;<BR> for (i = 1; i &lt;= phmm-&gt;N; i++) <BR> {<BR>  if (delta[T] &gt; *pprob) <BR>  {<BR>   *pprob = delta[T];<BR>   q[T] = i;<BR>  }<BR> }<BR> <BR> <BR> /* 4. 回溯 */</P>
<P> for (t = T - 1; t &gt;= 1; t--)<BR>  q[t] = psi[t+1][q[t+1]];</P>
<P>}<BR></P>
 楼主| 发表于 2006-5-15 16:43 | 显示全部楼层

没有头文件

太感谢了!!<BR>能否再提供一下hmm.h和nrutil.h这两个头文件?<BR>谢谢!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-13 13:25 , Processed in 0.063205 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表