?? viterbi.cpp
字號:
//********************************
//維特比譯碼器的類實現(xiàn)
#include "Viterbi.h"
Viterbi::Viterbi(int DecDepth)//構(gòu)造函數(shù)
{
DecodeDepth=DecDepth;//設(shè)置譯碼深度
//建立并初始化所有緩存
D=new int*[8];//建立二維數(shù)組D[8][DecodeDepth];
for(int i=0;i<8;i++)
{
D[i]=new int[DecodeDepth];
Rstatus[i]=0;//寄存器初始化0
}
InCode=new int[DecodeDepth];
R=0;
}
Viterbi::~Viterbi()
{
for(int i=0;i<8;i++)
delete D[i];
delete []D;
delete [] InCode;
}
//********************************
//
//函數(shù):ShiftIn(int *data,int index,int shift_length=DecodeDepth*2)
//功能:長為DecodeDepth*2的二進制序列移入設(shè)碼器
//輸入:data[index]--data[index+shift_length]
//返回:無
//************************************
void Viterbi::ShiftIn(int *data,int index)
{
int j=0;
for(int i=0;i<DecodeDepth;i++)
{
InCode[i]=bin2dec(data[index+j],data[index+1+j]);//把每兩位二進制數(shù)移入后轉(zhuǎn)為十進制數(shù)
j=j+2;//一次移兩位
}
}
//********************************
//
//函數(shù):bin2dec(int bithigh,int bitlow)
//功能:把輸入的二進制變?yōu)槭M制
//輸入:bithigh高位二進制,bitlow低位二進制
//返回:轉(zhuǎn)化后的十進制0,1,2,3
//************************************
int Viterbi::bin2dec(int bithigh,int bitlow)
{
int temp;
if(bitlow==0)
{
if(bithigh==0)
temp=0;
else temp=2;
}
else
{
if(bithigh==0)
temp=1;
else temp=3;
}
return temp;
}
void Viterbi::DecodeOut(int *data_out,int index)
{
int i,j;
// int **tempbuf;
// tempbuf=new int[4];
// for(i=0;i<4;i++)
// tempbuf[i]=new int[DecodeDepth];//定義臨時緩存
//初始化
this->initi();
//從第二步開始判決
for(i=2;i<DecodeDepth;i++)//主LOOP
{
for(j=0;j<4;j++)//前四條路往下走,變成八條
{
//長度增加
switch(Rstatus[j])//根據(jù)每條路徑對應(yīng)的狀態(tài)選路
{
case 0:
D[j][i]=0;
Rstatus[j]=0;//重設(shè)對應(yīng)狀態(tài)
D[j+4][i]=3;
Rstatus[j+4]=1;
break;
case 1:
D[j][i]=2;
Rstatus[j]=2;
D[j+4][i]=1;
Rstatus[j+4]=3;
break;
case 2:
D[j][i]=3;
Rstatus[j]=0;
D[j+4][i]=0;
Rstatus[j+4]=1;
break;
case 3:
D[j][i]=1;
Rstatus[j]=2;
D[j+4][i]=2;
Rstatus[j+4]=3;
break;
}
}
arrange(i+1);//排序,使得最小碼距的序列存放在D0--D3中
//把主緩沖拷貝到臨時緩沖
BufCopy(D[0],D[4],i+1);
BufCopy(D[1],D[5],i+1);
BufCopy(D[2],D[6],i+1);
BufCopy(D[3],D[7],i+1);
// for(int t=0;t<4;t++)
//
// Rstatus[t+4]=Rstatus[t];
}
//結(jié)束判決
//*******************
//D[0]中存放了最優(yōu)序列,開始解碼
for(i=0;i<DecodeDepth;i++)
{
switch(R)
{
case 0:
if(D[0][i]==0)
{
data_out[index+i]=0;
R=0;
}
else
{
data_out[index+i]=1;
R=1;
}break;
case 1:
if(D[0][i]==2)
{
data_out[index+i]=0;
R=2;
}
else
{
data_out[index+i]=1;
R=3;
}
break;
case 2:
if(D[0][i]==3)
{
data_out[index+i]=0;
R=0;
}
else
{
data_out[index+i]=1;
R=1;
}
break;
case 3:
if(D[0][i]==1)
{
data_out[index+i]=0;
R=2;
}
else
{
data_out[index+i]=1;
R=3;
}
break;
}
}
}
//********************************
//
//函數(shù):BufCopy(int *src, int *dst, int inlength)
//功能:把長度為inlength的數(shù)據(jù)從src中復(fù)制到dst中
//輸入:源和目的的首地址和長度
//返回:無
//************************************
void Viterbi::BufCopy(int *src, int *dst, int inlength)
{
for(int i=0;i<inlength;i++)//逐個復(fù)制
{
dst[i]=src[i];
}
}
//********************************
//
//函數(shù):camplare(int *inbuf, int& distance)
//功能:比較inbuf序列和incode序列的碼距,輸出到distance
//輸入:源首地址和長度
//返回:無
//************************************
void Viterbi::camplare(int *inbuf, int inlength,int& distance)
{
int count=0;//用于支路量度;
for(int i=0;i<inlength;i++)
{
switch(inbuf[i]^InCode[i])//用異或運算計算碼距
{
case 0:
break;
case 1:
count++;
break;
case 2:
count++;
break;
case 3:
count=count+2;
break;
}
}
distance=count;
}
//********************************
//
//函數(shù):arrange(int inlength)
//功能:對D[0]到D[8]按碼距進行排序,排序后D[0]到D[3]存放碼距最小的四個序列
//輸入:當然序列的長度
//返回:無
//************************************
void Viterbi::arrange(int inlength)
{
int *distance;
int tempdst;
int *tempbuf;
tempbuf=new int[inlength];
int i,j;
distance=new int[8];//存放每個序列與輸入待譯碼序列的碼距
for(j=0;j<8;j++)
{
camplare(D[j],inlength,distance[j]);//逐個比較,得出碼距放于distance[j]中
}
for(j=0;j<8;j++)//冒泡排序算法,最小的先浮上頂
{
for(i=7;i>j;i--)
{
if(distance[i]<distance[i-1])//交換
{
tempdst=distance[i-1];
distance[i-1]=distance[i];
distance[i]=tempdst;
//序列也交換
BufCopy(D[i-1],tempbuf,inlength);
BufCopy(D[i],D[i-1],inlength);
BufCopy(tempbuf,D[i],inlength);
//對應(yīng)序列的寄存器狀態(tài)也要交換
tempdst=Rstatus[i-1];
Rstatus[i-1]=Rstatus[i];
Rstatus[i]=tempdst;
}
}
}//排序結(jié)束
delete[] distance;
delete[] tempbuf;
}
void Viterbi::reset()
{
}
void Viterbi::initi()
{
R=Rstatus[0];
switch(Rstatus[0])
{
case 0:
{
D[0][0]=0;
D[0][1]=0;
Rstatus[0]=0;
D[1][0]=0;
D[1][1]=3;
Rstatus[1]=1;
D[2][0]=3;
D[2][1]=2;
Rstatus[2]=2;
D[3][0]=3;
D[3][1]=1;
Rstatus[3]=3;
}break;
case 1:
{
D[0][0]=2;
D[0][1]=3;
Rstatus[0]=0;
D[1][0]=2;
D[1][1]=0;
Rstatus[1]=1;
D[2][0]=1;
D[2][1]=1;
Rstatus[2]=2;
D[3][0]=1;
D[3][1]=2;
Rstatus[3]=3;
}
break;
case 2:
{
D[0][0]=3;
D[0][1]=0;
Rstatus[0]=0;
D[1][0]=3;
D[1][1]=3;
Rstatus[1]=1;
D[2][0]=0;
D[2][1]=2;
Rstatus[2]=2;
D[3][0]=0;
D[3][1]=1;
Rstatus[3]=3;
}
break;
case 3:
{
D[0][0]=1;
D[0][1]=3;
Rstatus[0]=0;
D[1][0]=1;
D[1][1]=0;
Rstatus[1]=1;
D[2][0]=2;
D[2][1]=1;
Rstatus[2]=2;
D[3][0]=2;
D[3][1]=2;
Rstatus[3]=3;
}
break;
}
BufCopy(D[0],D[4],2);
BufCopy(D[1],D[5],2);
BufCopy(D[2],D[6],2);
BufCopy(D[3],D[7],2);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -