void MStringResize(MString_t *String, size_t Length) { /* Calculate the new byte-count we * need to encompass with blocks */ size_t DataLength = DIVUP(Length, MSTRING_BLOCK_SIZE) * MSTRING_BLOCK_SIZE; /* Expand and reset buffer */ void *Data = dsalloc(DataLength); memset(Data, 0, DataLength); /* Copy old data over */ memcpy(Data, String->Data, String->Length); /* Free the old buffer */ dsfree(String->Data); /* Update string to new buffer */ String->MaxLength = DataLength; String->Data = Data; }
// LDPCのインスタンスを生成 LDPC *generate_LDPC(int weight_row, int weight_col, int n_code, char *exename) { // for loop int i, j, k; LDPC *ldpc = (LDPC *)malloc(sizeof(LDPC)); ldpc->weight_col = weight_col; ldpc->weight_row = weight_row; ldpc->n_code = n_code; // 符号長が行重みの整数倍でない場合は列数を調整 if(n_code%weight_row!=0){ ldpc->n_col = n_code + weight_row - (n_code%weight_row); }else{ ldpc->n_col = n_code; } char str[256]; sprintf(str, "%s_IMG/G_%d_%d_%d.png", exename, ldpc->weight_row, ldpc->weight_col, ldpc->n_code); // ファイルあったらそこから読み込む.なかったら作る if(!load_imagemat(ldpc)){ // 列重み1あたりの行数 int n_row_perblock = ldpc->n_col/ldpc->weight_row; // 行数 ldpc->n_row = n_row_perblock*ldpc->weight_col; PEG(ldpc); // 検査行列のメモリを取る ldpc->H = idalloc(ldpc->n_row, ldpc->n_col); for(i=0;i<ldpc->n_col;i++){ for(j=0;j<ldpc->VC_1p[i];j++){ ldpc->H[ldpc->VC_1[i][j]][i] = 1; } } ifree2(ldpc->VC_1, ldpc->n_col); ifree2(ldpc->CV_1, ldpc->n_row); free(ldpc->VC_1p); free(ldpc->CV_1p); // 既約台形正準形への変形 int **H_irr = idalloc(ldpc->n_row, ldpc->n_col); int *idx_col = isalloc(ldpc->n_col); init_ivec_order(idx_col, ldpc->n_col); ldpc->n_parity = irreduce_binmat(ldpc->H, H_irr, ldpc->n_row, ldpc->n_col, idx_col); // 生成行列のメモリを取る ldpc->n_inf = ldpc->n_col - ldpc->n_parity; ldpc->n_effinf = ldpc->n_inf - (ldpc->n_col-ldpc->n_code); ldpc->G = idalloc(ldpc->n_inf, ldpc->n_col); ldpc->coderate = ldpc->n_effinf/(double)ldpc->n_code; // 生成行列に代入 for(i=0;i<ldpc->n_inf;i++){ ldpc->G[i][i+ldpc->n_parity] = 1; } for(i=0;i<ldpc->n_inf;i++){ for(j=0;j<ldpc->n_parity;j++){ ldpc->G[i][j] = H_irr[j][i+ldpc->n_parity]; } } for(i=0;i<ldpc->n_row;i++){ for(j=0;j<ldpc->n_col;j++){ H_irr[i][j] = ldpc->H[i][j]; } } for(i=0;i<ldpc->n_row;i++){ for(j=0;j<ldpc->n_col;j++){ ldpc->H[i][j] = H_irr[i][idx_col[j]]; } } print_matimage(ldpc); idfree(H_irr, ldpc->n_row); free(idx_col); } // Gの各列に対して1の立ってる行だけ取り出す int *tmp_1 = isalloc(10000); ldpc->G_1 = isalloc_p(ldpc->n_col); ldpc->G_1p = isalloc(ldpc->n_col); for(i=0;i<ldpc->n_col;i++){ for(j=0;j<ldpc->n_inf;j++){ if(ldpc->G[j][i]){ tmp_1[ldpc->G_1p[i]] = j; ldpc->G_1p[i]++; } } ldpc->G_1[i] = isalloc(ldpc->G_1p[i]); for(j=0;j<ldpc->G_1p[i];j++){ ldpc->G_1[i][j] = tmp_1[j]; } } // チェックノードと変数ノードの関係 ldpc->CV_1 = isalloc_p(ldpc->n_row); ldpc->CV_1p = isalloc(ldpc->n_row); for(i=0;i<ldpc->n_row;i++){ for(j=0;j<ldpc->n_col;j++){ if(ldpc->H[i][j]){ tmp_1[ldpc->CV_1p[i]] = j; ldpc->CV_1p[i]++; } } ldpc->CV_1[i] = isalloc(ldpc->CV_1p[i]); for(j=0;j<ldpc->CV_1p[i];j++){ ldpc->CV_1[i][j] = tmp_1[j]; } } ldpc->VC_1 = isalloc_p(ldpc->n_col); ldpc->VC_1p = isalloc(ldpc->n_col); for(i=0;i<ldpc->n_col;i++){ for(j=0;j<ldpc->n_row;j++){ if(ldpc->H[j][i]){ tmp_1[ldpc->VC_1p[i]] = j; ldpc->VC_1p[i]++; } } ldpc->VC_1[i] = isalloc(ldpc->VC_1p[i]); for(j=0;j<ldpc->VC_1p[i];j++){ ldpc->VC_1[i][j] = tmp_1[j]; } } // 逆参照テーブル ldpc->CV_1_inv = isalloc_p(ldpc->n_row); for(i=0;i<ldpc->n_row;i++){ ldpc->CV_1_inv[i] = isalloc(ldpc->CV_1p[i]); for(j=0;j<ldpc->CV_1p[i];j++){ for(k=0;k<ldpc->VC_1p[ldpc->CV_1[i][j]];k++){ if(ldpc->VC_1[ldpc->CV_1[i][j]][k] == i){ ldpc->CV_1_inv[i][j] = k; break; } } } } ldpc->VC_1_inv = isalloc_p(ldpc->n_col); for(i=0;i<ldpc->n_col;i++){ ldpc->VC_1_inv[i] = isalloc(ldpc->VC_1p[i]); for(j=0;j<ldpc->VC_1p[i];j++){ for(k=0;k<ldpc->CV_1p[ldpc->VC_1[i][j]];k++){ if(ldpc->CV_1[ldpc->VC_1[i][j]][k] == i){ ldpc->VC_1_inv[i][j] = k; break; } } } } ldpc->codebits = isalloc(ldpc->n_col); ldpc->infbits_in = isalloc(ldpc->n_inf); ldpc->infbits_out = isalloc(ldpc->n_inf); ldpc->checkbits = isalloc(ldpc->n_row); ldpc->variablebits = isalloc(ldpc->n_col); ldpc->C_llr = dsalloc_p(ldpc->n_row); for(i=0;i<ldpc->n_row;i++){ ldpc->C_llr[i] = dsalloc(ldpc->CV_1p[i]); } ldpc->V_llr = dsalloc_p(ldpc->n_col); for(i=0;i<ldpc->n_col;i++){ ldpc->V_llr[i] = dsalloc(ldpc->VC_1p[i]); } // LLRのケツ数ビットはショートニング分なのでLLR=∞ ldpc->llr = dsalloc(ldpc->n_col); for(i=0;i<ldpc->n_inf-ldpc->n_effinf;i++){ ldpc->llr[ldpc->n_col-i-1] = 12.5; } return ldpc; }