コード例 #1
0
ファイル: freq_sca.c プロジェクト: Distrotech/libaacplus
static int
modifyBands(int max_band_previous, int * diff, int length)
{
  int change=max_band_previous-diff[0];

  

   /* counting previous operation */


     
  if ( change > (diff[length-1] - diff[0]) / 2 )
  {
    
    change = (diff[length-1] - diff[0]) / 2;
  }

   
  diff[0] += change;

   
  diff[length-1] -= change;

  
  Shellsort_int(diff, length);

  

  return(0);
}/* End modifyBands */
コード例 #2
0
ファイル: dsd_frame_sync.c プロジェクト: cyber5tar86/dsd-dmr
int
getFrameSync (dsd_opts * opts, dsd_state * state)
{
  /* detects frame sync and returns frame type
   *  0 = +P25p1
   *  1 = -P25p1
   *  2 = +X2-TDMA (non inverted signal data frame)
   *  3 = -X2-TDMA (inverted signal data frame)
   *  4 = +DMR (non inverted signal data frame)
   *  5 = -DMR (inverted signal data frame)
   *  6 = +NXDN (non inverted data frame)
   *  7 = -NXDN (inverted data frame)
   *  8 = +D-STAR
   *  9 = -D-STAR
   * 10 = +D-STAR_HD
   * 11 = -D-STAR_HD
   * 12 = +DMR (non inverted signal voice frame)
   * 13 = -DMR (inverted signal voice frame)
   * 14 = +X2-TDMA (non inverted signal voice frame)
   * 15 = -X2-TDMA (inverted signal voice frame)
   * 16 = +NXDN (non inverted voice frame)
   * 17 = -NXDN (inverted voice frame)
   */

  int i, t, dibit, sync, symbol, synctest_pos, lastt;
  char synctest[25];
  char *synctest_p;
  char synctest_buf[10240];
  int lmin, lmax, lidx;
  int lbuf[24], lbuf2[24];

  for (i = 18; i < 24; i++) {
      lbuf[i] = 0;
      lbuf2[i] = 0;
  }

  // detect frame sync
  t = 0;
  synctest[24] = 0;
  synctest_pos = 0;
  synctest_p = synctest_buf;
  sync = 0;
  lmin = 0;
  lmax = 0;
  lidx = 0;
  lastt = 0;

  while (sync == 0) {
      t++;
      symbol = getSymbol (opts, state, 0);

      lbuf[lidx] = symbol;
      state->sbuf[state->sidx] = symbol;
      if (lidx == 23) {
          lidx = 0;
      } else {
          lidx++;
      }

      if (state->sidx == (state->ssize - 1)) {
          state->sidx = 0;
      } else {
          state->sidx++;
      }

      if (lastt == 23) {
          lastt = 0;
          state->rf_mod = 2;
      } else {
          lastt++;
      }

      //determine dibit state
      if (symbol > 0) {
          dibit = 49;               // '1'
      } else {
          dibit = 51;               // '3'
      }

      *synctest_p = dibit;
      if (t >= 18) {
          for (i = 0; i < 24; i++) {
              lbuf2[i] = lbuf[i];
          }

          Shellsort_int (lbuf2, 24);
          lmin = (lbuf2[2] + lbuf2[3] + lbuf2[4]) / 3;
          lmax = (lbuf2[21] + lbuf2[20] + lbuf2[19]) / 3;
          if (opts->datascope && (lidx == 0)) {
            print_datascope(state, lbuf2, 24);
          }

          memcpy (synctest, (synctest_p - 23), 24);

          if ((memcmp (synctest, P25P1_SYNC, 24) == 0) || (memcmp (synctest, INV_P25P1_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            strcpy (state->ftype, "P25p1");
            if (synctest[0] == '1') {
                state->lastsynctype = 0;
            } else {
                state->lastsynctype = 1;
            }
            goto update_sync_and_return;
          }

          if ((memcmp (synctest, DMR_MS_DATA_SYNC, 24) == 0) || (memcmp (synctest, DMR_BS_DATA_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            state->dmrMsMode = (synctest[22] == '1');
            strcpy (state->ftype, "DMR  ");
            if (opts->inverted_dmr == 0) {
                // data frame
                if (state->lastsynctype != 4) {
                    state->firstframe = 1;
                }
                state->lastsynctype = 4;
            } else {
                // inverted voice frame
                if (state->lastsynctype != 13) {
                    state->firstframe = 1;
                }
                state->lastsynctype = 13;
            }
            goto update_sync_and_return;
          }

          if ((memcmp (synctest, DMR_MS_VOICE_SYNC, 24) == 0) || (memcmp (synctest, DMR_BS_VOICE_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            state->dmrMsMode = (synctest[22] == '3');
            strcpy (state->ftype, "DMR  ");
            if (opts->inverted_dmr == 0) {
                // voice frame
                if (state->lastsynctype != 12) {
                   state->firstframe = 1;
                }
                state->lastsynctype = 12;
            } else {
                // inverted data frame
                if (state->lastsynctype != 5) {
                    state->firstframe = 1;
                }
                state->lastsynctype = 5;
            }
            goto update_sync_and_return;
          }

          if ((memcmp (synctest, X2TDMA_BS_DATA_SYNC, 24) == 0) || (memcmp (synctest, X2TDMA_MS_DATA_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            state->dmrMsMode = (synctest[22] == '1');
            strcpy (state->ftype, "X2-TDMA ");
            if (opts->inverted_x2tdma == 0) {
                // data frame
                state->lastsynctype = 2;
            } else {
                // inverted voice frame
                if (state->lastsynctype != 15) {
                   state->firstframe = 1;
                }
                state->lastsynctype = 15;
            }
            goto update_sync_and_return;
          }

          if ((memcmp (synctest, X2TDMA_BS_VOICE_SYNC, 24) == 0) || (memcmp (synctest, X2TDMA_MS_VOICE_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            state->dmrMsMode = (synctest[22] == '3');
            strcpy (state->ftype, "X2-TDMA ");
            if (opts->inverted_x2tdma == 0) {
                // voice frame
                if (state->lastsynctype != 14) {
                   state->firstframe = 1;
                }
                state->lastsynctype = 14;
            } else {
                // inverted data frame
                state->lastsynctype = 3;
            }
            goto update_sync_and_return;
          }

          if ((memcmp (synctest+6, NXDN_BS_VOICE_SYNC, 18) == 0) ||
              (memcmp (synctest+6, NXDN_MS_VOICE_SYNC, 18) == 0) ||
              (memcmp (synctest+6, NXDN_BS_DATA_SYNC, 18) == 0)  ||
              (memcmp (synctest+6, NXDN_MS_DATA_SYNC, 18) == 0)) {
              if (synctest[21] == '1') {
                  state->lastsynctype = 6;
              } else {
                  state->lastsynctype = 16;
              }
              if ((state->lastsynctype == 6) || (state->lastsynctype == 16)) {
                  state->offset = synctest_pos;
                  strcpy (state->ftype, "NXDN96  ");
                  goto update_sync_and_return;
              }
          }
          if ((memcmp (synctest+6, INV_NXDN_BS_VOICE_SYNC, 18) == 0) || 
              (memcmp (synctest+6, INV_NXDN_MS_VOICE_SYNC, 18) == 0) ||
              (memcmp (synctest+6, INV_NXDN_BS_DATA_SYNC, 18) == 0) ||
              (memcmp (synctest+6, INV_NXDN_MS_DATA_SYNC, 18) == 0)) {
              if (synctest[21] == '3') {
                  state->lastsynctype = 7;
              } else {
                  state->lastsynctype = 17;
              }
              if ((state->lastsynctype == 7) || (state->lastsynctype == 17)) {
                  state->offset = synctest_pos;
                  strcpy (state->ftype, "NXDN96  ");
                  goto update_sync_and_return;
              }
          }

          if ((memcmp (synctest, DSTAR_SYNC, 24) == 0) || (memcmp (synctest, INV_DSTAR_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            strcpy (state->ftype, "D-STAR  ");
            if (synctest[0] == '3') {
                state->lastsynctype = 8;
            } else {
                state->lastsynctype = 9;
            }
            goto update_sync_and_return;
          }
          if ((memcmp (synctest, DSTAR_HD_SYNC, 24) == 0) || (memcmp (synctest, INV_DSTAR_HD_SYNC, 24) == 0)) {
            state->offset = synctest_pos;
            strcpy (state->ftype, "D-STARHD");
            if (synctest[0] == '1') {
                state->lastsynctype = 10;
            } else {
                state->lastsynctype = 11;
            }
            goto update_sync_and_return;
          }
      }

      if (exitflag == 1) {
          cleanupAndExit (opts, state);
      }

      if (synctest_pos < 10200) {
          synctest_pos++;
          synctest_p++;
      } else {
          // buffer reset
          synctest_pos = 0;
          synctest_p = synctest_buf;
          state->lastsynctype = -1;
      }

      if (state->lastsynctype != -1) {
          //if (synctest_pos >= 1800) {
          if (synctest_pos >= 9000) {
              if ((state->lastsynctype != -1) && !(opts->datascope)) {
                  printf ("Sync: no sync\n");
              }
              state->lastsynctype = -1;
#if 1
              state->max = 3000;
              state->min = -3000;
              state->umid = 1000;
              state->lmid = -1000;
              state->center = 0;
#endif
              return (-1);
          }
      }
  }

  return (-1);

update_sync_and_return:
   // recalibrate center/umid/lmid
   state->max = ((state->max) + (lmax)) / 2;
   state->min = ((state->min) + (lmin)) / 2;
   state->center = ((state->max) + (state->min)) / 2;
   state->umid = (((state->max) - state->center) * 5 / 8) + state->center;
   state->lmid = (((state->min) - state->center) * 5 / 8) + state->center;
   return state->lastsynctype;
}
コード例 #3
0
ファイル: freq_sca.c プロジェクト: Distrotech/libaacplus
/*******************************************************************************
 Functionname:  UpdateFreqScale
 *******************************************************************************
 Description:

 Arguments:

 Return:
 *******************************************************************************/
int
UpdateFreqScale(unsigned char  *v_k_master, int *h_num_bands,
                const int k0, const int k2,
                const int freqScale,
                const int alterScale)

{

  int     b_p_o = 0;
  float   warp = 0;
  int     dk = 0;

  /* Internal variables */
  int     two_regions = 0;
  int     k1 = 0, i;
  int     num_bands0;
  int     num_bands1;
  int     diff_tot[MAX_OCTAVE + MAX_SECOND_REGION];
  int     *diff0 = diff_tot;
  int     *diff1 = diff_tot+MAX_OCTAVE;
  int     k2_achived;
  int     k2_diff;
  int     incr = 0;

  

    /* counting previous operations */


   
  if(freqScale==1)
  {
    
    b_p_o=12;
  }

   
  if(freqScale==2)
  {
    
    b_p_o=10;
  }

   
  if(freqScale==3)
  {
    
    b_p_o=8;
  }


  
  if(freqScale > 0)
    {
      
      if(alterScale==0)
      {
        
        warp=1.0;
      }
      else
      {
        
        warp=1.3f;
      }


        
      if(4*k2 >= 9*k0)
        {
          
          two_regions=1;

          
          k1=2*k0;

          
          num_bands0=numberOfBands(b_p_o, k0, k1, 1.0);

          
          num_bands1=numberOfBands(b_p_o, k1, k2, warp);

          
          CalcBands(diff0, k0, k1, num_bands0);

          
          Shellsort_int( diff0, num_bands0);

          
          if (diff0[0] == 0)
          {
            

            return (1);

          }

          
          cumSum(k0, diff0, num_bands0, v_k_master);

          
          CalcBands(diff1, k1, k2, num_bands1);

          
          Shellsort_int( diff1, num_bands1);

            
          if(diff0[num_bands0-1] > diff1[0])
            {
                
              if(modifyBands(diff0[num_bands0-1],diff1, num_bands1))
              {
                
                return(1);
              }

            }


            
          cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]);
           
          *h_num_bands=num_bands0+num_bands1;

        }
      else
        {
          
          two_regions=0;
          k1=k2;

          
          num_bands0=numberOfBands(b_p_o, k0, k1, 1.0);

          
          CalcBands(diff0, k0, k1, num_bands0);

          
          Shellsort_int( diff0, num_bands0);

          
          if (diff0[0] == 0)
          {
            
            return (1);

          }

          
          cumSum(k0, diff0, num_bands0, v_k_master);

          
          *h_num_bands=num_bands0;

        }
    }
  else
    {
      
      if (alterScale==0) {

        
        dk = 1;

          
        num_bands0 = 2 * ((k2 - k0)/2);
      } else {

        
        dk = 2;

          
        num_bands0 = 2 * (((k2 - k0)/dk +1)/2);
      }

       
      k2_achived = k0 + num_bands0*dk;

      
      k2_diff = k2 - k2_achived;

      
      
      for(i=0;i<num_bands0;i++)
      {
        
        diff_tot[i] = dk;
      }



      
      if (k2_diff < 0) {

          
          incr = 1;
          i = 0;
      }



      
      if (k2_diff > 0) {

          
          incr = -1;

          
          i = num_bands0-1;
      }


       /* diff_tot[] */
      
      while (k2_diff != 0) {

         
        diff_tot[i] = diff_tot[i] - incr;

        /* ADD(1): pointer increment */
        i = i + incr;

        
        k2_diff = k2_diff + incr;
      }

      
      cumSum(k0, diff_tot, num_bands0, v_k_master);

      
      *h_num_bands=num_bands0;

    }

   
  if (*h_num_bands < 1)
  {
    
    return(1);
  }

  

  return (0);
}/* End UpdateFreqScale */
コード例 #4
0
ファイル: freq_sca.c プロジェクト: Distrotech/libaacplus
/*******************************************************************************
 Functionname:  getStopFreq
 *******************************************************************************
 Description:

 Arguments:

 Return:
 *******************************************************************************/
static int
getStopFreq(int fs, int stop_freq)
{
  int result,i;
  int *v_stop_freq = NULL;
  int k1_min;
  int v_dstop[13];

  int v_stop_freq_32[14] =  {32,34,36,38,40,42,44,46,49,52,55,58,61,64};
  int v_stop_freq_44[14] =  {23,25,27,29,32,34,37,40,43,47,51,55,59,64};
  int v_stop_freq_48[14] =  {21,23,25,27,30,32,35,38,42,45,49,54,59,64};

  

   /* counting previous operations */

  
  switch(fs){
  case 32000:
    
    k1_min = 32;

    
    v_stop_freq =v_stop_freq_32;
    break;

  case 44100:
    
    k1_min = 23;

    
    v_stop_freq =v_stop_freq_44;
    break;

  case 48000:
    
    k1_min = 21;

    
    v_stop_freq =v_stop_freq_48;
    break;

  default:
    
    k1_min = 21; /* illegal fs  */
  }



   /* v_dstop[]
                  v_stop_freq[]
               */
  
  for(i = 0; i <= 12; i++) {
     
    v_dstop[i] = v_stop_freq[i+1] - v_stop_freq[i];
  }

  
  Shellsort_int(v_dstop, 13);

  
  result = k1_min;

   /* v_dstop[] */
  
  for(i = 0; i < stop_freq; i++) {
    
    result = result + v_dstop[i];
  }

  

  return result;

}/* End getStopFreq */