📄 log_map.c
字号:
////////////////////////////////////////////
#include "stdio.h" //
#include "math.h" //
#include "malloc.h" //
#include "stdlib.h" //
#include "time.h" //
#include "parameter.h" //
////////////////////////////////////////////
void interlize_a();
void interlize_b();
void update_a();
void update_b();
void get_LLR();
void get_LL();
void interlize_a()
{short i;
alpha_a[0]=0;
for(i=1;i<num_state;i++)
alpha_a[i*(fra_long+1)]=-infty;}
void interlize_b()
{short i;
for(i=0;i<num_state;i++)
beta_b[i*fra_long+fra_long-1]=0;}
void update_a()
{ short i,j,k;
double sum;
double h;
for(i=1;i<fra_long+1;i++)
{
for(j=0;j<num_state;j++)
{for(k=0;k<num_state;k++)
gamma[k]=-infty;
gamma[last_state[j*2]]=-rec_s[(i-1)*2]+rec_s[(i-1)*2+1]*last_out[j*2]
-log(1+exp(l_ex[i-1]));
gamma[last_state[j*2+1]]=rec_s[(i-1)*2]+rec_s[(i-1)*2+1]*last_out[j*2+1]
+l_ex[i-1]-log(1+exp(l_ex[i-1]));
sum=0.0;
for(k=0;k<num_state;k++)
{
h=alpha_a[k*(fra_long+1)+i-1]+gamma[k];
sum=sum+exp(h);}
// printf("%f ",sum);
if(sum<pow(10,-300))
alpha_a[j*(fra_long+1)+i]=-infty;
else
alpha_a[j*(fra_long+1)+i]=log(sum);
}
temp_max[i]=alpha_a[i];
for(k=1;k<num_state;k++)
if(alpha_a[k*(fra_long+1)+i]>temp_max[i])
temp_max[i]=alpha_a[k*(fra_long+1)+i];
for(k=0;k<num_state;k++)
alpha_a[k*(fra_long+1)+i]=alpha_a[k*(fra_long+1)+i]-temp_max[i];
// printf("\n");
//for(k=0;k<num_state;k++)
//printf("%f ",alpha_a[k*(fra_long+1)+i]);
// printf("\n");
//k=0;
}
}
void update_b()
{short i,j,k;
double sum;
double h;
for(i=fra_long-2;i>=0;i--)
{
for(j=0;j<num_state;j++)
{for(k=0;k<num_state;k++)
gamma[k]=-infty;
gamma[next_state[j*2]]=-rec_s[(i+1)*2]+rec_s[(i+1)*2+1]*next_out[j*2]
-log(1+exp(l_ex[i+1]));
gamma[next_state[j*2+1]]=rec_s[(i+1)*2]+rec_s[(i+1)*2+1]*next_out[j*2+1]
+l_ex[i+1]-log(1+exp(l_ex[i+1]));
sum=0.0;
for(k=0;k<num_state;k++)
{
h=beta_b[k*fra_long+i+1]+gamma[k];
sum=sum+exp(h);}
if(sum<pow(10,-300))
beta_b[j*fra_long+i]=-infty;
else
beta_b[j*fra_long+i]=log(sum);
}
for(k=0;k<num_state;k++)
beta_b[k*fra_long+i]=beta_b[k*fra_long+i]-temp_max[i+1];
//for(k=0;k<num_state;k++)
//printf("%f ",beta_b[k*fra_long+i]);
//printf("\n");
//k=0;
}
}
void get_LLR()
{short i,j;
double gamma0,gamma1;
double sum0,sum1;
for (i=0;i<fra_long;i++)
{
for(j=0;j<num_state;j++)
{gamma0=-rec_s[i*2]+rec_s[i*2+1]*last_out[j*2]-log(1+exp(l_ex[i]));
gamma1=rec_s[i*2]+rec_s[i*2+1]*last_out[j*2+1]+l_ex[i]-log(1+exp(l_ex[i]));
// if((1+exp(l_ex[i]))==0)
// printf("%f ,,",(1+exp(l_ex[i])));
// if(gamma1>pow(10,10) || gamma1<-pow(10,10) || gamma0>pow(10,10) || gamma0<-pow(10,10))
// printf("%f..%f,,",gamma0,gamma1);
temp_zero[j]=exp(gamma0+alpha_a[last_state[j*2]*(fra_long+1)+i]+beta_b[j*fra_long+i]);
temp_one[j]=exp(gamma1+alpha_a[last_state[j*2+1]*(fra_long+1)+i]+beta_b[j*fra_long+i]);
// if(gamma1>pow(10,10) || gamma1<-pow(10,10))
// printf("%f %f,,",temp_zero[j],temp_one[j]);
}
sum0=0.0;sum1=0.0;
for(j=0;j<num_state;j++)
{
sum0=sum0+temp_zero[j];
sum1=sum1+temp_one[j];}
//if (sum0==0 || sum1==0)
//for(j=0;j<num_state;j++)
//printf("%f,%f,%f",gamma0,alpha_a[last_state[j*2]*(fra_long+1)+i],beta_b[j*fra_long+i]);
LLR[i]=log(sum1)-log(sum0);
}
//for(j=0;j<fra_long;j++)
//printf("%f,,",LLR[j]);
}
void get_LL()
{
short i;
short j;
for(i=0;i<fra_long;i++)
l_ex[i]=LLR[i]-l_ex[i]-2*rec_s[2*i];
// for(j=0;j<fra_long;j++)
//printf("%f,,",l_ex[j]);
}
void logmap()
{
interlize_a();
interlize_b();
update_a();
update_b();
get_LLR();
get_LL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -