积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> DSP >> DSP代码示例
  相关分类: 应用论文 | TI DSP | 新产品 | 算法 | 下载 | DSP代码示例 | ADI DSP | freescale DSP |
Viterbi译码C程序
 
作者:未知   来源:互联网    点击数:803   更新时间:2007-2-7
您可以添加到网摘 让更多人关注此文章:

    

#include "main.h"
// 微分真值表,第4和第5位用于发送,第0和第0位用于接收
char Diff[] =  
      { 0x00, 0x11, 0x23, 0x32, 0x11, 0x00, 0x32, 0x23, 0x22, 0x33, 0x10, 0x01, 0x33, 0x22, 0x01, 0x10 };
// 延迟状态发送矩阵,用于回溯当前状态
char TMBackward[8][4] = {
      0, 3, 1, 2, 14
      4, 7, 6, 5, 15
      1, 2, 0, 3, 16
      5, 6, 7, 4, 17
      2, 1, 3, 0, 18
      7, 4, 5, 6, 19
      3, 0, 2, 1, 20
      6, 5, 4, 7 21
      };

char Tdr, DelayState[16][8], PathState[16][2], DStCurr;
int AccDist[8];
// 初始化函数
void Init ()
{
      short i, j;
      DStCurr = 0;
      Tdr = 0;
      AccDist[0] = 0;
      for (i = 1; i < 8; i++)
            AccDist[i] = (1 << 10) / 2;
      for (j = 0; j < 16; j++)
            for (i = 0; i < 8; i++)
                  DelayState[j][i] = 0;
      for (j = 0; j < 16; j++)
            for (i = 0; i < 2; i++)
                  PathState[j][i] = 0;
}
// 译码
int Viterbi (int Xi, int Yi, int modd)
{
      short State[8], Xb, Yb, Nx, Ny, Qx, Qy, Ix, Iy, Id;
      short c, i, j, tmp1, tmp2, tmp3, tmp4, tt, ss, pp;
      int Distance[8], dist1, dist0, DataOut, Sht;
      Mod *Mcurr;

      Mcurr = (Mod*) modd;
      Sht = Mcurr->TSht;
// Xi和Yi是输入,首先得到最低距离
      for (c = 0; c < 8; c++)
{
     Xb = (Mcurr->TXs[c]) << 10;        Yb = (Mcurr->TYs[c]) << 10;
     Nx = Mcurr->TNx[c];               Ny = Mcurr->TNy[c];
     Qx = (Mcurr->TQx) << 10;          Qy = (Mcurr->TQy) << 10;
     Iy = Ny;
     for (i = 0; i < Ny; i++)
          {
               if (Yi < Yb) { Iy = i; break; }
               Yb += Qy;
          }
     Ix = Nx;
     for (i = 0; i < Nx; i++)
          {
               if (Xi < Xb) { Ix = i; break; }
               Xb += Qx;
          }
     Id = Iy * (Nx + 1) + Ix;
     State[c] = *(Mcurr->St[c] + Id);
     tmp1 = *(Mcurr->Xc[c] + Id);
     tmp2 = *(Mcurr->Yc[c] + Id);
     if (State[c] != SS)
     {
          tmp3 = Xi - (tmp1 << 10);
          tmp4 = Yi - (tmp2 << 10);
          Distance[c] = (int)tmp3 * (int)tmp3 + (int)tmp4 * (int)tmp4;
     }
     else
     {
          tmp3 = Xi - (*(Mcurr->Xc[c] + tmp1) << 10);
          tmp4 = Yi - (*(Mcurr->Yc[c] + tmp1) << 10);
          dist1 = (int)tmp3 * (int)tmp3 + (int)tmp4 * (int)tmp4;
          tmp3 = Xi - (*(Mcurr->Xc[c] + tmp2) << 10);
          tmp4 = Yi - (*(Mcurr->Yc[c] + tmp2) << 10);
          Distance[c] = (int)tmp3 * (int)tmp3 + (int)tmp4 * (int)tmp4;
          State[c] = *(Mcurr->St[c] + tmp2);
          if (dist1 < Distance[c])
          {
               Distance[c] = dist1;
               State[c] = *(Mcurr->St[c] + tmp1);
          }
     }
}
// 在路径状态0~7中寻找最短距离
dist0 = 0x7FFFFFFF;
for (c = 0; c < 4; c++)
{
     if (Distance[c] < dist0)
     {
          dist0 = Distance[c];
          Id = c;
     }
 }
DelayState[DStCurr][0] = TMBackward[0][Id];
DelayState[DStCurr][2] = TMBackward[2][Id];
DelayState[DStCurr][4] = TMBackward[4][Id];
DelayState[DStCurr][6] = TMBackward[6][Id];
PathState[DStCurr][0] = State[Id];

dist1 = 0x7FFFFFFF;
for (c = 4; c < 8; c++)
     {
          if (Distance[c] < dist1)
          {
               dist1 = Distance[c];
               Id = c;
          }
      }
DelayState[DStCurr][1] = TMBackward[1][Id-4];
DelayState[DStCurr][3] = TMBackward[3][Id-4];
DelayState[DStCurr][5] = TMBackward[5][Id-4];
DelayState[DStCurr][7] = TMBackward[7][Id-4];
PathState[DStCurr][1] = State[Id];
// 更新距离累加值
for (i = 0; i < 8; i++)
      Distance[i] = AccDist[i];
for (i = 0; i < 8; i++)
{
      Id = DelayState[DStCurr][i];
      AccDist[i] = Distance[Id] / 8 * 7;
}
for (i = 0; i < 8; i+=2)
      AccDist[i] += dist0 / 8;
for (i = 1; i < 8; i+=2)
      AccDist[i] += dist1 / 8;

dist0 = 0x7FFFFFFF;
for (i = 0; i < 8; i++)
{
      if (AccDist[i] < dist0)
      {
            dist0 = AccDist[i];
            Id = i;
      }
}
j = DStCurr;
for (i = 0; i < 15; i++)
{
     Id = DelayState[j][Id];
     j--; if (j < 0) j = 15;
}
tt = PathState[j][Id % 2];
DStCurr++;
if (DStCurr >= 16) DStCurr = 0;
     ss = tt & ((1 << Sht) - 1);
     tt = (tt >> Sht) & 0x03;
     pp = (tt << 2) | Tdr;
     Tdr = tt;
     DataOut = ((Diff[pp] & 0x03) << Sht) | ss;
     return (DataOut);
}



相关文章
· 科技奥运与计算机技术的应用[425]
· Electromedical[2693]
· 患者监控[2742]
· 基于TMS320LF2407A DSP的心电监护系统研究[3187]
· 用S3C2410实现三导联远程心电监护系统[3096]
热门评论排行
·VHDL设计中电路简化问题的
·ARM嵌入式系统基础教程(N
·江苏嵌入式Linux教育培训
·ARM处理器应用开发4步骤
·锐极LINUX驱动培训班定于

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
严冬期如何发展半导体业 扩
2008年中国集成电路市场回顾与展望
分析师:亚洲芯片厂商库存远超预期
2008年基础电子业十大事件点评
Aptina并购智多微手机软件平台设
凌力尔特公司推出用于多核处理器的&n
安森美半导体任命麦满权为韩国及南亚区
Broadcom:半导体产业依然机会
飞思卡尔推i.MX51芯 
日立芯片守卫新年倒数计时晚会
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
低价专业PCB打样 双面板20...
深圳市天漠科技超低价供应atm...
深圳市天漠科技超低价供应ARM...
[推荐]2.5米精度,高灵敏度...
830实验箱+电脑没有并口...
[原创]平望科技助力自服终端国...
低价专业PCB打样 双面板20...
[原创]低价专业PCB打样 双...
Bootloader for ...
【有奖调查】08-09嵌入式开...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网