Viterbi译码程序代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);//输出十进制

}

}

相关文档
最新文档