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); }
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]; } } }
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; }