⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vitcore.c

📁 Proakis《contemporarycommunication systems using matlab》matlab源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
       *        dec = rem((dec - 1), n_std_sta);
       *
       *        inp = de2bi(solu(trace_eli, starter*n_std_sta+dec+1)-1, K);
       *        if isempty(C)
       *            tran_indx = starter + 1 + (num_k -1) * n_std_sta;
       *            out = B(tran_indx, :)';
       *        else
       *            cur_sta = cur_sta_pre(starter+1, :)';
       *            out = rem(C * cur_sta + D * inp(:),2);
       *        end;
       */
      if ( expen_flag != 0 ){  /* here, expen_flag != 0 */ 
        for(i=0; i < PowPowM; i++){
          if( sol[i] <= 0 ){
            loc_exp = sol[i];
            i = PowPowM;
          }
        }
        for(i=0; i < PowPowM; i++){
          if( sol[i] <= 0 && loc_exp < sol[i])
            loc_exp = sol[i];
        }
        for(i=0; i < PowPowM; i++){
          if( sol[i] == loc_exp ){
            dec = i;
            i = PowPowM;
          }
        }
        dec = dec % n_std_sta;
      } else {
        for(i=0; i < PowPowM; i++){
          if( sol1[i] >= 0 ){
            loc_exp1 = sol1[i];
            i = PowPowM;
          }
        }
        for(i=0; i < PowPowM; i++){
          if( sol1[i] >= 0 && loc_exp1 > sol1[i])
            loc_exp1 = sol1[i];
        }
        for(i=0; i < PowPowM; i++){
          if( sol1[i] == loc_exp1 ){
            dec = i;
            i = PowPowM;
          }
        }
        dec = dec % n_std_sta;
      }
      num_K = solu[trace_eli-1+leng*(starter*n_std_sta+dec)] - 1;
      de2bi(&num_K, K, one, inp);

      if( len_C == 0 ){
        tran_indx = starter + 1 + num_K*n_std_sta;
        for(i=0; i < N; i++)
          out[i] = B[tran_indx-1+i*(rowFunc-2)];
      } else {
        for(i=0; i < M; i++)
          cur_sta[i] = cur_sta_pre[starter + i*n_std_sta];
        for(i=0; i < N; i++){
          out[i] = 0;
          for(l=0; l < M; l++)
            out[i] = out[i] + C[i+l*N]*cur_sta[l];
          for(l=0; l < K; l++)
            out[i] = out[i] + D[i+l*N]*inp[l];
          out[i] = out[i] % 2;
        }
      }

      /*        msg = [msg; inp];
       *        codd = [codd; out'];
       *        [n_msg, m_msg] = size(msg);
       *        if nargout > 1
       *            if expen_flag
       *                % find the expense by the transfer probability
       *                expen_0 = find(out' <= 0.5);
       *                expen_1 = find(out' > 0.5);
       *                loc_exp = sum([tran_prob(2,expen_work(expen_0)) 0])...
       *                          +sum([tran_prob(3,expen_work(expen_1)) 0]);
       *            else
       *                loc_exp = sum(rem(code(n_msg, :) + out', 2));
       *            end
       *            expen = [expen; loc_exp];
       *        end;
       */
      for( i=0; i < K; i++)
        msg[n_msg+i*n_code] = inp[i];
      n_msg++ ;
      for( i=0; i < N; i++)
        codd[n_codd+i*n_code] = out[i];
      n_codd++ ;

      /* calculate the second output 'expen' */
      if( expen_flag != 0 ){
        lenIndx0= 0;
        for(i=0; i < N; i++){
          if( out[i] <= 0.5 ){
            expenOut[lenIndx0] = i;
            lenIndx0++;
          }
        }
        lenIndx1 = 0;
        for(i=0; i < N; i++){
          if( out[i] > 0.5 ){
            expenOut[lenIndx1+lenIndx0] = i;
            lenIndx1++;
          }
        }
        loc_exp = 0;
        for(i=0; i < lenIndx0; i++)
          loc_exp = loc_exp + tran_prob[1+n_tran_prob*(expen_work[expenOut[i]]-1)];
        for(i=0; i < lenIndx1; i++)
          loc_exp = loc_exp + tran_prob[2+n_tran_prob*(expen_work[expenOut[i+lenIndx0]]-1)];
        expen[len_expen] = loc_exp;
      }else{
        loca_exp1 = 0;
        for(i=0; i < N; i++)
          loca_exp1 = loca_exp1 + ((int)code[n_msg-1+i*n_code] + out[i]) % 2;
        expen[len_expen] = loca_exp1;
      }
      len_expen++;

      if( len_plot_flag > 0 ){
        Matrix *lhs2[1], *rhs2[1];

        rhs2[0] = mxCreateFull(5, 1, 0);
        mxGetPr(rhs2[0])[0] = n_msg;
        mxGetPr(rhs2[0])[1] = starter;
        mxGetPr(rhs2[0])[2] = dec;
        mxGetPr(rhs2[0])[3] = plot_flag[0];
        mxGetPr(rhs2[0])[4] = M;

        mexCallMATLAB(1, lhs2, 1, rhs2, "vitplot2");

        mxFreeMatrix(lhs2[0]);
      }
      /*        starter = dec;
       *    end; %(if i >= leng)
       *    pre_state = aft_state;
       *    aft_state = [];
       *end;
       */
      starter = dec;
    } /* the end of  (if i >= leng) */
    for( i=0; i < len_aft_state; i++ )
      pre_state[i] = aft_state[i];
    len_pre_state = len_aft_state;  
    len_aft_state = 0;
  }

  /*for i =  1 : leng-1
   *    sol = solution;
   *    trace_eli = rem(trace_num + i, leng) + 1;
   *    if i < leng-1
   *        sol(1:n_std_sta) = expense(trace_num, 1:n_std_sta);
   *        for j_k = 1 : leng - 2 - i
   *            j_pre = rem(trace_num - j_k - 1 + leng, leng) + 1;
   *            sol = vitshort(expense(j_pre, :), sol, n_std_sta, expen_flag);
   *        end;
   *        tmp = (ones(n_std_sta,1) * expense(trace_eli, [starter+1:n_std_sta:PowPowM]))';
   *        sol = sol + tmp(:)';
   *        if expen_flag
   *            loc_exp =  max(sol(find(~isnan(sol))));   
   *        else
   *            loc_exp =  min(sol(find(~isnan(sol))));
   *        end
   *        dec = find(sol == loc_exp);
   *        dec = dec(1);
   *        dec = rem((dec - 1), n_std_sta);
   *    else
   *        dec = 0;
   *    end;
   */
  for(ii=1; ii <= leng-1; ii++){
    if( expen_flag != 0 ){        /* here, expen_flag != 0 */ 
      for(i=0; i < PowPowM; i++)
        sol[i] = solution[i];
    } else {    
      for(i=0; i < PowPowM; i++)
        sol1[i] = solution1[i];
    }
    trace_eli = (trace_num + ii) % leng + 1;

    if( ii < leng-1 ){
      if( expen_flag != 0 ){        /* here, expen_flag != 0 */ 
        for(i=0; i < n_std_sta; i++)
          sol[i] = expense[trace_num-1 + i*leng];
        for(j_k=1; j_k <= leng-2-ii; j_k++){
          j_pre = (trace_num - j_k - 1 + leng) % leng + 1;  
          for( i=0; i < PowPowM; i++)
            expen_tmp[i] = expense[j_pre-1 + i*leng];
          shortdbl(expen_tmp, sol, n_std_sta, tmpRwork, tmpIwork);
        }
        for(j=0; j < n_std_sta; j++){
          for(i=0; i < n_std_sta; i++){
            if( expense[trace_eli-1+(starter+i*n_std_sta)*leng] > 0 || sol[i+j*n_std_sta] > 0 )
              sol[i+j*n_std_sta] = 1;
            else
              sol[i+j*n_std_sta] = sol[i+j*n_std_sta] + expense[trace_eli-1+(starter+i*n_std_sta)*leng];
          }
        }
        for(i=0; i < PowPowM; i++){
          if( sol[i] <= 0 ){
            loc_exp = sol[i];
            i = PowPowM;
          }
        }
        for(i=0; i < PowPowM; i++){
          if( sol[i] <= 0 && loc_exp < sol[i])
            loc_exp = sol[i];
        }
        for(i=0; i < PowPowM; i++){
          if( sol[i] == loc_exp ){
            dec = i;
            i = PowPowM;
          }
        }
      } else {
        for(i=0; i < n_std_sta; i++)
          sol1[i] = expense1[trace_num-1 + i*leng];
        for(j_k=1; j_k <= leng-2-ii; j_k++){
          j_pre = (trace_num - j_k - 1 + leng) % leng + 1;  
          for( i=0; i < PowPowM; i++)
            expen_tmp1[i] = expense1[j_pre-1 + i*leng];
          shortint(expen_tmp1, sol1, n_std_sta, tmpIwork);
        }
        for(j=0; j < n_std_sta; j++){
          for(i=0; i < n_std_sta; i++){
            if( expense1[trace_eli-1+(starter+i*n_std_sta)*leng] < 0 || sol1[i+j*n_std_sta] < 0)
              sol1[i+j*n_std_sta] = -1;
            else
              sol1[i+j*n_std_sta] = sol1[i+j*n_std_sta] + expense1[trace_eli-1+(starter+i*n_std_sta)*leng];
          }
        }
        
        for(i=0; i < PowPowM; i++){
          if( sol1[i] >= 0 ){
            loc_exp1 = sol1[i];
            i = PowPowM;
          }
        }
        for(i=0; i < PowPowM; i++){
          if( sol1[i] >= 0 && loc_exp1 > sol1[i])
            loc_exp1 = sol1[i];
        }
        for(i=0; i < PowPowM; i++){
          if( sol1[i] == loc_exp1 ){
            dec = i;
            i = PowPowM;
          }
        }
      }
      dec = dec % n_std_sta;
    } else {
      dec = 0;
	} /* end -- if( ii < leng-1 ) */

    /*    inp = de2bi(solu(trace_eli, starter*n_std_sta+dec+1)-1, K);
     *    cur_sta = de2bi(starter, num_state);
     *    out = rem(C*cur_sta' + D * inp', 2);
     *    msg = [msg; inp];
     *    codd = [codd; out'];
     *    [n_msg, m_msg] = size(msg);
     */
    num_K = solu[trace_eli-1+leng*(starter*n_std_sta+dec)] - 1;
    de2bi(&num_K, K, one, inp);
    de2bi(&starter, num_state, one, cur_sta);

    if( len_C == 0 ){
      tran_indx = starter + 1 + num_K*n_std_sta;
      for(i=0; i < N; i++)
        out[i] = B[tran_indx-1+i*(rowFunc-2)];
    } else {
      for(i=0; i < N; i++){
        out[i] = 0;
        for(l=0; l < M; l++)
          out[i] = out[i] + C[i+l*N]*cur_sta[l];
        for(l=0; l < K; l++)
          out[i] = out[i] + D[i+l*N]*inp[l];
        out[i] = out[i] % 2;
      }
    }
    for( i=0; i < K; i++)
      msg[n_msg+i*n_code] = inp[i];
    n_msg++ ;
    for( i=0; i < N; i++)
      codd[n_codd+i*n_code] = out[i];
    n_codd++ ;

    /*    if nargout > 1
     *        if expen_flag
     *            % find the expense by the transfer probability
     *            expen_0 = find(out' <= 0.5);
     *            expen_1 = find(out' > 0.5);
     *            loc_exp = sum([tran_prob(2,expen_work(expen_0)) 0])...
     *                      +sum([tran_prob(3,expen_work(expen_1)) 0]);
     *        else
     *            loc_exp = sum(rem(code(n_msg, :) + out', 2));
     *        end
     *        expen = [expen; loc_exp];
     *    end;
     */
    if(expen_flag != 0){
      lenIndx0= 0;
      for(i=0; i < N; i++){
        if( out[i] <= 0.5 ){
          expenOut[lenIndx0] = i;
          lenIndx0++;
        }
      }
      lenIndx1 = 0;
      for(i=0; i < N; i++){
        if( out[i] > 0.5 ){
          expenOut[lenIndx1+lenIndx0] = i;
          lenIndx1++;
        }
      }
      loc_exp = 0;
      for(i=0; i < lenIndx0; i++)
        loc_exp = loc_exp + tran_prob[1+n_tran_prob*(expen_work[expenOut[i]]-1)];
      for(i=0; i < lenIndx1; i++)
        loc_exp = loc_exp + tran_prob[2+n_tran_prob*(expen_work[expenOut[i+lenIndx0]]-1)];
      expen[len_expen] = loc_exp;
      len_expen ++;
    } else {
      loca_exp1 = 0;
      for(i=0; i < N; i++)
        loca_exp1 = loca_exp1 + ((int)code[n_msg-1 + i*n_code] + out[i]) % 2;
      expen[len_expen] = loca_exp1;
      len_expen ++;
    }

    if( len_plot_flag > 0 ){
      Matrix *lhs2[1], *rhs2[1];

      rhs2[0] = mxCreateFull(5, 1, 0);
      mxGetPr(rhs2[0])[0] = n_msg;
      mxGetPr(rhs2[0])[1] = starter;
      mxGetPr(rhs2[0])[2] = dec;
      mxGetPr(rhs2[0])[3] = plot_flag[0];
      mxGetPr(rhs2[0])[4] = M;
        
      mexCallMATLAB(1, lhs2, 1, rhs2, "vitplot2");

      mxFreeMatrix(lhs2[0]);
    }
    /*    starter = dec;
     *end;
     */
    starter = dec;
  }

  /*% cut the extra message length
   *[n_msg, m_msg] = size(msg);
   *msg(n_msg-M+1:n_msg, :) = [];
   *if plot_flag(1)
   *    set(xx,'Color',[0 1 1]);
   * hold off
   *end;
   *% end of VITERBI.M
   */
  mxSetM(plhs[0], n_msg-M);
  mxSetN(plhs[0], K);
  for(i=0; i < n_msg-M; i++){
    for(j=0; j < K; j++)
      mxGetPr(plhs[0])[i + j*(n_msg-M)] = msg[i + j*n_code];
  }
  return;
}
/*--end of VITERBI.C --*/
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -