#include "stdafx.h" | |
#include "tools.h" | |
#include <math.h> | |
#include <string.h> | |
#include "decode.h" | |
#include "decode.h" | |
void turbo_decode(double Lc ,int g[][4] ,int ispunctured ,const int pattern [] ,int decode_method ,const double * receive , double **soft_out){ | |
if (ispunctured)//删余 | |
{ | |
// | |
} | |
else | |
{ | |
/*double e_info [frame_size+3] ; | |
double die_info [frame_size+3] ; | |
double so [frame_size+3 ] ; | |
double so1 [frame_size+3] ;*/ | |
double in1 [2][frame_size+3] ; | |
double in2 [2][frame_size+3] ; | |
for (int i=0; i<frame_size+3; i++) | |
{ | |
in1[0][i] = receive[3 * i] ; | |
in1[1][i] = receive[3 * i + 1] ; | |
in2[1][i] = receive[3 * i + 2] ; | |
} | |
for(int i=0 ;i< frame_size+3 ; i++){ | |
in2[0][i] = in1[0][pattern[i]-1];//交织 因为交织的数组为(1-1024,故减1) | |
} | |
double * e_info = (double *)malloc(sizeof(double) * (frame_size+3) ); | |
double * die_info = (double *)malloc(sizeof(double) * (frame_size+3) ); | |
double * so = (double *)malloc(sizeof(double) * (frame_size+3) ); | |
double so1 [frame_size+3] ; | |
for (int i=0; i<frame_size+3; i++) | |
{ | |
e_info[i] = 0 ; | |
} | |
for (int inter = 0 ; inter< inter_num; inter++)//开始迭代 | |
{ | |
// printf(" \n\n inter = %d\n\n ", inter) ; | |
for(int i=0 ;i< frame_size+3 ; i++){ //解交织 | |
die_info [pattern[i]-1] = e_info[i] ; | |
} | |
// printf("before decoder 1---------die_info[0] = %lf \n", die_info[0] ) ; | |
maxLogMap(in1, g, Lc, (const double *)die_info, e_info, so) ; // | |
//rintf("after decoder 1---------e_info[0] = %lf \n", e_info[0] ) ; | |
for(int i=0 ;i< frame_size+3 ; i++){ | |
die_info[i] = e_info[pattern[i]-1] ;//交织 | |
} | |
// printf("before decoder 2---------die_info[0] = %lf \n", die_info[0] ) ; | |
maxLogMap(in2 , g, Lc, (const double *) die_info, e_info, so) ; //改变了e_info | |
//rintf("after decoder 2 ---------e_info[0] = %lf \n", e_info[0] ) ; | |
for(int i=0 ;i< frame_size+3 ; i++){ //解交织 | |
so1 [(pattern[i]-1)] = so[i] ; | |
} | |
for (int i1 = 0 ; i1<frame_size ; i1++)//舍去最后的三个数字 | |
{ | |
soft_out[inter][i1] = so1[i1] ; | |
} | |
} | |
free(e_info) ; | |
e_info = NULL ; | |
free(die_info) ; | |
die_info = NULL ; | |
free(so) ; | |
so=NULL; | |
}//else 结束 | |
} | |
void genTrellis(int g[][4],int lstate [][8] , int nstate [][8],int lpara[][8],int npara[][8]){ | |
int k = 4 ; | |
int m =k-1 ; | |
int in = 0 ; | |
int state_temp [3] ;//input0和input1都用 | |
int state[3] ;//input0和input1都用 | |
int *gp1 = &g[0][1] ;//g(1,2:end) | |
int *gp2 = &g[1][0] ;//g(2,:) | |
int para = 0 ; | |
int state0_temp1 [4] ; | |
int state0_temp2[3] ; | |
int state1_temp1[4] ; | |
int state1_temp2[3] ; | |
int nstate_index ; | |
for (int i=0 ;i<8 ;i++ ) | |
{ | |
de2bi(i,state_temp) ; | |
//input 0 | |
fliplr(state,state_temp,3) ; | |
in = (matrix_Mul(gp1,state,3)%2)^0 ; | |
state0_temp1[0] = in ; | |
for (int j = 1; j<4 ; j++) | |
{ | |
state0_temp1[j] = state[j-1] ; | |
} | |
para = matrix_Mul(gp2,state0_temp1,4)%2 ; | |
right_shift(in,state,3) ; | |
fliplr(state0_temp2,state,3) ; | |
nstate_index = bi2de(state0_temp2, 3) ; | |
nstate[0][i] = nstate_index +1 ; | |
lpara[0][nstate_index] = 2 * para -1 ; | |
lstate[0][nstate_index] = i+1 ; | |
//input 1 | |
fliplr(state,state_temp,3) ; //重置state | |
in = (matrix_Mul(gp1, state,3)%2)^1 ; | |
state1_temp1[0] = in ; | |
for (int j = 1; j<4 ; j++) | |
{ | |
state1_temp1[j] = state[j-1] ; | |
} | |
para = matrix_Mul(gp2,state1_temp1,4 )%2 ; | |
right_shift(in,state,3) ; | |
fliplr(state1_temp2, state, 3) ; | |
nstate_index = bi2de(state1_temp2, 3); | |
nstate[1][i] = nstate_index +1 ; | |
lpara[1][nstate_index] = 2* para - 1 ; | |
lstate[1][nstate_index] = i+1 ; | |
} | |
//以下产生npara | |
for (int i = 0 ; i<2 ;i++) | |
{ | |
for (int j=0; j<8; j++) | |
{ | |
//找到上一个状态 | |
int state_temp ; | |
state_temp = lstate[i][j] ; | |
int para_temp ; | |
para_temp = lpara[i][j] ; | |
npara[i][state_temp-1] = para_temp ; | |
} | |
} | |
} | |
#define random(x) (rand()%x) | |
#define pi 3.1415926 | |
#include "stdafx.h" | |
#include<time.h> | |
#include<math.h> | |
#include"encode.h" | |
#include"decode.h" | |
extern void add_awgn_noise(double * receive ,const int * y, const double sigma ); | |
extern void sRandom(int a[],const int N, const int s) ; | |
extern void inter3GPP2 (int inLeaver_par[], int code_length); | |
int errorCount(const int input[] ,const int hard_decesion []) ; | |
void gen_rand(int * rand_out) ; | |
void main() | |
{ | |
//定义一些参数 通过命令行输入选择 | |
int decode_method = 0 ; | |
// int inter_style ; | |
int ispunctured ; | |
//定义一些参数 | |
int g[2][4] = { {1,0,1,1},{1,1,0,1} }; | |
int Tx_times[] = {50, 50, 50, 50, 50, 50, 50, 50, 50}; //发送帧数 测试用 目前是9个数据 | |
//int Tx_times[] = {500, 500, 500, 500, 500, 500, 500, 500, 500}; //发送帧数 测试用 目前是9个数据 | |
double EbN0_Vec[] = {0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8} ;// 信噪比 目前是9个数据 | |
int error[inter_num][Ebn0_num] = {0} ; | |
double errsproMAXLog[inter_num][Ebn0_num] = {0} ; | |
int hard_decision [inter_num][frame_size] = {0} ; | |
int total_len = 3*(frame_size+3) ; | |
int y_len = 0 ; | |
int pattern[frame_size+3] ; | |
ispunctured = 0 ; | |
double rate = 1.0/(3-ispunctured); // rate | |
//int x[frame_size] ; //产生1021个数据,后面3个补充 | |
//inter3GPP2(pattern ,frame_size+3) ;//此种不一定能找到合适的交织方法 | |
const int s = floor(sqrt((float)((3+frame_size)/2))) ; | |
sRandom(pattern, 3+frame_size, s) ; | |
//init(); | |
for(int i=0 ; i < Ebn0_num ; i++) | |
{ | |
double SNR = EbN0_Vec[i] ; | |
double Lc = 4 * rate * pow(10,SNR/10) ; | |
//double Lc = 1.3962; | |
double sigma = 1.0/sqrt(2 * rate * pow(10,SNR/10)); | |
for(int j = 0 ; j < Tx_times[i] ; j++) | |
{ | |
printf("i=%d , j=%d \n",i , j) ; | |
int x [frame_size] ; | |
gen_rand(x) ; | |
//如果删余,只取y和noise数组的前2/3 | |
int * y = (int *)malloc(sizeof(int) * (3*(frame_size+3))) ; | |
double * receive = (double *)malloc(sizeof(double ) * (3*(3+frame_size))) ; | |
turbo_encode(x ,total_len , y ,pattern,ispunctured ,g) ;//得到 input 和y | |
/* for (int re_i = 0 ; re_i <3*(frame_size+3) ; re_i++) | |
{ | |
receive[i] = y[i] ; | |
}*/ | |
add_awgn_noise(receive, y , 0 ) ;//此处sigma = 0 表示未加入噪声 | |
free(y) ; | |
//一帧接收到后,信噪比计算 | |
//译码部分 | |
double ** soft_out ; | |
soft_out = (double **)malloc(sizeof(double *) * inter_num); | |
for (int soft_out_i =0; soft_out_i < inter_num ; soft_out_i++){ | |
soft_out[soft_out_i] = (double *)malloc(sizeof(double)* frame_size); | |
} | |
turbo_decode(Lc ,g,ispunctured ,pattern ,decode_method ,receive ,soft_out) ; | |
free(receive) ; | |
// | |
for(int ii = 0 ; ii< inter_num ; ii++){ | |
for(int jj =0 ;jj< frame_size ;jj++){//省略最后三个 | |
if( soft_out[ii][jj]>=0 ) | |
hard_decision[ii][jj] = 1 ; | |
else | |
{ | |
hard_decision[ii][jj] = 0 ; | |
} | |
} | |
} | |
for (int soft_out_i=0; soft_out_i < inter_num; soft_out_i++){ | |
free(soft_out[soft_out_i]); | |
} | |
free(soft_out); | |
// | |
for (int k=0 ; k < inter_num ;k++ ){ | |
error[k][i] = error[k][i] + errorCount(x ,hard_decision[k] ) ; | |
if (error[0][i]!=0) | |
{ | |
printf("\n\nerror!!!\n") ; | |
printf("i= %d, j=%d",i,j) ; | |
} | |
} | |
} | |
// printf("一个信噪比结束 \n" ) ; | |
} | |
// printf("所有信噪比结束 \n" ) ; | |
for (int iii = 0; iii < inter_num ; iii++) | |
{ | |
for (int jjj = 0; jjj < Ebn0_num; jjj++) | |
{ | |
errsproMAXLog[iii][jjj] = (double)error[iii][jjj]/(Tx_times[jjj] * frame_size ) ; | |
} | |
} | |
double (*vect) [Ebn0_num] ; | |
vect = errsproMAXLog ; | |
printTwoDiVect(vect, inter_num) ; | |
printf("\nover") ; | |
} | |
void gen_rand(int * rand_out) | |
{ | |
for(int x=0 ; x<frame_size; x++){ | |
rand_out[x] = random(2) ; | |
} | |
} | |
int errorCount(const int x [] ,const int hard_decesion []){ | |
int count = 0 ; | |
for (int i = 0 ; i<frame_size ;i++) | |
{ | |
if(x[i]!= hard_decesion[i]) | |
count++ ; | |
} | |
return count ; | |
} | |
/* | |
void init(){ | |
//根据输入的参数初始化 :码率 译码方式(并行、串行等) | |
printf("初始化开始<--------------------------------------------->\n") ; | |
printf("请根据提示输入参数!\n") ; | |
//此处如何设置默认值? | |
printf("inter_style 为(默认是1):1--3GPP inter") ; | |
scanf_s("%d",&inter_style) ; | |
if(inter_style==0) | |
inter_style = 1 ; | |
printf("decode_method 为(默认是1):1--串行译码") ; | |
scanf_s("%d",&decode_method) ; | |
if(inter_style==0) | |
inter_style = 1 ; | |
printf("ispunctured 为(默认是1):1--R=1/3 ") ; | |
if(ispunctured==0) | |
ispunctured = 1 ; | |
} | |
*/ |
#include "stdafx.h" | |
#include "tools.h" | |
#include <math.h> | |
#include "decode.h" | |
double maxVect(const double vect[], int vect_len) ; | |
void maxLogMap(const double input[][frame_size+3] , int g[][4],double Lc,const double * pri_info, double * e_info, double *so ) { | |
//产生网格 | |
int lstate [2][8]; | |
int nstate [2][8] ; | |
int lpara [2][8] ; | |
int npara [2][8] ; | |
genTrellis(g, lstate , nstate, lpara, npara) ; | |
//主要译码部分 | |
const int nstates = 8 ; | |
//alpha beta gamma 初始化 | |
double alpha[frame_size +3][nstates] , beta[frame_size +3+1][nstates] ; | |
double gamma0[frame_size +3][nstates], gamma1[frame_size +3][nstates] ; | |
const int infinity = 1000 ; | |
alpha[0][0] = 0 ; | |
for (int st = 1; st<nstates; st++) | |
{ | |
alpha [0][st] = -infinity ;//初始化第1行 | |
} | |
//beta | |
double log_temp = 1.0/8 ; | |
for (int beta_col = 0; beta_col<nstates; beta_col++ ) | |
{ | |
beta[frame_size +3][beta_col] = log(log_temp) ; //初始化最后一行 | |
} | |
//------------------------------------------------------------------------------------ | |
for (int i = 0; i<frame_size +3; i++) | |
{ | |
for (int st = 0; st<nstates; st++) | |
{ | |
double mul_temp ; | |
mul_temp = -1 * input[0][i] + lpara[0][st] * input[1][i] ; //输入0 | |
gamma0[i][st] = -1 * pri_info[i]/2 + Lc/2 * mul_temp ; | |
mul_temp = 1 * input[0][i] + lpara[1][st] * input[1][i] ; //输入1 | |
gamma1[i][st] = pri_info[i]/2 + Lc/2 * mul_temp ; | |
} | |
} | |
//-------------------------------------------------------------------------------------- | |
for (int i = 1; i<frame_size +3; i++) | |
{ | |
int lstate_temp1 ,lstate_temp2 ; | |
double data0 ,data1 ; | |
for (int st = 0; st<nstates; st++ ) | |
{ | |
lstate_temp1 = lstate[0][st] -1; | |
data0 = gamma0[i-1][st] + alpha[i-1][lstate_temp1] ; | |
lstate_temp2 = lstate[1][st]-1 ; | |
data1 = gamma1[i-1][st] + alpha[i-1][lstate_temp2] ; | |
alpha[i][st] = (data0>data1 ? data0 :data1 ); | |
} | |
} | |
//------------------------------------------------------------------------------------------------------------ | |
for (int i = frame_size +3-1; i>0 ; i--) | |
{ | |
int data0, data1 ; | |
int nstate_temp0,nstate_temp1 ; | |
for (int st = 0 ; st<nstates; st++) | |
{ | |
nstate_temp0 = nstate[0][st] -1; | |
data0 = gamma0[i][nstate_temp0] + beta[i+1][nstate_temp0] ; | |
nstate_temp1 = nstate[1][st] -1; | |
data1 = gamma1[i][nstate_temp1] + beta[i+1][nstate_temp1] ; | |
beta[i][st] = (data0>data1 ? data0 :data1 ); | |
} | |
} | |
//---------------------------------------------------------------------------------------------------------------- | |
double temp0[nstates] = {0} ; | |
double temp1[nstates] ={0 }; | |
double so_temp [frame_size+3] = {0}; | |
for (int i=0; i<frame_size +3; i++) | |
{ | |
int lstate_temp1, lstate_temp2 ; | |
for (int st = 0 ; st<nstates; st++) | |
{ | |
lstate_temp1 = lstate[0][st] -1 ; | |
lstate_temp2 = lstate[1][st] -1; | |
temp0[st] = gamma0[i][st] + alpha[i][lstate_temp1] + beta[i+1][st] ; | |
temp1[st] = gamma1[i][st] + alpha[i][lstate_temp2] + beta[i+1][st] ; | |
} | |
so_temp [i] = maxVect(temp1,nstates) - maxVect(temp0, nstates) ; | |
} | |
//---------------------------------------------------------------------------- | |
for (int i =0; i<frame_size+3; i++) | |
{ | |
so[i] = so_temp[i] ; | |
} | |
for (int i = 0; i<frame_size +3; i++) | |
{ | |
e_info[i] = so[i] - pri_info[i] - Lc * input[0][i] ; | |
} | |
} | |
double maxVect(const double vect[], int vect_len){ | |
double max = vect[0] ; | |
int i = 1 ; | |
while (i<vect_len) | |
{ | |
if(vect[i]>=max ){ | |
max = vect[i] ; | |
} | |
i++ ; | |
} | |
return max ; | |
} | |
![]() |
1
txx 2013-08-05 17:00:58 +08:00
我曾经在double 溢出的时候收到了这个......
|
![]() |
2
aoyoo 2013-08-05 17:03:23 +08:00
“我仿真发送01数据”具体指的是什么呢?com口发送?socket发送?还是什么?
|
![]() |
4
xdeng 2013-08-05 17:24:50 +08:00
贴出来看看啊
|
![]() |
5
xdeng 2013-08-05 17:25:44 +08:00
越界? 溢出?
|
6
timonwong 2013-08-05 17:47:11 +08:00 ![]() 自己检查代码,-1.#IND就是NaN,常见于除数为0的错误
|
9
timonwong 2013-08-05 20:54:58 +08:00
@itfanr
那么我猜你发送、接收没有处理好,要么数据有丢失,要么数据有覆盖。你最好是在发送端Dump发送的数据(或者只Dump异常的数据),如果发送的数据也有异常,那么先暂时排除接收端的问题,检查发送端的代码(先检查浮点运算,再检查内存),浮点运算出现NaN,除了除以0,还有很多情况:取负数的平方根、0的0次方,0和正、负无穷相乘,等等等等,如果你有除法,检查被除数为0(这个为0不见得是等于0,具体要看epsilon,请查看IEEE754相关资料,快速了解的话请先看这篇: http://en.wikipedia.org/wiki/Machine_epsilon)。 另外所以要仔细查看有没有未初始化变量,或者变量的值被覆盖了(比如覆盖全`1`)。 |
![]() |
10
itfanr OP 用到了两个主要文件,在main里面调用turbo_decode函数:
//部分main代码: double ** soft_out ; soft_out = (double **)malloc(sizeof(double *) * inter_num); for (int soft_out_i =0; soft_out_i < inter_num ; soft_out_i++) { soft_out[soft_out_i] = (double *)malloc(sizeof(double)* frame_size); } turbo_decode(Lc ,g,ispunctured ,pattern ,decode_method ,receive ,soft_out) ; //1.decode.cpp #include "stdafx.h" #include "tools.h" #include <math.h> #include <string.h> #include "decode.h" #include "decode.h" void turbo_decode(double Lc ,int g[][4] ,int ispunctured ,const int pattern [] ,int decode_method ,const double * receive , double **soft_out){ if (ispunctured)//删余 { // } else { /*double e_info [frame_size+3] ; double die_info [frame_size+3] ; double so [frame_size+3 ] ; double so1 [frame_size+3] ;*/ double in1 [2][frame_size+3] ; double in2 [2][frame_size+3] ; for (int i=0; i<frame_size+3; i++) { in1[0][i] = receive[3 * i] ; in1[1][i] = receive[3 * i + 1] ; in2[1][i] = receive[3 * i + 2] ; } for(int i=0 ;i< frame_size+3 ; i++){ in2[0][i] = in1[0][pattern[i]-1];//交织 因为交织的数组为(1-1024,故减1) } double * e_info = (double *)malloc(sizeof(double) * (frame_size+3) ); double * die_info = (double *)malloc(sizeof(double) * (frame_size+3) ); double * so = (double *)malloc(sizeof(double) * (frame_size+3) ); double so1 [frame_size+3] ; for (int i=0; i<frame_size+3; i++) { e_info[i] = 0 ; } for (int inter = 0 ; inter< inter_num; inter++)//开始迭代 { // printf(" \n\n inter = %d\n\n ", inter) ; for(int i=0 ;i< frame_size+3 ; i++){ //解交织 die_info [pattern[i]-1] = e_info[i] ; } // printf("before decoder 1---------die_info[0] = %lf \n", die_info[0] ) ; maxLogMap(in1, g, Lc, (const double *)die_info, e_info, so) ; // //rintf("after decoder 1---------e_info[0] = %lf \n", e_info[0] ) ; for(int i=0 ;i< frame_size+3 ; i++){ die_info[i] = e_info[pattern[i]-1] ;//交织 } // printf("before decoder 2---------die_info[0] = %lf \n", die_info[0] ) ; maxLogMap(in2 , g, Lc, (const double *) die_info, e_info, so) ; //改变了e_info //rintf("after decoder 2 ---------e_info[0] = %lf \n", e_info[0] ) ; for(int i=0 ;i< frame_size+3 ; i++){ //解交织 so1 [(pattern[i]-1)] = so[i] ; } for (int i1 = 0 ; i1<frame_size ; i1++)//舍去最后的三个数字 { soft_out[inter][i1] = so1[i1] ; } } free(e_info) ; e_info = NULL ; free(die_info) ; die_info = NULL ; free(so) ; so=NULL; }//else 结束 } void genTrellis(int g[][4],int lstate [][8] , int nstate [][8],int lpara[][8],int npara[][8]){ int k = 4 ; int m =k-1 ; int in = 0 ; int state_temp [3] ;//input0和input1都用 int state[3] ;//input0和input1都用 int *gp1 = &g[0][1] ;//g(1,2:end) int *gp2 = &g[1][0] ;//g(2,:) int para = 0 ; int state0_temp1 [4] ; int state0_temp2[3] ; int state1_temp1[4] ; int state1_temp2[3] ; int nstate_index ; for (int i=0 ;i<8 ;i++ ) { de2bi(i,state_temp) ; //input 0 fliplr(state,state_temp,3) ; in = (matrix_Mul(gp1,state,3)%2)^0 ; state0_temp1[0] = in ; for (int j = 1; j<4 ; j++) { state0_temp1[j] = state[j-1] ; } para = matrix_Mul(gp2,state0_temp1,4)%2 ; right_shift(in,state,3) ; fliplr(state0_temp2,state,3) ; nstate_index = bi2de(state0_temp2, 3) ; nstate[0][i] = nstate_index +1 ; lpara[0][nstate_index] = 2 * para -1 ; lstate[0][nstate_index] = i+1 ; //input 1 fliplr(state,state_temp,3) ; //重置state in = (matrix_Mul(gp1, state,3)%2)^1 ; state1_temp1[0] = in ; for (int j = 1; j<4 ; j++) { state1_temp1[j] = state[j-1] ; } para = matrix_Mul(gp2,state1_temp1,4 )%2 ; right_shift(in,state,3) ; fliplr(state1_temp2, state, 3) ; nstate_index = bi2de(state1_temp2, 3); nstate[1][i] = nstate_index +1 ; lpara[1][nstate_index] = 2* para - 1 ; lstate[1][nstate_index] = i+1 ; } //以下产生npara for (int i = 0 ; i<2 ;i++) { for (int j=0; j<8; j++) { //找到上一个状态 int state_temp ; state_temp = lstate[i][j] ; int para_temp ; para_temp = lpara[i][j] ; npara[i][state_temp-1] = para_temp ; } } } 2.subdecode.cpp #include "stdafx.h" #include "tools.h" #include <math.h> #include "decode.h" double maxVect(const double vect[], int vect_len) ; void maxLogMap(const double input[][frame_size+3] , int g[][4],double Lc,const double * pri_info, double * e_info, double *so ) { //产生网格 int lstate [2][8]; int nstate [2][8] ; int lpara [2][8] ; int npara [2][8] ; genTrellis(g, lstate , nstate, lpara, npara) ; //主要译码部分 const int nstates = 8 ; //alpha beta gamma 初始化 double alpha[frame_size +3][nstates] , beta[frame_size +3+1][nstates] ; double gamma0[frame_size +3][nstates], gamma1[frame_size +3][nstates] ; const int infinity = 1000 ; alpha[0][0] = 0 ; for (int st = 1; st<nstates; st++) { alpha [0][st] = -infinity ;//初始化第1行 } //beta double log_temp = 1.0/8 ; for (int beta_col = 0; beta_col<nstates; beta_col++ ) { beta[frame_size +3][beta_col] = log(log_temp) ; //初始化最后一行 } //------------------------------------------------------------------------------------ for (int i = 0; i<frame_size +3; i++) { for (int st = 0; st<nstates; st++) { double mul_temp ; mul_temp = -1 * input[0][i] + lpara[0][st] * input[1][i] ; //输入0 gamma0[i][st] = -1 * pri_info[i]/2 + Lc/2 * mul_temp ; mul_temp = 1 * input[0][i] + lpara[1][st] * input[1][i] ; //输入1 gamma1[i][st] = pri_info[i]/2 + Lc/2 * mul_temp ; } } //-------------------------------------------------------------------------------------- for (int i = 1; i<frame_size +3; i++) { int lstate_temp1 ,lstate_temp2 ; double data0 ,data1 ; for (int st = 0; st<nstates; st++ ) { lstate_temp1 = lstate[0][st] -1; data0 = gamma0[i-1][st] + alpha[i-1][lstate_temp1] ; lstate_temp2 = lstate[1][st]-1 ; data1 = gamma1[i-1][st] + alpha[i-1][lstate_temp2] ; alpha[i][st] = (data0>data1 ? data0 :data1 ); } } //------------------------------------------------------------------------------------------------------------ for (int i = frame_size +3-1; i>0 ; i--) { int data0, data1 ; int nstate_temp0,nstate_temp1 ; for (int st = 0 ; st<nstates; st++) { nstate_temp0 = nstate[0][st] -1; data0 = gamma0[i][nstate_temp0] + beta[i+1][nstate_temp0] ; nstate_temp1 = nstate[1][st] -1; data1 = gamma1[i][nstate_temp1] + beta[i+1][nstate_temp1] ; beta[i][st] = (data0>data1 ? data0 :data1 ); } } //---------------------------------------------------------------------------------------------------------------- double temp0[nstates] = {0} ; double temp1[nstates] ={0 }; double so_temp [frame_size+3] = {0}; for (int i=0; i<frame_size +3; i++) { int lstate_temp1, lstate_temp2 ; for (int st = 0 ; st<nstates; st++) { lstate_temp1 = lstate[0][st] -1 ; lstate_temp2 = lstate[1][st] -1; temp0[st] = gamma0[i][st] + alpha[i][lstate_temp1] + beta[i+1][st] ; temp1[st] = gamma1[i][st] + alpha[i][lstate_temp2] + beta[i+1][st] ; } so_temp [i] = maxVect(temp1,nstates) - maxVect(temp0, nstates) ; } //---------------------------------------------------------------------------- for (int i =0; i<frame_size+3; i++) { so[i] = so_temp[i] ; } for (int i = 0; i<frame_size +3; i++) { e_info[i] = so[i] - pri_info[i] - Lc * input[0][i] ; } } double maxVect(const double vect[], int vect_len){ double max = vect[0] ; int i = 1 ; while (i<vect_len) { if(vect[i]>=max ){ max = vect[i] ; } i++ ; } return max ; } |
13
detailyang 2013-08-05 22:50:04 +08:00
...你应该帖glist上 这样看起来舒服。。
|
![]() |
14
itfanr OP @detailyang glist是什么?我也想高亮啊 这里不行 很郁闷
|
![]() |
15
blueandhack 2013-08-06 02:13:39 +08:00
|