Viterbi译码程序代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
译码主要部分
#include"stdafx.h"
//#define DEBUG
void deci2bin(int d, int size, int *b);
int bin2deci(int *b, int size);
int nxt_stat(int current_state, int input, int *memory_contents);
void init_quantizer(void);
void init_adaptive_quant(float es_ovr_n0);
int soft_quant(float channel_symbol);
int soft_metric(int data, int guess);
int quantizer_table[256];
void sdvd(int g[2][K], float es_ovr_n0, long channel_length, float*channel_output_vector, int *decoder_output_matrix)
{
int i, j, l, ll; //循环控制变量
long t; //时间
int memory_contents[K]; //记录输入内容
int input[TWOTOTHEM][TWOTOTHEM]; //对当前状态以及下一个状态映射
int output[TWOTOTHEM][2]; //卷积码编码输出矩阵
int nextstate[TWOTOTHEM][2]; //下一个状态矩阵
int accum_err_metric[TWOTOTHEM][2]; //误差累计矩阵
int state_history[TWOTOTHEM][K * 5 + 1]; //历史状态表
int state_sequence[K * 5 + 1]; //状态序列
int *channel_output_matrix; //信道输出序列
int binary_output[2];
int branch_output[2]; //0或者1的输出分支
int m, n, number_of_states, depth_of_trellis, step, branch_metric,
sh_ptr, sh_col, x, xx, h, hh, next_state, last_stop;
n = 2; //1/2为卷积码传输数据的码率
m = K - 1;//寄存器个数
number_of_states = (int)pow(2.0, m);//状态个数number of states = 2^(K - 1) = 2^m
depth_of_trellis = K * 5;
for (i = 0; i < number_of_states; i++)
{
for (j = 0; j < number_of_states; j++)
input[i][j] = 0; //输入数组初始化
for (j = 0; j < n; j++)
{
nextstate[i][j] = 0;//下一个状态数组初始化
output[i][j] = 0; //输出数组初始化
}
for (j = 0; j <= depth_of_trellis; j++)
{
state_history[i][j] = 0;//历史状态数组初始化state_history[4][16] }
accum_err_metric[i][0] = 0;//误差累计矩阵第一列初始化为0
accum_err_metric[i][1] = MAXINT;//误差累计矩阵第二列初始化为一个很大的数
}
/*前向纠错简称FEC(Forward Error Correction),
其原理是:发送方将要发送的数据附加上一定的冗余纠错码一并发送,
接收方则根据纠错码对数据进行差错检测,如发现差错,由接收方进行纠正*/
/*产生状态转移矩阵、输出矩阵、输入矩阵*/
//输入矩阵表示的是FEC编码传输给下一个状态
//下一个状态由输入和当前状态给出
//输出矩阵
for (j = 0; j < number_of_states; j++)
{
for (l = 0; l < n; l++)
{
next_state = nxt_stat(j, l, memory_contents);
input[j][next_state] = l;
/*计算给定的卷积编码器输出当前状态数和输入值*/
branch_output[0] = 0;
branch_output[1] = 0;
for (i = 0; i < K; i++)
{
branch_output[0] = branch_output[0] ^ memory_contents[i] & g[0][i];
branch_output[1] = branch_output[1] ^ memory_contents[i] & g[1][i];
}
nextstate[j][l] = next_state;//下一个状态
output[j][l] = bin2deci(branch_output, 2);//输出十进制
}
}