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

📄 enc_if.c

📁 关于AMR-WB+语音压缩编码的实现代码
💻 C
📖 第 1 页 / 共 2 页
字号:
      for (j = 1; j <= NBBITS_7k; j++)
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_9k:
      mask = mode_9k;
      *stream = 0x0C;    /* frame_type = 1, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_9k; j++)
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_12k:
      mask = mode_12k;
      *stream = 0x14;    /* frame_type = 2, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_12k; j++)
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_14k:
      mask = mode_14k;
      *stream = 0x1C;    /* frame_type = 3, fqi = 1  */
	  stream++;
      for ( j = 1; j <= NBBITS_14k; j++ )
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_16k:
      mask = mode_16k;
      *stream = 0x24;    /* frame_type = 4, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_16k; j++)
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_18k:
      mask = mode_18k;
      *stream = 0x2C;    /* frame_type = 5, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_18k; j++)
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_20k:
      mask = mode_20k;
      *stream = 0x34;    /* frame_type = 6, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_20k; j++)
      {
         if (param[*mask] & *( mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_23k:
      mask = mode_23k;
      *stream = 0x3C;    /* frame_type = 7, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_23k; j++)
      {
         if (param[*mask] & *( mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MODE_24k:
      mask = mode_24k;
      *stream = 0x44;    /* frame_type = 8, fqi = 1  */
	  stream++;
      for (j = 1; j <= NBBITS_24k; j++)
      {
         if (param[*mask] & *( mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      while (j % 8)
      {
         *stream <<= 1;
         j++;
      }
      break;
   case MRDTX:
      mask = mode_DTX;
      *stream = 0x4C;    /* frame_type = 9, fqi = 1  */
	  stream++;
      for ( j = 1; j <= NBBITS_SID; j++ )
      {
         if (param[*mask] & *(mask + 1))
         {
            *stream += 0x1;
         }
         mask += 2;
         if (j % 8)
         {
            *stream <<= 1;
         }
         else
         {
            stream++;
         }
      }
      /* sid type */
      if (frame_type == TX_SID_UPDATE)
      {
         /* sid update */
         *stream += 0x1;
      }
      /* speech mode indicator */
      *stream <<= 4;
      *stream = (UWord8)(*stream + speech_mode);
      j = 40;
      break;
   default:
      break;
   }
   return j/8 + 1;
}
#endif
/*
 * E_IF_sid_sync_reset
 *
 * Parameters:
 *    st                O: state structure
 *
 * Function:
 *    Initializes state memory
 *
 * Returns:
 *    void
 */
static void E_IF_sid_sync_reset(WB_enc_if_state *st)
{
   st->sid_update_counter = 3;
   st->sid_handover_debt = 0;
   st->prev_ft = TX_SPEECH;
}
/*
 * E_IF_encode
 *
 *
 * Parameters:
 *    st                I: pointer to state structure
 *    mode              I: Speech Mode
 *    speech            I: Input speech
 *    serial            O: Output octet structure IF2 or 16-bit serial stream
 *    dtx               I: use DTX
 *
 * Function:
 *    Encoding and packing one frame of speech
 *
 * Returns:
 *    number of octets
 */
int E_IF_encode(void *st, Word16 req_mode, Word16 *speech, UWord8 *serial,
                Word16 dtx)
{
   Word16 prms[NB_PARM_MAX];
   Word16 i;
   Word16 frame_type, mode, reset_flag;
   WB_enc_if_state *s;
   s = (WB_enc_if_state *)st;
   mode = req_mode;
   /* check for homing frame */
   reset_flag = E_IF_homing_frame_test(speech);
   if (!reset_flag)
   {
      for (i = 0; i < L_FRAME16k; i++)   /* Delete the 2 LSBs (14-bit input) */
      {
         speech[i] = (Word16) (speech[i] & 0xfffC);
      }
      E_MAIN_encode(&mode, speech, prms, s->encoder_state, dtx);
      if (mode == MRDTX)
      {                                             
         s->sid_update_counter--;
         if (s->prev_ft == TX_SPEECH)
         {
            frame_type = TX_SID_FIRST;
            s->sid_update_counter = 3;
         }
         else
         {
            if ((s->sid_handover_debt > 0) && (s->sid_update_counter > 2))
            {
               /*
                * ensure extra updates are
                * properly delayed after a possible SID_FIRST
                */
               frame_type = TX_SID_UPDATE;
               s->sid_handover_debt--;
            }
            else
            {
               if (s->sid_update_counter == 0)
               {
                  frame_type = TX_SID_UPDATE;
                  s->sid_update_counter = 8;
               }
               else
               {
                  frame_type = TX_NO_DATA;
                  mode = MRNO_DATA;
               }
            }
         }
      }
      else
      {
         s->sid_update_counter = 8;                                     
         frame_type = TX_SPEECH;
      }
      s->prev_ft = frame_type;
   }
   /* perform homing if homing frame was detected at encoder input */
   else
   {
      E_MAIN_reset(s->encoder_state, 1);
      E_IF_sid_sync_reset(s);
      E_IF_homing_coding(prms, mode);
      frame_type = TX_SPEECH;
   }
#ifdef IF2
   return E_IF_if2_conversion(mode, prms, serial, frame_type, req_mode);
#else
   return E_IF_mms_conversion(mode, prms, serial, frame_type, req_mode);
#endif
}
/*
 * E_IF_init
 *
 * Parameters:
 *    none
 *
 * Function:
 *    Allocates state memory and initializes state memory
 *
 * Returns:
 *    pointer to encoder interface structure
 */
void *E_IF_init(void)
{
   WB_enc_if_state * s;
   /* allocate memory */
   if ((s = (WB_enc_if_state *)malloc(sizeof(WB_enc_if_state))) == NULL)
   {
      return NULL;
   }
   E_MAIN_init(&(s->encoder_state));
   if (s->encoder_state == NULL)
   {
      free(s);
      return NULL;
   }
   E_IF_sid_sync_reset(s);
   return s;
}
/*
 * E_IF_exit
 *
 * Parameters:
 *    state             I: state structure
 *
 * Function:
 *    The memory used for state memory is freed
 *
 * Returns:
 *    Void
 */
void E_IF_exit(void *state)
{
   WB_enc_if_state *s;
   s = (WB_enc_if_state *)state;
   /* free memory */
   E_MAIN_close(&s->encoder_state);
   free(s);
   state = NULL;
}
/*
 *
 */
void E_IF_encode_first(void *st, Word16 *speech)
{
   Word16 i;
   WB_enc_if_state *s;
   s = (WB_enc_if_state *)st;
   for (i = 0; i < L_FRAME16k; i++)   /* Delete the 2 LSBs (14-bit input) */
   {
	   speech[i] = (Word16) (speech[i] & 0xfffC);
   }
   E_MAIN_encode_first(speech, s->encoder_state);
}

⌨️ 快捷键说明

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