Exemplo n.º 1
0
void IQSSBDemodulator::circshift(Ipp32f* b, int len, int lo)
{
	fftshift(b, len);
	static Ipp32f* tmp = ippsMalloc_32f(len);
	if(lo>=0)
	{
		ippsCopy_32f(b, tmp, lo);
		ippsMove_32f(b+lo, b, len-lo); 
		ippsCopy_32f(tmp, b+len-lo, lo);
	}
	else
	{
		int abs_lo = -lo;
		ippsCopy_32f(b+len-abs_lo, tmp, abs_lo);
		ippsMove_32f(b, b+abs_lo, len-abs_lo);
		ippsCopy_32f(tmp, b, abs_lo);
	}

	fftshift(b, len);
}
Exemplo n.º 2
0
static void ssr_compensate(Ipp32f   *input,
                           SSR_GAIN **SSRInfo,
                           SSR_GAIN *prevSSRInfo,
                           Ipp32s   len,
                           Ipp32s   window_sequence,
                           Ipp32f   **out,
                           Ipp32f   *m_gcOverlapBuffer)
{
  IPP_ALIGNED_ARRAY(32, Ipp32f, a_gcwind, 512);
  Ipp32f *gcOverlapBuffer[4];
  Ipp32s i, band, k;

  Ipp32s  last_cur_block = 0;

  for (i = 0; i < 4; i++) {
    gcOverlapBuffer[i] = m_gcOverlapBuffer + 512 * i;
  }

  if (window_sequence == EIGHT_SHORT_SEQUENCE){
    for (band = 0; band < 4; band++) {
      for (k = 0; k < 8; k++) {
        ssr_gainc_window(len/16,
                         &prevSSRInfo[band],
                         &SSRInfo[band][k], &SSRInfo[band][k],
                         a_gcwind, window_sequence);

        ippsMul_32f_I(a_gcwind, input+band*len/2 + k*len/16,
                      len/32);

        ippsAdd_32f_I(input+band*len/2+k*len/16,
                      &gcOverlapBuffer[band][len*7/64+len/32*k],
                      len/32);

        ippsMul_32f(input+band*len/2+k*len/16+len/32,
                    a_gcwind+len/32,
                    &gcOverlapBuffer[band][len*7/64+(k+1)*len/32],
                    len/32);
        prevSSRInfo[band] = SSRInfo[band][k];
      }

      ippsMove_32f(&gcOverlapBuffer[band][0], &out[band][0],
                   len/4);

      ippsMove_32f(&gcOverlapBuffer[band][len/4],
                   &gcOverlapBuffer[band][0],
                   len/4);
    }
  } else {
    last_cur_block = 0;
    if (window_sequence != ONLY_LONG_SEQUENCE)
      last_cur_block = 1;

    for (band = 0; band < 4; band++) {
      ssr_gainc_window(len/2,
                       &prevSSRInfo[band],
                       &SSRInfo[band][0], &SSRInfo[band][1],
                       a_gcwind, window_sequence);

      ippsMul_32f_I(a_gcwind, input+band*len/2,
                    len/4);
      ippsAdd_32f(&gcOverlapBuffer[band][0], input+band*len/2,
                  &out[band][0], len/4);

      ippsMul_32f(input+band*len/2+len/4,
                  a_gcwind + len/4,
                  &gcOverlapBuffer[band][0], len/4);

      prevSSRInfo[band] = SSRInfo[band][last_cur_block];
    }
  }
}
Exemplo n.º 3
0
int G729FPVAD(VADmemory* vadObj,const Ipp16s* src, Ipp16s* dst, Ipp32s *frametype ){
   LOCAL_ALIGN_ARRAY(32, Ipp32f, forwardAutoCorr, (LPC_ORDERP2+1),vadObj);       /* Autocorrelations (forward) */
   LOCAL_ALIGN_ARRAY(32, Ipp32f, forwardLPC, LPC_ORDERP1*2,vadObj);      /* A(z) forward unquantized for the 2 subframes */
   LOCAL_ALIGN_ARRAY(32, Ipp32f, TmpAlignVec, WINDOW_LEN,vadObj);
   LOCAL_ARRAY(Ipp32f, forwardReflectCoeff, LPC_ORDER,vadObj);
   LOCAL_ARRAY(Ipp32f, CurrLSP, LPC_ORDER,vadObj);
   LOCAL_ARRAY(Ipp32f, CurrLSF, LPC_ORDER,vadObj);

   Ipp32f *pWindow;
   Ipp32f *newSpeech;
   /* Excitation vector */
   Ipp16s isVAD;
   Ipp32f tmp_lev;
   Ipp32s VADDecision;
   Ipp32f EnergydB;
   IppStatus sts;

   *frametype = 3;
   if(NULL==vadObj || NULL==src || NULL ==dst)
      return -10;
   if(vadObj->objPrm.objSize <= 0)
      return -8;
   if(ENC_KEY != vadObj->objPrm.key)
      return -5;
   isVAD = (Ipp16s)(vadObj->objPrm.mode == G729Encode_VAD_Enabled);

   if(!isVAD) return 0;

   newSpeech = vadObj->OldSpeechBuffer + SPEECH_BUFF_LEN - FRM_LEN;         /* New speech     */
   pWindow   = vadObj->OldSpeechBuffer + SPEECH_BUFF_LEN - WINDOW_LEN;        /* For LPC window */

   if (vadObj->sFrameCounter == 32767) vadObj->sFrameCounter = 256;
   else vadObj->sFrameCounter++;

   ippsConvert_16s32f(src,newSpeech,FRM_LEN);
   ownAutoCorr_G729_32f(pWindow, LPC_ORDERP2, forwardAutoCorr,TmpAlignVec);             /* Autocorrelations */

   /* Lag windowing    */
   ippsMul_32f_I(lwindow, &forwardAutoCorr[1], LPC_ORDERP2);
   /* Levinson Durbin  */
   tmp_lev = 0;
   sts = ippsLevinsonDurbin_G729_32f(forwardAutoCorr, LPC_ORDER, &forwardLPC[LPC_ORDERP1], forwardReflectCoeff, &tmp_lev);
   if(sts == ippStsOverflow) {
      ippsCopy_32f(vadObj->OldForwardLPC,&forwardLPC[LPC_ORDERP1],LPC_ORDER+1);
      forwardReflectCoeff[0] = vadObj->OldForwardRC[0];
      forwardReflectCoeff[1] = vadObj->OldForwardRC[1];
   } else {
      ippsCopy_32f(&forwardLPC[LPC_ORDERP1],vadObj->OldForwardLPC,LPC_ORDER+1);
      vadObj->OldForwardRC[0] = forwardReflectCoeff[0];
      vadObj->OldForwardRC[1] = forwardReflectCoeff[1];
   }

   /* Convert A(z) to lsp */
   ippsLPCToLSP_G729_32f(&forwardLPC[LPC_ORDERP1], vadObj->OldLSP, CurrLSP);

   if (vadObj->objPrm.mode == G729Encode_VAD_Enabled) {
      ownACOS_G729_32f(CurrLSP, CurrLSF, LPC_ORDER);
      VoiceActivityDetect_G729_32f(forwardReflectCoeff[1], CurrLSF, forwardAutoCorr, pWindow, vadObj->sFrameCounter,
                  vadObj->prevVADDec, vadObj->prevPrevVADDec, &VADDecision, &EnergydB,(Ipp8s *)vadObj,TmpAlignVec);
   } else VADDecision = 1;

   if(VADDecision == 0) {
      /* Inactive frame */
      vadObj->prevVADDec = 0;
      *frametype=1; /* SID*/
   }
   else vadObj->prevVADDec = VADDecision;

   vadObj->prevPrevVADDec = vadObj->prevVADDec;
   ippsMove_32f(&vadObj->OldSpeechBuffer[FRM_LEN], &vadObj->OldSpeechBuffer[0], SPEECH_BUFF_LEN-FRM_LEN);
   CLEAR_SCRATCH_MEMORY(vadObj);
   return 0;
}