?? viterbi216.h
字號:
//文件名:Viterbi216.h
//作 用:對1/2碼率,N=7的卷積碼進(jìn)行維特比譯碼(硬判決)
//作 者:蔣巖
//時 間:2005.7.25
//版 本:VC--1.0
//說 明:
/*(n0,k0,m)卷積碼的字母定義:
*n0——每個時刻編碼器輸出碼元個數(shù)
*k0——每個時刻編碼器輸入信息元個數(shù)
*m——輸入的信息組在編碼器中的存儲的單位時間
*N=m+1——編碼約束度,編碼過程中相互約束的子碼個數(shù)
*df=10——自由距離,由卷積碼的生成多項(xiàng)式?jīng)Q定
*維特比譯碼輸出信息元誤碼率算法
*Pme=2^df * Pe^(df/2)——(Pe為信道的誤碼率)
*例:Pe=10^-2,則Pme=10^-7
*/
//---------------------------------------------------------------------------
#ifndef VITERBI_216_H
#define VITERBI_216_H
#define G1 0x6d //G1 = 1101101
#define G2 0x4f //G2 = 1001111
int WeightInt(int);
class CViterbi_216
{
public:
int Decode_States; //狀態(tài)數(shù) 2^m*k0
int Branch_Num; //從一個狀態(tài)延伸的分支數(shù) n0
int Path_Length; //路徑保留長度 5*m < L < 10*m
int Path_Num; //保存幸存路徑個數(shù)
int Init_Num; //幸存路徑預(yù)裝載個數(shù),Init_Num 的計(jì)算方法如下 2^Init_Num = Path_Num
int First_Use; //是否第一次處理緩存的標(biāo)志
//-----分支緩存定義-----
//Branch_Tab[Decode_States][Branch_Num]
//移位寄存器在各個狀態(tài)下輸入“0”或“1”對應(yīng)的輸出結(jié)果表
unsigned char Branch_Tab[64][2];
//-----幸存路徑結(jié)構(gòu)定義-----
//同時也是距離寄存器和信息序列寄存器
struct Survivor {
int Sum_d;//幸存路徑的累積距離
unsigned int H_m32;//幸存路徑的信息存儲變量,高32比特
unsigned int L_m32;//幸存路徑的信息存儲變量,低32比特
};
Survivor Survivor_Save[64];
//保存幸存路徑的結(jié)構(gòu)緩存(結(jié)構(gòu)緩存?zhèn)€數(shù) = Path_Num)
Survivor Survivor_Temp[128];
//臨時幸存路徑的結(jié)構(gòu)緩存(結(jié)構(gòu)緩存?zhèn)€數(shù) = Path_Num * Branch_Num)
public:
CViterbi_216();
virtual ~CViterbi_216();
void Initial(void);
int Encode_216(unsigned char * InBuf, int InLength, unsigned char * OutBuf, int Now_State);
//編碼正確返回編碼后移位寄存器的狀態(tài);編碼出錯則返回0xff;
int Viterbi216(unsigned char * InBuf, int InLength, unsigned char * OutBuf, int Star_Mode);
//Star_Mode 表示啟動該函數(shù)的方式,
//Star_Mode == 0 表示處理非連續(xù)卷積碼編碼數(shù)據(jù)
//Star_Mode == 1 表示處理連續(xù)卷積碼編碼數(shù)據(jù)
};
//---------------------------------------------------------------------------
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -