卷积码BCJR实现

卷积码BCJR实现


2023年12月1日发(作者:华为手机恢复出厂设置在哪里)

卷积码BCJR实现

因为在快变信道下,矩阵H进⾏带状处理后,状态数可以减少。所以可以⽤减少状态数的MAP算法来实现均衡器的软输出。⽽MAP算法可

以根据BCJR算法来实现。

BCJR算法最初是应⽤于卷积码的译码软输出,因此先学习在卷积码的情况下BCJR算法的实现。

void CViterbi::Malloc()

{

int t,s,i,j,edge_cnt;

int temp,temp_out;

int state_temp,sub_state;

m_num_trellis=5;

m_num_input_bits=1; //输⼊⽐特数 1

m_num_output_bits=2; //输出⽐特数 2

m_num_reg=2; //寄存器数 2

m_num_input=1<//输⼊⽐特状态0,1

m_num_output=1<

m_num_state=1<//trellis图状态数

m_edge_no=m_num_input*m_num_state; //边标号

m_in_lable=new int [m_edge_no]; //输⼊标签{0 ,1, 0 ,1, 0,1,0,1}

m_left_vertex=new int [m_edge_no]; //左边状态 {00,00,01,01,10,10,11,11}

m_right_vertex=new int [m_edge_no]; //右边状态 {00,10,00,10,01,11,01,11}

m_out_lable=new int [m_edge_no]; //输出标签{00,11,11,00,10,01,01,10}

m_G=new int [m_num_output_bits]; //⽣成多项式

m_G[0]=7; //g0=1 1 1

m_G[1]=5; //g1=1 0 1

m_input_bit=new int [m_num_input]; //输⼊⽐特[0,1]

m_input_bit[0]=0;

m_input_bit[1]=1;

m_output_bit=new int *[m_num_output];

for(i=0;i

m_output_bit[i]=new int [m_num_output_bits];

m_output_bit[0][0]=0; m_output_bit[0][1]=0;

m_output_bit[1][0]=0; m_output_bit[1][1]=1;

m_output_bit[2][0]=1; m_output_bit[2][1]=0;

m_output_bit[3][0]=1; m_output_bit[3][1]=1;

m_delta=new double *[m_num_output];

m_gama=new double *[m_edge_no];

for(i=0;i

m_delta[i]=new double[m_num_trellis];

for(i=0;i

m_gama[i]=new double [m_num_trellis];

m_difference=new double**[m_num_state];

for(s=0;s

m_difference[s]=new double *[m_num_trellis+1];

for(t=0;t<=m_num_trellis;t++)

m_difference[s][t]=new double[m_num_input];

}

m_edge_to_state=new int*[m_num_state];

for(s=0;s

m_edge_to_state[s]=new int [m_num_input];

//trellis的构建

state_temp=0; //临时状态

sub_state=0;

temp=0;

edge_cnt=0;

edge_cnt=0;

for(s=0;s

{

sub_state=s;

for(i=0;i

m_left_vertex[edge_cnt]=sub_state; //当前状态

m_in_lable[edge_cnt]=i; //当前输⼊

m_out_lable[edge_cnt] = 0;

m_right_vertex[edge_cnt] = 0; //初始化都是0

state_temp=(m_input_bit[i]<

temp_out=0;

for(j=0;j//1,2个输出

temp=BitDotProd(state_temp,m_G[j],m_num_reg+1);

temp_out=( temp_out<<1)+temp; //输出码字⽐特

}

m_out_lable[edge_cnt]=(m_out_lable[edge_cnt])^temp_out; //输出码字

m_right_vertex[edge_cnt]=(m_right_vertex[edge_cnt]<>1; //新状态 m_right_vertex[edge_cnt]初始时都是零

edge_cnt++;

}

}

for(s=0;s

edge_cnt=0;

for(i=0;i

if(m_right_vertex[i]==s){

m_edge_to_state[s][edge_cnt]=i; //到达s状态存储的边号

edge_cnt++;

}

}

}

m_backtrace=new int **[m_num_state];

for(s=0;s

m_backtrace[s]=new int *[m_num_trellis];

for(t=0;t

m_backtrace[s][t]=new int [m_num_input];

}

}

}

//编码

void CViterbi::Encode(int *uu,int *cc)

{

int i,t,input,output,state;

state=0;

for(t=0;t

input=uu[t]; //输⼊

for(i=0;i

if(m_left_vertex[i]==state&& m_in_lable[i]==input)

output= m_out_lable[i];

state=m_right_vertex[i];

break;

}

for(i=0;i

uu[t*m_num_output_bits+i]=m_output_bit[output][i];

}

m_end_s = state; //把最后的状态当做已知的结束状态

}

“`


发布者:admin,转转请注明出处:http://www.yc00.com/num/1701383352a1075575.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信