Пример #1
0
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;
}
Пример #2
0
Файл: LDPC.c Проект: ksdb/LDPC
// 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;
}