网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> 综合代码 >> 文章正文
  Viterbi译码汇编程序         ★★★ 【字体:
Viterbi译码汇编程序
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-17    

  .bss Tdr,4,4       ; 微分Tdr值
  .bss DStCurrbss,4,4      ; 当前延迟状态指针
  .bss DelayPath,320,4      ; 延迟状态和路径状态向量(半字格式)
  .bss AccDist,32,4      ; 距离累积值向量(字格式)

  .bss Distance,32,4      ; 距离结果向量(字格式)
  .bss Dummy,2,2       ; 允许同步进入
  .bss State,16,4       ; 状态向量(半字格式)
  .bss MCurr,4,4       ; 存储当前调制指针

SK   .set 1024        ; 比例因子

  .sect "LUTable"

MMMMM  .set 0x7FFF      ; 有符号数据最大值
SS    .set 0xFFFF      ; 无符号数据最大值
SZ    .set 3       ; 数据指针字大小

 .def _M14        
_M14:          ; 调整方式为14.4 kbps
 .int M140         ; 首地址
 .int 0x35E        ; 提取第4和第5位
 .int 0x39C        ; 提取第0到第3位
 .int 4         ; 移位累加值

M140 .int M141        ; 下一个地址
 .short -5*SK,-6*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ   ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -7*SK,-4*SK,-3*SK,-8*SK,0x05,0x00    ; Y0,X0,Y1,X1,S0,S1
 .short -7*SK,-4*SK,MMMMM,MMMMM,0x05,SS
 .short -7*SK,+0*SK,MMMMM,MMMMM,0x07,SS
 .short -7*SK,+4*SK,MMMMM,MMMMM,0x03,SS
 .short -7*SK,+4*SK,-3*SK,+8*SK,0x03,0x01
 .short -3*SK,-8*SK,MMMMM,MMMMM,0x00,SS
 .short -3*SK,-4*SK,MMMMM,MMMMM,0x04,SS
 .short -3*SK,+0*SK,MMMMM,MMMMM,0x06,SS
 .short -3*SK,+4*SK,MMMMM,MMMMM,0x02,SS
 .short -3*SK,+8*SK,MMMMM,MMMMM,0x01,SS
 .short +1*SK,-8*SK,MMMMM,MMMMM,0x08,SS
 .short +1*SK,-4*SK,MMMMM,MMMMM,0x0C,SS
 .short +1*SK,+0*SK,MMMMM,MMMMM,0x0E,SS
 .short +1*SK,+4*SK,MMMMM,MMMMM,0x0A,SS
 .short +1*SK,+8*SK,MMMMM,MMMMM,0x09,SS
 .short +5*SK,-4*SK,+1*SK,-8*SK,0x0D,0x08
 .short +5*SK,-4*SK,MMMMM,MMMMM,0x0D,SS
 .short +5*SK,+0*SK,MMMMM,MMMMM,0x0F,SS
 .short +5*SK,+4*SK,MMMMM,MMMMM,0x0B,SS
 .short +5*SK,+4*SK,+1*SK,+8*SK,0x0B,0x09

M141 .int M142           ; 下一个地址
 .short -3*SK,-6*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ    ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -5*SK,-4*SK,-1*SK,-8*SK,0x1B,0x19     ; Y0,X0,Y1,X1,S0,S1
 .short -5*SK,-4*SK,MMMMM,MMMMM,0x1B,SS
 .short -5*SK,+0*SK,MMMMM,MMMMM,0x1F,SS
 .short -5*SK,+4*SK,MMMMM,MMMMM,0x1D,SS
 .short -5*SK,+4*SK,-1*SK,+8*SK,0x1D,0x18
 .short -1*SK,-8*SK,MMMMM,MMMMM,0x19,SS
 .short -1*SK,-4*SK,MMMMM,MMMMM,0x1A,SS
 .short -1*SK,+0*SK,MMMMM,MMMMM,0x1E,SS
 .short -1*SK,+4*SK,MMMMM,MMMMM,0x1C,SS
 .short -1*SK,+8*SK,MMMMM,MMMMM,0x18,SS
 .short +3*SK,-8*SK,MMMMM,MMMMM,0x11,SS
 .short +3*SK,-4*SK,MMMMM,MMMMM,0x12,SS
 .short +3*SK,+0*SK,MMMMM,MMMMM,0x16,SS
 .short +3*SK,+4*SK,MMMMM,MMMMM,0x14,SS
 .short +3*SK,+8*SK,MMMMM,MMMMM,0x10,SS
 .short +7*SK,-4*SK,+3*SK,-8*SK,0x13,0x11
 .short +7*SK,-4*SK,MMMMM,MMMMM,0x13,SS
 .short +7*SK,+0*SK,MMMMM,MMMMM,0x17,SS
 .short +7*SK,+4*SK,MMMMM,MMMMM,0x15,SS
 .short +7*SK,+4*SK,+3*SK,+8*SK,0x15,0x10
 
M142 .int M143 ; Next address
 .short -7*SK,-4*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ    ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -9*SK,-2*SK,-5*SK,-6*SK,0x28,0x2D     ; Y0,X0,Y1,X1,S0,S1
 .short -9*SK,-2*SK,MMMMM,MMMMM,0x28,SS
 .short -9*SK,+2*SK,MMMMM,MMMMM,0x20,SS
 .short -9*SK,+2*SK,-5*SK,+6*SK,0x20,0x25
 .short -5*SK,-6*SK,MMMMM,MMMMM,0x2D,SS
 .short -5*SK,-2*SK,MMMMM,MMMMM,0x2C,SS
 .short -5*SK,+2*SK,MMMMM,MMMMM,0x24,SS
 .short -5*SK,+6*SK,MMMMM,MMMMM,0x25,SS
 .short -1*SK,-6*SK,MMMMM,MMMMM,0x2F,SS
 .short -1*SK,-2*SK,MMMMM,MMMMM,0x2E,SS
 .short -1*SK,+2*SK,MMMMM,MMMMM,0x26,SS
 .short -1*SK,+6*SK,MMMMM,MMMMM,0x27,SS
 .short +3*SK,-6*SK,MMMMM,MMMMM,0x2B,SS
 .short +3*SK,-2*SK,MMMMM,MMMMM,0x2A,SS
 .short +3*SK,+2*SK,MMMMM,MMMMM,0x22,SS
 .short +3*SK,+6*SK,MMMMM,MMMMM,0x23,SS
 .short +7*SK,-2*SK,+3*SK,-6*SK,0x29,0x2B
 .short +7*SK,-2*SK,MMMMM,MMMMM,0x29,SS
 .short +7*SK,+2*SK,MMMMM,MMMMM,0x21,SS
 .short +7*SK,+2*SK,+3*SK,+6*SK,0x21,0x23
 
M143 .int M144 ; Next address
 .short -5*SK,-4*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ   ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -7*SK,-2*SK,-3*SK,-6*SK,0x31,0x33    ; Y0,X0,Y1,X1,S0,S1
 .short -7*SK,-2*SK,MMMMM,MMMMM,0x31,SS
 .short -7*SK,+2*SK,MMMMM,MMMMM,0x39,SS
 .short -7*SK,+2*SK,-3*SK,+6*SK,0x39,0x3B
 .short -3*SK,-6*SK,MMMMM,MMMMM,0x33,SS
 .short -3*SK,-2*SK,MMMMM,MMMMM,0x32,SS
 .short -3*SK,+2*SK,MMMMM,MMMMM,0x3A,SS
 .short -3*SK,+6*SK,MMMMM,MMMMM,0x3B,SS
 .short +1*SK,-6*SK,MMMMM,MMMMM,0x37,SS
 .short +1*SK,-2*SK,MMMMM,MMMMM,0x36,SS
 .short +1*SK,+2*SK,MMMMM,MMMMM,0x3E,SS
 .short +1*SK,+6*SK,MMMMM,MMMMM,0x3F,SS
 .short +5*SK,-6*SK,MMMMM,MMMMM,0x35,SS
 .short +5*SK,-2*SK,MMMMM,MMMMM,0x34,SS
 .short +5*SK,+2*SK,MMMMM,MMMMM,0x3C,SS
 .short +5*SK,+6*SK,MMMMM,MMMMM,0x3D,SS
 .short +9*SK,-2*SK,+5*SK,-6*SK,0x30,0x35
 .short +9*SK,-2*SK,MMMMM,MMMMM,0x30,SS
 .short +9*SK,+2*SK,MMMMM,MMMMM,0x38,SS
 .short +9*SK,+2*SK,+5*SK,+6*SK,0x38,0x3D
 
M144 .int M145          ; 下一个地址
 .short -4*SK,-5*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ   ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -6*SK,-3*SK,-2*SK,-7*SK,0x4B,0x49    ; Y0,X0,Y1,X1,S0,S1
 .short -6*SK,-3*SK,MMMMM,MMMMM,0x4B,SS
 .short -6*SK,+1*SK,MMMMM,MMMMM,0x4F,SS
 .short -6*SK,+5*SK,MMMMM,MMMMM,0x4D,SS
 .short -6*SK,+5*SK,-2*SK,+9*SK,0x4D,0x48
 .short -2*SK,-7*SK,MMMMM,MMMMM,0x49,SS
 .short -2*SK,-3*SK,MMMMM,MMMMM,0x4A,SS
 .short -2*SK,+1*SK,MMMMM,MMMMM,0x4E,SS
 .short -2*SK,+5*SK,MMMMM,MMMMM,0x4C,SS
 .short -2*SK,+9*SK,MMMMM,MMMMM,0x48,SS
 .short +2*SK,-7*SK,MMMMM,MMMMM,0x41,SS
 .short +2*SK,-3*SK,MMMMM,MMMMM,0x42,SS
 .short +2*SK,+1*SK,MMMMM,MMMMM,0x46,SS
 .short +2*SK,+5*SK,MMMMM,MMMMM,0x44,SS
 .short +2*SK,+9*SK,MMMMM,MMMMM,0x40,SS
 .short +6*SK,-3*SK,+2*SK,-7*SK,0x43,0x41
 .short +6*SK,-3*SK,MMMMM,MMMMM,0x43,SS
 .short +6*SK,+1*SK,MMMMM,MMMMM,0x47,SS
 .short +6*SK,+5*SK,MMMMM,MMMMM,0x45,SS
 .short +6*SK,+5*SK,+2*SK,+9*SK,0x45,0x40
 
M145 .int M146           ; 下一个地址
 .short -4*SK,-7*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ    ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -6*SK,-5*SK,-2*SK,-9*SK,0x55,0x50     ; Y0,X0,Y1,X1,S0,S1
 .short -6*SK,-5*SK,MMMMM,MMMMM,0x55,SS
 .short -6*SK,-1*SK,MMMMM,MMMMM,0x57,SS
 .short -6*SK,+3*SK,MMMMM,MMMMM,0x53,SS
 .short -6*SK,+3*SK,-2*SK,+7*SK,0x53,0x51
 .short -2*SK,-9*SK,MMMMM,MMMMM,0x50,SS
 .short -2*SK,-5*SK,MMMMM,MMMMM,0x54,SS
 .short -2*SK,-1*SK,MMMMM,MMMMM,0x56,SS
 .short -2*SK,+3*SK,MMMMM,MMMMM,0x52,SS
 .short -2*SK,+7*SK,MMMMM,MMMMM,0x51,SS
 .short +2*SK,-9*SK,MMMMM,MMMMM,0x58,SS
 .short +2*SK,-5*SK,MMMMM,MMMMM,0x5C,SS
 .short +2*SK,-1*SK,MMMMM,MMMMM,0x5E,SS
 .short +2*SK,+3*SK,MMMMM,MMMMM,0x5A,SS
 .short +2*SK,+7*SK,MMMMM,MMMMM,0x59,SS
 .short +6*SK,-5*SK,+2*SK,-9*SK,0x5D,0x58
 .short +6*SK,-5*SK,MMMMM,MMMMM,0x5D,SS
 .short +6*SK,-1*SK,MMMMM,MMMMM,0x5F,SS
 .short +6*SK,+3*SK,MMMMM,MMMMM,0x5B,SS
 .short +6*SK,+3*SK,+2*SK,+7*SK,0x5B,0x59
 
M146 .int M147           ; 下一个地址
 .short -6*SK,-5*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ    ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -8*SK,-3*SK,-4*SK,-7*SK,0x61,0x63     ; Y0,X0,Y1,X1,S0,S1
 .short -8*SK,-3*SK,MMMMM,MMMMM,0x61,SS
 .short -8*SK,+1*SK,MMMMM,MMMMM,0x69,SS
 .short -8*SK,+1*SK,-4*SK,+5*SK,0x69,0x6B
 .short -4*SK,-7*SK,MMMMM,MMMMM,0x63,SS
 .short -4*SK,-3*SK,MMMMM,MMMMM,0x62,SS
 .short -4*SK,+1*SK,MMMMM,MMMMM,0x6A,SS
 .short -4*SK,+5*SK,MMMMM,MMMMM,0x6B,SS
 .short +0*SK,-7*SK,MMMMM,MMMMM,0x67,SS
 .short +0*SK,-3*SK,MMMMM,MMMMM,0x66,SS
 .short +0*SK,+1*SK,MMMMM,MMMMM,0x6E,SS
 .short +0*SK,+5*SK,MMMMM,MMMMM,0x6F,SS
 .short +4*SK,-7*SK,MMMMM,MMMMM,0x65,SS
 .short +4*SK,-3*SK,MMMMM,MMMMM,0x64,SS
 .short +4*SK,+1*SK,MMMMM,MMMMM,0x6C,SS
 .short +4*SK,+5*SK,MMMMM,MMMMM,0x6D,SS
 .short +8*SK,-3*SK,+4*SK,-7*SK,0x60,0x65
 .short +8*SK,-3*SK,MMMMM,MMMMM,0x60,SS
 .short +8*SK,+1*SK,MMMMM,MMMMM,0x68,SS
 .short +8*SK,+1*SK,+4*SK,+5*SK,0x68,0x6D
 
M147 .int M140           ; 下一个地址
 .short -6*SK,-3*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ    ; Ys,Xs,Yq,Xq,Ny+1,Nx+1
 .short -8*SK,-1*SK,-4*SK,-5*SK,0x78,0x7D     ; Y0,X0,Y1,X1,S0,S1
 .short -8*SK,-1*SK,MMMMM,MMMMM,0x78,SS
 .short -8*SK,+3*SK,MMMMM,MMMMM,0x70,SS
 .short -8*SK,+3*SK,-4*SK,+7*SK,0x70,0x75
 .short -4*SK,-5*SK,MMMMM,MMMMM,0x7D,SS
 .short -4*SK,-1*SK,MMMMM,MMMMM,0x7C,SS
 .short -4*SK,+3*SK,MMMMM,MMMMM,0x74,SS
 .short -4*SK,+7*SK,MMMMM,MMMMM,0x75,SS
 .short +0*SK,-5*SK,MMMMM,MMMMM,0x7F,SS
 .short +0*SK,-1*SK,MMMMM,MMMMM,0x7E,SS
 .short +0*SK,+3*SK,MMMMM,MMMMM,0x76,SS
 .short +0*SK,+7*SK,MMMMM,MMMMM,0x77,SS
 .short +4*SK,-5*SK,MMMMM,MMMMM,0x7B,SS
 .short +4*SK,-1*SK,MMMMM,MMMMM,0x7A,SS
 .short +4*SK,+3*SK,MMMMM,MMMMM,0x72,SS
 .short +4*SK,+7*SK,MMMMM,MMMMM,0x73,SS
 .short +8*SK,-1*SK,+4*SK,-5*SK,0x79,0x7B
 .short +8*SK,-1*SK,MMMMM,MMMMM,0x79,SS
 .short +8*SK,+3*SK,MMMMM,MMMMM,0x71,SS
 .short +8*SK,+3*SK,+4*SK,+7*SK,0x71,0x73
 
 .def _M12 ; Make this table visible to outside.
_M12:            ; 调制方式为12.0 kbps,代码同上
            ; 参数不同,根据需要修改参数
 ; . . .
  
TMBack  .int 0x03122130         ; 定义矩阵43 42 41 40 03 02 01 00
  .int 0x65475674            ;  53 52 51 50 13 12 11 10
  .int 0x12033021          ;  63 62 61 60 23 22 21 20
  .int 0x74564765          ;  73 72 71 70 33 32 31 30
 
Diff .int 0x1B4EE1B4         

 .text
 .def _Init
_Init:             ; DStCurrbss = *DelayPath.
 MVK DStCurrbss,A0
 MVKH DStCurrbss,A0
 MVK DelayPath,A1
 MVKH DelayPath,A1
 STW A1,*A0
 MVK 16,B0
PLoop:             ; DelayPath[i][j] = 0
 MVK 10,B1           ; i=0~15, j=0~9
 ZERO A0
KLoop:
 SUB 10,B1,A3
 STH A0,*+A1[A3]
 [B1] SUB B1,1,B1
 [B1] B KLoop
 NOP 5
 ADDAH A1,10,A1
 [B0] SUB B0,1,B0
 [B0] B PLoop
 NOP 5
 
 MVK SK/2,A0
 MVK AccDist,A1
 MVKH AccDist,A1
 MVK 8,B0
ILoop:             ; AccDist[i] = 512, i=1~7
 SUB 8,B0,A3           ; AccDist[0] = 0
 STW A0,*+A1[A3]
 [B0] SUB B0,1,B0
 [B0] B ILoop
 NOP 5
 ZERO A0
 STW A0,*+A1[0]
 
 ZERO A0
 MVK Tdr,A1
 MVKH Tdr,A1
 STW A0,*A1
 
 B B3
 NOP 5

DStCurr  .set A13      ; 当前延迟状态指针
TT0   .set A1       ; 临时变量,用于测试
TT1   .set B1       ; 临时变量,用于测试
Q0   .set A3       ; 临时变量
Q1   .set B3       ; 临时变量
W0   .set A6       ; 临时变量
W1   .set B6       ; 临时变量
DS0   .set A0       ; 延迟状态0
DS1   .set B0       ; 延迟状态1
DS2   .set A1       ; 延迟状态2
DS3   .set B1      ; 延迟状态3
DS4   .set A2      ; 延迟状态4
DS5   .set B2       ; 延迟状态5
DS6   .set A3       ; 延迟状态6
DS7   .set B3       ; 延迟状态7
Dist0  .set A7       ; 距离0
Dist1  .set B7       ; 距离1

G0   .set A5       ; 距离累积值0
G1   .set B5       ; 距离累积值1
G2   .set A10      ; 距离累积值2
G3   .set B10       ; 距离累积值3
G4  .set A11       ; 距离累积值4
G5   .set B11       ; 距离累积值5
G6   .set A9       ; 距离累积值6
G7   .set B9       ; 距离累积值7

TTT  .set A8      ; 跟踪回溯状态地址

 .def _Viterbi
 .text
_Viterbi:
        ; Viterbi译码第一步
        ; 分配堆栈空间存储B3、A10~A13、B10~B13
        ; 将参数3(A6)存储到MCurr
        ; 设置当前延迟状态指针为DStCurr
 MV A6,B6 ;*
 || LDW *A6,MCurr0     ; 得到首个调制数据表
 || SUBAW B15,9,B15     ; 分配存储空间
 
 MVK MCurr,B0     
 || MVK DStCurrbss,A1    
 || MV B15,A9      ; 设置快速存储寄存器
 || STW B3,*+B15[1]     ; 保存寄存器内容
 
 MVKH MCurr,B0     
 || MVKH DStCurrbss,A1    
 || STW A13,*+A9[8]     ; 保存寄存器内容
 || STW B13,*+B15[9]     ; 保存寄存器内容
 
 STW B6,*B0      ; 保存当前指针
 || LDW *A1,DStCurr     ; 取延迟状态指针

 STW A12,*+A9[6]     ; 保存寄存器内容
 || STW B12,*+B15[7]     ; 保存寄存器内容
        ; Viterbi译码第二步
        ; 输入为Xi和Yi,输出为距离和状态
        ; 基于输入Xi和Yi计算距离和状态值
XY   .set A0      ; X、Y 用于SUB2指令操作
Cc   .set B0      ; 循环计数器
Xt   .set A1      ; 测试X
Yt   .set B1      ; 测试Y
S1   .set A1      ; 状态 1
S0   .set B1      ; 状态0
TT   .set B2      ; 临时变量
Nx   .set A3      ; Nx
Ny   .set B3      ; Ny
Xi   .set A4      ; 接收数据参数1
Yi   .set B4      ; 接收数据参数2
Xs   .set A5      ; Xs
Ys   .set B5     ; Ys
MCurr0  .set A6      ; 位速率调整表
StateP  .set B6      ; 状态结果指针
Xq   .set A7      ; Xq
Yq   .set B7      ; Yq
DistP  .set A8      ; 距离结果指针
MCurr1  .set B8      ; B组寄存器指针
Ix   .set A9      ; X索引
Iy   .set B9      ; Y索引
Id0   .set A9      ; 区域结果
Id1   .set B9      ; B组寄存器区域结果
P2   .set A9      ; 乘法寄存器
P3   .set B9      ; 乘法寄存器
T0   .set A10      ; 临时寄存器
T1   .set B10      ; 临时寄存器
P0   .set A10      ; 乘法寄存器
P1   .set B10      ; 乘法寄存器
T2   .set A11      ; 临时寄存器
T3   .set B11      ; 临时寄存器
MNext0  .set A12      ; 下一个表指针

Step2:
 MV MCurr0,TT     
 || MVK State,StateP     ; 设置状态结果指针
 || MVK Distance,DistP    ; 设置距离结果指针
 || STW A11,*+A9[4]     ; 保存寄存器
 || STW B11,*+B15[5]     ; 保存寄存器

 LDH *+MCurr0[3],Xs    ; 取Xs和Ys
 || LDH *+TT[2],Ys      
 || MVKH State,StateP      
 || MVKH Distance,DistP     
 
 LDH *+MCurr0[5],Xq    ; 取Xq和Yq
 || LDH *+TT[4],Yq      
 
 LDH *+MCurr0[7],Nx    ; 取Nx和Ny
 || LDH *+TT[6],Ny      
 || ZERO Ix      ; 初始化索引
 || ZERO Iy       
 || MVK 8,Cc      ; 初始化循环计数器
 
 STW A10,*+A9[2]     ; 保存寄存器
 || STW B10,*+B15[3]     ; 保存寄存器
 
 NOP 2        
 
Cloop:
 CMPGT Xi,Xs,Xt     ; 比较和增加测试水平
 || ADD Xs,Xq,Xs      
 || CMPGT Yi,Ys,Yt      
 || ADD Ys,Yq,Ys      
 || LDW *MCurr0,MNext0    ; 为下一个循环准备
 || MV MCurr0,TT      
 
 .loop 4       ; 设置Max (Nx, Ny).
 CMPGT Xi,Xs,Xt     ; 比较和增加测试水平
 || [Xt] ADD Xs,Xq,Xs     
 || [Xt] ADD Ix,3,Ix     ; 增加索引
 || CMPGT Yi,Ys,Yt      
 || [Yt] ADD Ys,Yq,Ys      
 || [Yt] ADD Iy,Nx,Iy      
 .endloop        
 
 ADD Ix,Iy,Id0      ; 计算区域
 || ADD Ix,Iy,Id1       
 || ADDAH MCurr0,8,MCurr0   ; 指向路径状态
 || ADDAH TT,10,MCurr1    ; 指向B组寄存器
 
 LDW *MCurr0[Id0],T0    ; 取X0, Y0
 || LDW *MCurr1[Id1],T1    ; 取X1, Y1
 || ADD Id0,2,Id0      
 
 LDW *MCurr0[Id0],T2    ; 取状态0和1
 
 SHL Xi,16,XY      ; 连接Xi Yi到XY
 || CLR Yi,16,31,TT      
 || LDH *+MNext0[2],Ys    ; 为下一个循环准备
 
 OR XY,TT,XY      ; 连接Xi Yi到XY
 || LDH *+MNext0[3],Xs    ; 为下一个循环准备 

 LDH *+MNext0[4],Yq    ; 为下一个循环准备 
 
 SUB2 T0,XY,T0     ; 计算X Y对 X0 Y0的微分
 || SUB2 T1,XY,T1     ; 计算X Y 对X1 Y1的微分
 || LDH *+MNext0[5],Xq    ; 为下一个循环准备 

 MPY T0,T0,P2      ; 计算(Yi - Y0) ^ 2.
 || MPY T1,T1,P3     ; 计算(Yi - Y1) ^ 2.
 || LDH *+MNext0[6],Ny    ; 为下一个循环准备 
 || [Cc] SUB Cc,1,Cc     ; 循环计数器减
 
 MPYH T0,T0,P0     ; 计算(Xi - X0) ^ 2.
 || MPYH T1,T1,P1     ; 计算Get (Yi - Y0) ^ 2.
 || LDH *+MNext0[7],Nx    ; 为下一个循环准备 
 || [Cc] B Cloop      ; 下一个循环
 
 NOP       ; 延迟
 
 ADD P0,P2,T0      ; 计算距离X0 Y0的平方
 || ADD P1,P3,T1     ; 计算距离X1 Y1的平方
 || MV T2,T3      ; 状态0和1

 CMPGT T0,T1,TT     ; 计算最大距离
 || EXTU T3,16,16,S0     ; 分开状态0和1
 || EXTU T2,0,16,S1      
 
 [TT] MV T1,T0      ; 距离X0 Y0为大值
 || [TT] MV S1,S0     ; 使用距离X1 Y1
 
 STW T0,*DistP++     ; 保存结果
 || STH S0,*StateP++      
 || MV MNext0,MCurr0    ; 为下一个循环准备 
 || ZERO Ix      ; 寄存器索引
 || ZERO Iy     
        ; Viterbi译码第三步
        ; 寻找最短距离,存储到Dist0和Dist1
        ; 计算延迟状态并存储
        ; 输入为距离和状态
        ; 输出为Dist0,Dist1,DS0~DS7和延迟路径
        
TMB0  .set A0      ; 表指针
TMB1  .set B0       ; 表指针
T200A  .set A2       ; 保存16进制200
T200B  .set B2      ; 保存16进制200
DistP0  .set A4       ; 距离指针
DistP1  .set B4       ; 距离指针
Ix0   .set A5       ; 索引
Ix1   .set B5       ; 索引
DSP0  .set A6       ; 延迟状态指针
DSP1  .set B6      ; 延迟状态指针
Stp0   .set A8       ; 状态指针0
Stp1  .set B8       ; 状态指针1
St0   .set A9       ; 状态0
St1   .set B9       ; 状态1
LU0  .set A10       ; 查找表行 0
LU1  .set B10       ; 查找表行1
LU2  .set A11       ; 查找表行2
LU3  .set B11       ; 查找表行3

Step3:
 MVK Distance,DistP0    ; 指向距离0到 3
 || MVK Distance,DistP1    ; 指向距离4 到7
 
 MVKH Distance,DistP0    
 || MVKH Distance,DistP1   
 
 LDW *+DistP0[0],Dist0    ; 计算距离0
 || LDW *+DistP1[4],Dist1    ; 计算距离4
 || MVK TMBack,TMB0    ; 获得表指针
 || MVK TMBack,TMB1    ; 获得表指针
 
 LDW *+DistP0[1],Q0    ; 计算距离1
 || LDW *+DistP1[5],Q1    ; 计算距离5
 || MVKH TMBack,TMB0   
 || MVKH TMBack,TMB1   
 
 LDW *+TMB0[0],LU0    ; 读查找表
 || LDW *+TMB1[1],LU1    ; 读查找表
 || MVK State,Stp0     ; 计算状态指针
 || MVK State,Stp1     ; 计算状态指针

 LDW *+DistP0[2],Q0    ; 计算距离2
 || LDW *+DistP1[6],Q1   ; 计算距离6
 || MVKH State,Stp0    ; 计算状态指针
 || MVKH State,Stp1    ; 计算状态指针

 LDW *+TMB0[2],LU2    ; 读查找表
 || LDW *+TMB1[3],LU3    ; 读查找表
 
 MVK 0x200,T200A    
 || MVK 0x200,T200B   
 || LDW *+DistP0[3],Q0    ; 计算距离3
 || LDW *+DistP1[7],Q1    ; 计算距离7
 
 CMPGT Dist0,Q0,TT0    ; 如果距离1 < lowest
 || MVK 0x39C,Ix0     ; 提取位0~3
 || CMPGT Dist1,Q1,TT1    ; 如果距离5 < lowest
 || MVK 0x39C,Ix1     ; 提取位0~3
 || LDH *Stp0[0],St0   
 || LDH *Stp1[4],St1   
 
 [TT0] MV Q0,Dist0     ; 保持最短距离
 || [TT0] MVK 0x31C,Ix0    ; 提取位4~7
 || [TT0] LDH *Stp0[1],St0   
 || [TT1] MV Q1,Dist1     ; 保持最短距离
 || [TT1] MVK 0x31C,Ix1    ; 提取位4~7
 || [TT1] LDH *Stp1[5],St1  
 
 CMPGT Dist0,Q0,TT0    ; 如果距离2 < lowest
 || CMPGT Dist1,Q1,TT1    ; 如果距离6 < lowest
 
 [TT0] MV Q0,Dist0     ; 保持最短距离
 || [TT0] MVK 0x29C,Ix0    ; 提取位8~11
 || [TT0] LDH *Stp0[2],St0   
 || [TT1] MV Q1,Dist1     ; 保持最短距离
 || [TT1] MVK 0x29C,Ix1    ; 提取位8~11
 || [TT1] LDH *Stp1[6],St1   
 
 CMPGT Dist0,Q0,TT0    ; 如果距离3 < lowest
 || CMPGT Dist1,Q1,TT1    ; 如果距离7 < lowest
 || MV DStCurr,DSP0     ; 初始化指针到A side
 || MV DStCurr,DSP1     ; 初始化指针到B side
 
 [TT0] MV Q0,Dist0     ; 保持最短距离
 || [TT0] MVK 0x21C,Ix0    ; 提取位12~15
 || [TT0] LDH *Stp0[3],St0   
 || [TT1] MV Q1,Dist1     ; 保持最短距离
 || [TT1] MVK 0x21C,Ix1    ; 提取位12~15
 || [TT1] LDH *Stp1[7],St1   
 
 EXTU LU0,Ix0,DS0     ; 不提取
 || EXTU LU1,Ix1,DS1    ; 不提取

 EXTU LU2,Ix0,DS2     
 || EXTU LU3,Ix1,DS3   
 || SUB Ix0,T200A,Ix0    ; 提取位16以上位
 || SUB Ix1,T200B,Ix1     ; 提取位16以上位
 || STH DS0,*+DSP0[0]    ; 保存延迟状态0
 || STH DS1,*+DSP1[1]    ; 保存延迟状态1
 
 EXTU LU0,Ix0,DS4    
 || EXTU LU1,Ix1,DS5   
 || STH DS2,*+DSP0[2]    ; 保存延迟状态2
 || STH DS3,*+DSP1[3]    ; 保存延迟状态3
 
 EXTU LU2,Ix0,DS6    
 || EXTU LU3,Ix1,DS7   
 || STH DS4,*+DSP0[4]    ; 保存延迟状态4
 || STH DS5,*+DSP1[5]    ; 保存延迟状态5

 STH DS6,*+DSP0[6]     ; 保存延迟状态6
 || STH DS7,*+DSP1[7]    ; 保存延迟状态7
 || MVK AccDist,AccP0   
 || MVK AccDist,AccP1   

 STH St0,*+DSP0[8]     ; 保存路径状态索引
 || STH St1,*+DSP1[9]    ; 保存路径状态索引
 || MVKH AccDist,AccP0   
 || MVKH AccDist,AccP1   
        ; Viterbi译码第四步
        ; 计算累积距离
        ; 输入为Dist0,Dist1,DS0~DS7
        ; 输出为AccDist和G0~G7

AccP0  .set A4      ; 累积距离指针
AccP1  .set B4      ; 累积距离指针

Step4:
 LDW *+AccP0[DS0],G0    ; 读累积距离
 || LDW *+AccP1[DS1],G1   
 
 LDW *+AccP0[DS2],G2    ; 读累积距离
 || LDW *+AccP1[DS3],G3   
 
 LDW *+AccP0[DS4],G4    ; 读累积距离
 || LDW *+AccP1[DS5],G5   
 
 LDW *+AccP0[DS6],G6    ; 读累积距离
 || LDW *+AccP1[DS7],G7   
 || MVK 1,ONE      ; ONE表示1
 
 SHR Dist0,3,Dist0     ; 距离除8
 || SHR Dist1,3,Dist1    

 SHR G0,3,W0      ; 累积距离除8
 || SHR G1,3,W1    
 
 SUB G0,W0,G0    
 || SUB G1,W1,G1    
 || SHR G2,3,W0     ; 累积距离除8
 || SHR G3,3,W1   
 || MPY ONE,0,Q0     ; Q0索引为0
 || MPY ONE,1,Q1     ; Q1索引为1
 
 ADD G0,Dist0,G0     ; 距离加
 || ADD G1,Dist1,G1    
 || SUB G2,W0,G2    
 || SUB G3,W1,G3    
 || SHR G4,3,W0     ; 累积距离除8
 || SHR G5,3,W1    

 STW G0,*+AccP0[0]     ; 保存累积距离
 || STW G1,*+AccP1[1]   
 || ADD G2,Dist0,G2     ; 距离加
 || ADD G3,Dist1,G3    
 || SUB G4,W0,G4    
 || SUB G5,W1,G5    
 
 STW G2,*+AccP0[2]     ; 保存累积距离
 || STW G3,*+AccP1[3]   
 || ADD G4,Dist0,G4     ; 距离加
 || ADD G5,Dist1,G5    
 || SHR G6,3,W0     ; 累积距离除8
 || SHR G7,3,W1    
 
 STW G4,*+AccP0[4]     ; 保存累积距离
 || STW G5,*+AccP1[5]   
 || SUB G6,W0,G6    
 || SUB G7,W1,G7    
 || CMPGT G0,G2,TT0    ; 找最小距离
 || CMPGT G1,G3,TT1   

 ADD G6,Dist0,G6     ; 距离加
 || ADD G7,Dist1,G7   
 || [TT0] MV G2,G0     ; 保存最小距离
 || [TT0] MPY ONE,2,Q0    ; 更新索引
 || [TT1] MV G3,G1     ; 保存最小距离
 || [TT1] MPY ONE,3,Q1    ; 更新索引
 
 STW G6,*+AccP0[6]     ; 保存累积距离
 || STW G7,*+AccP1[7]   
 || CMPGT G0,G1,TT0    ; 找最小距离
 || MPY ONE,4,W0   
 || MPY ONE,5,W1    
        ; Viterbi译码第五步
        ; 首次寻找最小累积距离
        ; 使用延迟路径回溯寻找路径状态
        ; 输入为G0~G7,D延迟路径
        ; 输出为TTT
II   .set B0      ; 临时变量
IDD   .set A4      ; 索引
DStptr  .set A5      ; 延迟状态指针
JJ   .set A7      ; 临时变量
JJ0   .set B8      ; 临时变量
ONE  .set A12      ; One表示1

Step5:
 [TT0] MV G1,G0     ; 计算当前4个中的最小值
 || [!TT0] MV Q0,Q1    
 || CMPGT G4,G6,TT0    ; 计算下4个中的最小值
 || CMPGT G5,G7,TT1   

 [TT0] MV G6,G4     ; 保存最小值
 || [TT0] MPY ONE,6,W0    ; 更新索引
 || [TT1] MV G7,G5     ; 保存最小值
 || [TT1] MPY ONE,7,W1    ; 更新索引
 || MVK MCurr,MCurrx    ; 计算回溯指针
 
 CMPGT G4,G5,TT0     ; 寻找最小值
 || MVKH MCurr,MCurrx   

 [TT0] MV G5,G4     ; 上4个中的最小值
 || [!TT0] MV W0,W1    
 || MVK DelayPath,JJ0    ; 准备循环缓冲区JJ
 
 CMPGT G0,G4,TT0     ; 计算最小值实部
 || MV Q1,IDD      
 || MVKH DelayPath,JJ0    ; 准备循环缓冲区JJ
 
 [TT0] MV W1,IDD     ;  得到IDD
 || MV DStCurr,JJ    
 || MVK 14,II      ; 回溯计数器
 || LDW *MCurrx,MCurrx    ; 载入指针

IILoop:
 [II] B IILoop      ; 回溯
 
 LDH *+JJ[IDD],IDD     ; 保持跟踪
 || MVK Diff,DFTP     ; 计算表diff指针

 CMPGT JJ,JJ0,TT0    
 || MVKH Diff,DFTP     ; 计算表diff指针
 
 [TT0] SUBAH JJ,10,JJ    ; 调整循环缓冲区JJ
 || [!TT0] MVK DelayPath+300,JJ   ; 调整循环缓冲区JJ
 
 [!TT0] MVKH DelayPath+300,JJ  ; 调整循环缓冲区JJ
 
 SUB II,1,II      ; 计数器减
 
 AND IDD,1,IDD    
 || LDW *+MCurrx[1],Ext1
 || MVK Tdr,TDRP     ; 计算Tdr指针
 
 ADD 8,IDD,IDD    
 || LDW *+MCurrx[2],Ext2   
 || MVKH Tdr,TDRP     ; 计算Tdr指针
 
 LDH *+JJ[IDD],TTT    
 || MVK DelayPath+300,JJ0    ; 准备循环缓冲区DStCurr
 || MVK DStCurrbss,DStptr    ; 计算DStCurr指针

 MVKH DelayPath+300,JJ0    ; 准备循环缓冲区DStCurr
 || MVKH DStCurrbss,DStptr   ; 计算DStCurr指针
 || LDW *TDRP,TDR     ; 读Tdr
 
 CMPLT DStCurr,JJ0,TT0   
 || LDW *+MCurrx[3],Sht    ; 计算移位索引
 
 [TT0] ADDAH DStCurr,10,DStCurr  ; 调整循环缓冲区DStCurr
 || [!TT0] MVK DelayPath,DStCurr  ; 调整循环缓冲区DStCurr
 || LDW *+B15[1],B3     ; 返回序列
 
 [!TT0] MVKH DelayPath,DStCurr  ; 调整循环缓冲区DStCurr
 || LDW *DFTP,DFT     ; 读表diff
        ; Viterbi译码第六步
        ; 处理结果
        ; 输入为TTT
        ; 输出为A4返回值
MCurrx  .set A0      ; 调整表指针
PP   .set A0      ; 临时变量
Ext2  .set A2      ; 提取索引2
TDR  .set B2      ; Tdr值
SSS   .set A3      ; 临时变量
Sht   .set A4      ; 移位累加
TDRP  .set B4      ; Tdr指针
Ext1  .set A6      ; 提起索引1
DFT  .set A7      ; 表Diff 值
DFTP  .set A9      ; 表Diff指针

Step6:
 STW DStCurr,*DStptr    ; 保存DStCurr
 || EXTU TTT,Ext1,PP     ; 分开TTT成两片
 
 SHL PP,2,PP      ; 计算diff表索引
 || STW PP,*TDRP     ; 更新Tdr值
 
 OR PP,TDR,PP      ; 计算diff表索引
 || EXTU TTT,Ext2,SSS    ; 分开TTT成两片

 SHL PP,1,PP     
 || MV B15,A9      ; 返回序列
 || B B3       ; 返回序列
 
 SHR DFT,PP,DFT     
 || LDW *+A9[2],A10     ; 返回序列
 || LDW *+B15[3],B10    ; 返回序列
 
 CLR DFT,2,31,DFT     ; 保持最低2位
 || LDW *+A9[4],A11     ; 返回序列
 || LDW *+B15[5],B11    ; 返回序列
 
 SHL DFT,Sht,DFT     ; 连接SSS
 || LDW *+A9[6],A12     ; 返回序列
 || LDW *+B15[7],B12    ; 返回序列
 
 OR DFT,SSS,A4     ; 连接SSS
 || LDW *+A9[8],A13     ; 返回序列
 || LDW *+B15[9],B13    ; 返回序列
 
 ADDAW B15,9,B15     ; 分配存储器
 
Step7:        ; 返回,恢复寄存器A10~A13,B10~B13,A3
 .end   

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号