?? encoder.c
字號:
if (pCodec->workBuffer[i] <= 4.53999e-005)
pCodec->workBuffer[i] = (float)1.92875e-022;
}
ippsLn_32f_I(pCodec->workBuffer,pCodec->numChannels+3);
if(pCodec->freq == r16KHz){
pCodec->workBuffer[NUM_CHANNELS] = 0.7f * pFBank16[0] + 0.3f * pCodec->workBuffer[NUM_CHANNELS];
pCodec->workBuffer[NUM_CHANNELS + 1] = 0.7f * pFBank16[1] + 0.3f * pCodec->workBuffer[NUM_CHANNELS + 1];
pCodec->workBuffer[NUM_CHANNELS + 2] = 0.7f * pFBank16[2] + 0.3f * pCodec->workBuffer[NUM_CHANNELS + 2];
avr = 0.5f * pCodec->workBuffer[NUM_CHANNELS-1] + 0.5f * pCodec->workBuffer[NUM_CHANNELS];
pCodec->workBuffer[NUM_CHANNELS - 1] = 0.6f * pCodec->workBuffer [NUM_CHANNELS - 1] + 0.4f * avr;
pCodec->workBuffer[NUM_CHANNELS] = 0.6f * pCodec->workBuffer [NUM_CHANNELS] + 0.4f * avr;
pFBank16[0] = pCodec->workBuffer [NUM_CHANNELS ] - 0.641854f;
pFBank16[1] = pCodec->workBuffer [NUM_CHANNELS + 1] - 0.641854f;
pFBank16[2] = pCodec->workBuffer [NUM_CHANNELS + 2] - 0.641854f;
ippsExp_32f_I(pFBank16,3);
LogEnergy += pFBank16[0];
LogEnergy += pFBank16[1];
LogEnergy += pFBank16[2];
}
if (LogEnergy <= 1.92875e-022)
LogEnergy = -50.0f;
else
ippsLn_32f_I(&LogEnergy,1);
/* Discrete Cosine Transform */
ippsDCTLifter_32f(pCodec->workBuffer, pCodec->pFeatBuffer,pCodec->pDCTLifter);
/* Append logE after c0 */
pCodec->pFeatBuffer[pCodec->numCepCoeff] = LogEnergy;
/* Blind Equalization */
ippsBlindEqualization_Aurora_32f(RefCep,pCodec->pFeatBuffer,pCodec->bias,NUM_CEP_COEFF-1,LogEnergy);
}
/* WAVEFORM -> FEATURE */
int ApplyAuroraEncoder_WF(AuroraEncoder *pCodec, short *pInputSignal, int InputLength,
float *pOutputBuffer, unsigned char *pVadDst, int StreamEnd){
int FrameCounter=0, Count=0;
int tcur = 0, tc,l;
float pNoiseDst[FRAMESHIFT*4];
char flagVAD;
short *pTmp;
short *pInTmp;
float *pBState_2 = pCodec->noise.pBStateBuf+320;
float *pBState_1 = pBState_2+320;
float *pFFTOut = pCodec->noise.pFFT+FFTSIZE*4;
float pDen[FFTSPEC];
float pMelBank[NUM_CHANNELS+2];
IppVADDecision_Aurora vad[1];
IppStatus status;
if ( (pCodec->EncoderOutput != FEATURE) && (pCodec->EncoderInput != WAVEFORM)){
printf("\n!!! ERROR: encoder was initialized with another output flag !!!");
return 0;
}
if (InputLength<=0){
FrameCounter=0;
ResetAuroraEncoder(pCodec);
return FrameCounter;
}
pTmp = pInputSignal;
if(pCodec->freq == r11KHz){
FrameCounter = (InputLength + pCodec->s11.lastread) / 11;
pTmp = ippsMalloc_16s(FrameCounter * 8 + 4);
FrameCounter=0;
if(InputLength + pCodec->s11.lastread >pCodec->s11.len){
pCodec->s11.len = InputLength + pCodec->s11.lastread;
pInTmp = ippsMalloc_16s(pCodec->s11.len);
ippsCopy_16s(pCodec->s11.p11,pInTmp,pCodec->s11.lastread);
ippsFree(pCodec->s11.p11);
pCodec->s11.p11 = pInTmp;
}
ippsCopy_16s(pInputSignal,pCodec->s11.p11 + pCodec->s11.lastread, InputLength);
pCodec->s11.lastread+=InputLength;
InputLength=0;
status = ippsResamplePolyphaseFixed_16s(pCodec->s11.ppState[0],pCodec->s11.p11,
(pCodec->s11.lastread-pCodec->s11.history-(int)pCodec->s11.time),
(short*)pTmp,0.98f,&pCodec->s11.time,&InputLength);
if(status==ippStsNoErr){
ippsMove_16s(pCodec->s11.p11+(int)pCodec->s11.time-pCodec->s11.history,
pCodec->s11.p11,(pCodec->s11.lastread+pCodec->s11.history-(int)pCodec->s11.time));
pCodec->s11.lastread-=(int)pCodec->s11.time-pCodec->s11.history;
pCodec->s11.time-=(int)pCodec->s11.time-pCodec->s11.history;
}
if(StreamEnd){
l = 0;
status = ippsResamplePolyphaseFixed_16s(pCodec->s11.ppState[0],pCodec->s11.p11,
(pCodec->s11.lastread-pCodec->s11.history-(int)pCodec->s11.time),
(short*)pTmp+InputLength,0.98f,&pCodec->s11.time,&l);
InputLength+=l;
}
}
if(InputLength>0)
FrameCounter = PrepareForCalculation(pCodec,pTmp,InputLength);
if(FrameCounter){
/* Start process wavebuffer */
Count = 0;
tc=1+pCodec->noise.Cur_TPrpocess; FrameCounter += pCodec->noise.Cur_TPrpocess;
for( ; tc < FrameCounter; tc++,pCodec->noise.Cur_TPrpocess++,pCodec->NumberFrame++){
if(pCodec->freq == r16KHz){
ippsLowHighFilter_Aurora_32f(pCodec->noise.pBStateBig+480,
pBState_1+FRAMESHIFT*3, pCodec->noise.s16.dataHP+480, 160, FIRCoef, FILTERLENGTH);
ippsMove_32f(pCodec->noise.pBStateBig+160,pCodec->noise.pBStateBig,FILTERLENGTH+480);
}
else{
ippsCopy_32f(pCodec->noise.pBStateBig+append+pCodec->noise.start,
pBState_1+pCodec->noise.start,pCodec->noise.end);
}
/* VAD for noise estimation (VADNest) */
flagVAD = VADNest(&pCodec->noise.vad,tc,pBState_1+FRAMESHIFT);
/* perfom noise reduction */
DoNoiseReduction(pCodec,pCodec->noise.pBStateBuf,tc,pFFTOut,pNoiseDst,&tcur,pMelBank,pDen,flagVAD);
ippsVADDecision_Aurora_32f(pMelBank,pDen,pCodec->noise.vad.nbSpeechFrame,vad,pCodec->pVadMem);
if( vad[0] != IPP_PREPARE ){
if(vad[0]==IPP_VOICE)
pVadDst[pCodec->VadFrame++]=1;
else if(vad[0]==IPP_UNVOICE)
pVadDst[pCodec->VadFrame++]=0;
}
if(tcur){
CeptstrumCalculate(pCodec,pNoiseDst,tc);
ippsCopy_32f(pCodec->pFeatBuffer,pOutputBuffer+Count*(NUM_CEP_COEFF+1),(NUM_CEP_COEFF+1));
Count++;
}
/* Shift buffers */
ippsMove_32f(pCodec->noise.pBStateBuf+FRAMESHIFT,pCodec->noise.pBStateBuf,11*FRAMESHIFT);
/* Forming first buffer */
if(pCodec->noise.tail >= pCodec->FrameShift){
CopyBuffers(pCodec,pTmp+InputLength-pCodec->noise.tail,3*pCodec->FrameShift,pCodec->FrameShift);
pCodec->noise.tail -= pCodec->FrameShift;
}
if(pCodec->freq == r16KHz){
ippsMove_32f(pCodec->noise.s16.dataHP+80,pCodec->noise.s16.dataHP,480);
ippsMove_32f(pCodec->noise.pFFT+FFTSIZE,pCodec->noise.pFFT,FFTSIZE*4);
}
}
if(pCodec->noise.tail>0 && pCodec->noise.tail<pCodec->FrameShift){
CopyBuffers(pCodec,pTmp+InputLength-pCodec->noise.tail,3*pCodec->FrameShift,pCodec->noise.tail);
}
}
if (StreamEnd){
while(1){
ippsVADFlush_Aurora_32f(vad,pCodec->pVadMem);
if(vad[0]==IPP_PREPARE)break;
if(vad[0]==IPP_VOICE)
pVadDst[pCodec->VadFrame++]=1;
else if(vad[0]==IPP_UNVOICE)
pVadDst[pCodec->VadFrame++]=0;
}
ResetAuroraEncoder(pCodec);
}
if(pCodec->freq == r11KHz){
ippsFree(pTmp);
}
return Count;
}
/* WAVEFORM -> QUANTIZED */
int ApplyAuroraEncoder_WQ(AuroraEncoder *pCodec, short *pInputSignal, int InputLength, unsigned char *pOutputBuffer,int StreamEnd){
int FrameCounter=0, Count=0;
int tcur = 0, tc, i,j,l;
float pNoiseDst[FRAMESHIFT*4];
char flagVAD;
short *pTmp;
short *pInTmp;
float *pBState_2 = pCodec->noise.pBStateBuf+320;
float *pBState_1 = pBState_2+320;
float *pFFTOut = pCodec->noise.pFFT+FFTSIZE*4;
float pDen[FFTSPEC];
float pMelBank[NUM_CHANNELS+2];
IppVADDecision_Aurora vad[1];
IppStatus status;
if ( (pCodec->EncoderOutput != QUANTIZED) && (pCodec->EncoderInput != WAVEFORM)){
printf("\n!!! ERROR: encoder was initialized with another output flag !!!");
return 0;
}
if (InputLength<=0){
FrameCounter=0;
ResetAuroraEncoder(pCodec);
return FrameCounter;
}
pTmp = pInputSignal;
if(pCodec->freq == r11KHz){
FrameCounter = (InputLength + pCodec->s11.lastread) / 11;
pTmp = ippsMalloc_16s(FrameCounter * 8 + 4);
FrameCounter=0;
if(InputLength + pCodec->s11.lastread >pCodec->s11.len){
pCodec->s11.len = InputLength + pCodec->s11.lastread;
pInTmp = ippsMalloc_16s(pCodec->s11.len);
ippsCopy_16s(pCodec->s11.p11,pInTmp,pCodec->s11.lastread);
ippsFree(pCodec->s11.p11);
pCodec->s11.p11 = pInTmp;
}
ippsCopy_16s(pInputSignal,pCodec->s11.p11 + pCodec->s11.lastread, InputLength);
pCodec->s11.lastread+=InputLength;
InputLength=0;
status = ippsResamplePolyphaseFixed_16s(pCodec->s11.ppState[0],pCodec->s11.p11,
(pCodec->s11.lastread-pCodec->s11.history-(int)pCodec->s11.time),
(short*)pTmp,0.98f,&pCodec->s11.time,&InputLength);
if(status==ippStsNoErr){
ippsMove_16s(pCodec->s11.p11+(int)pCodec->s11.time-pCodec->s11.history,
pCodec->s11.p11,(pCodec->s11.lastread+pCodec->s11.history-(int)pCodec->s11.time));
pCodec->s11.lastread-=(int)pCodec->s11.time-pCodec->s11.history;
pCodec->s11.time-=(int)pCodec->s11.time-pCodec->s11.history;
}
if(StreamEnd){
l = 0;
status = ippsResamplePolyphaseFixed_16s(pCodec->s11.ppState[0],pCodec->s11.p11,
(pCodec->s11.lastread-pCodec->s11.history-(int)pCodec->s11.time),
(short*)pTmp+InputLength,0.98f,&pCodec->s11.time,&l);
InputLength+=l;
}
}
if(InputLength>0)
FrameCounter = PrepareForCalculation(pCodec,pTmp,InputLength);
if(FrameCounter){
/* Start process wavebuffer */
Count = 0;
tc=1+pCodec->noise.Cur_TPrpocess; FrameCounter += pCodec->noise.Cur_TPrpocess;
for( ; tc < FrameCounter; tc++,pCodec->noise.Cur_TPrpocess++,pCodec->NumberFrame++){
if(pCodec->freq == r16KHz){
ippsLowHighFilter_Aurora_32f(pCodec->noise.pBStateBig+480,
pBState_1+FRAMESHIFT*3, pCodec->noise.s16.dataHP+480, 160, FIRCoef, FILTERLENGTH);
ippsMove_32f(pCodec->noise.pBStateBig+160,pCodec->noise.pBStateBig,FILTERLENGTH+480);
}
else{
ippsCopy_32f(pCodec->noise.pBStateBig+append+pCodec->noise.start,
pBState_1+pCodec->noise.start,pCodec->noise.end);
}
/* VAD for noise estimation (VADNest) */
flagVAD = VADNest(&pCodec->noise.vad,tc,pBState_1+FRAMESHIFT);
/* perfom noise reduction */
DoNoiseReduction(pCodec,pCodec->noise.pBStateBuf,tc,pFFTOut,pNoiseDst,&tcur,pMelBank,pDen,flagVAD);
ippsVADDecision_Aurora_32f(pMelBank,pDen,pCodec->noise.vad.nbSpeechFrame,vad,pCodec->pVadMem);
if(tcur){
CeptstrumCalculate(pCodec,pNoiseDst,tc);
ippsCopy_32f(pCodec->pFeatBuffer,pCodec->pFeatCyclicBuf+(pCodec->numCepCoeff+1)*6,pCodec->numCepCoeff+1);
if( vad[0]!=IPP_PREPARE ){
pCodec->pFeatCyclicBuf[pCodec->numCepCoeff]*=(float)pCodec->weight_logE;
pCodec->pFeatCyclicBuf[pCodec->numCepCoeff-1]*=(float)pCodec->weight_c0;
for(i=0;i<NUM_CODEBOOK;i++){
ippsVQ_32f(pCodec->pFeatCyclicBuf+i*2, 2,&j,1,(const IppsCdbkState_32f *)pCodec->ppCdbkState[i]);
pCodec->pIndexVQBuffer[i]=j;
}
ippsCopy_8u(pCodec->pIndexVQBuffer,pOutputBuffer+Count*(NUM_CODEBOOK+1),NUM_CODEBOOK);
if(vad[0]==IPP_VOICE)
pOutputBuffer[Count*(NUM_CODEBOOK+1)+NUM_CODEBOOK] = 1;
else if(vad[0]==IPP_UNVOICE)
pOutputBuffer[Count*(NUM_CODEBOOK+1)+NUM_CODEBOOK] = 0;
Count++;
}
ippsMove_32f(pCodec->pFeatCyclicBuf+(pCodec->numCepCoeff+1),pCodec->pFeatCyclicBuf,(pCodec->numCepCoeff+1)*6);
}
/* Shift buffers */
ippsMove_32f(pCodec->noise.pBStateBuf+FRAMESHIFT,pCodec->noise.pBStateBuf,11*FRAMESHIFT);
/* Forming first buffer */
if(pCodec->noise.tail >= pCodec->FrameShift){
CopyBuffers(pCodec,pTmp+InputLength-pCodec->noise.tail,3*pCodec->FrameShift,pCodec->FrameShift);
pCodec->noise.tail -= pCodec->FrameShift;
}
if(pCodec->freq == r16KHz){
ippsMove_32f(pCodec->noise.s16.dataHP+80,pCodec->noise.s16.dataHP,480);
ippsMove_32f(pCodec->noise.pFFT+FFTSIZE,pCodec->noise.pFFT,FFTSIZE*4);
}
}
if(pCodec->noise.tail>0 && pCodec->noise.tail<pCodec->FrameShift){
CopyBuffers(pCodec,pTmp+InputLength-pCodec->noise.tail,3*pCodec->FrameShift,pCodec->noise.tail);
}
}
if (StreamEnd){
while(1){
ippsVADFlush_Aurora_32f(vad,pCodec->pVadMem);
if(vad[0]==IPP_PREPARE)break;
pCodec->pFeatCyclicBuf[pCodec->numCepCoeff]*=(float)pCodec->weight_logE;
pCodec->pFeatCyclicBuf[pCodec->numCepCoeff-1]*=(float)pCodec->weight_c0;
for(i=0;i<NUM_CODEBOOK;i++){
ippsVQ_32f(pCodec->pFeatCyclicBuf+i*2, 2,&j,1,(const IppsCdbkState_32f *)pCodec->ppCdbkState[i]);
pCodec->pIndexVQBuffer[i]=j;
}
ippsCopy_8u(pCodec->pIndexVQBuffer,pOutputBuffer+Count*(NUM_CODEBOOK+1),NUM_CODEBOOK);
if(vad[0]==IPP_VOICE)
pOutputBuffer[Count*(NUM_CODEBOOK+1)+NUM_CODEBOOK] = 1;
else if(vad[0]==IPP_UNVOICE)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -