1 / 30
文档名称:

Viterbi译码程序代码.docx

格式:docx   大小:26KB   页数:30页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Viterbi译码程序代码.docx

上传人:xiang1982071 2020/8/10 文件大小:26 KB

下载得到文件列表

Viterbi译码程序代码.docx

文档介绍

文档介绍:译码主要部分#include""//#defineDEBUGvoiddeci2bin(intd,intsize,int*b);intbin2deci(int*b,intsize);intnxt_stat(intcurrent_state,intinput,int*memory_contents);voidinit_quantizer(void);voidinit_adaptive_quant(floates_ovr_n0);intsoft_quant(floatchannel_symbol);intsoft_metric(intdata,intguess);intquantizer_table[256];voidsdvd(intg[2][K],floates_ovr_n0,longchannel_length,float*channel_output_vector,int*decoder_output_matrix){ inti,j,l,ll;//循环控制变量 longt;//时间 intmemory_contents[K];//记录输入内容 intinput[TWOTOTHEM][TWOTOTHEM];//对当前状态以及下一个状态映射 intoutput[TWOTOTHEM][2];//卷积码编码输出矩阵 intnextstate[TWOTOTHEM][2];//下一个状态矩阵 um_err_metric[TWOTOTHEM][2];//误差累计矩阵 intstate_history[TWOTOTHEM][K*5+1];//历史状态表 intstate_sequence[K*5+1];//状态序列 int*channel_output_matrix;//信道输出序列 intbinary_output[2]; intbranch_output[2];//0或者1的输出分支 intm,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(,m);//状态个数numberofstates=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(ForwardErrorCorrection), 其原理是:发送方将要发送的数据附加上一定的冗余纠错码一并发送, 接收方则根据纠错码对数据进行差错检测,如发现差错,由接收方进行纠正*/ /*产生状态转移矩阵、输出矩阵、输入矩阵*/ //输入矩阵表示的是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);//输出十进制} }#ifdefDEBUG printf