📄 dtx_enc.c
字号:
lsp[6] = (Word16)(L_lsp[6]>> 3);
lsp[7] = (Word16)(L_lsp[7]>> 3);
lsp[8] = (Word16)(L_lsp[8]>> 3);
lsp[9] = (Word16)(L_lsp[9]>> 3);
/* quantize logarithmic energy to 6 bits */ pst->log_en_index = (log_en + 2560); /* +2.5 in Q10 */
pst->log_en_index = (pst->log_en_index + 128); /* add 0.5/4 in Q10 */
pst->log_en_index = (pst->log_en_index >> 8);
pst->log_en_index = ( pst->log_en_index > 63) ? 63 : ((pst->log_en_index < 0) ? 0 : pst->log_en_index );
/* update gain predictor memory */ log_en = (pst->log_en_index<< 8 ); /* Q11 and divide by 4 */
log_en -= 11560 ; /* add 2.5 in Q11 */
//log_en -= 9000;
log_en = (log_en > 0) ? 0 : (( log_en < -14436) ? -14436 : log_en );
/* past_qua_en for other modes than MR122 */ ppredState->past_qua_en[0] = log_en;
ppredState->past_qua_en[1] = log_en;
ppredState->past_qua_en[2] = log_en;
ppredState->past_qua_en[3] = log_en;
/* scale down by factor 20*log10(2) in Q15 */ log_en = (5443* log_en >> 15 ); /* past_qua_en for mode MR122 */ ppredState->past_qua_en_MR122[0] = log_en;
ppredState->past_qua_en_MR122[1] = log_en;
ppredState->past_qua_en_MR122[2] = log_en;
ppredState->past_qua_en_MR122[3] = log_en;
/* make sure that LSP's are ordered */ Lsp_lsf(lsp, lsf, M);// Reorder_lsf(lsf, LSF_GAP, M);
lsf_min1 = LSF_GAP;
// for (i = 0; i < M; i++)
{ lsf[0] = ( lsf[0]< lsf_min1)? lsf_min1 : lsf[0];
lsf_min1 = lsf[0]+ LSF_GAP;
lsf[1] = ( lsf[1]< lsf_min1)? lsf_min1 : lsf[1];
lsf_min1 = lsf[1]+ LSF_GAP;
lsf[2] = ( lsf[2]< lsf_min1)? lsf_min1 : lsf[2];
lsf_min1 = lsf[2]+ LSF_GAP;
lsf[3] = ( lsf[3]< lsf_min1)? lsf_min1 : lsf[3];
lsf_min1 = lsf[3]+ LSF_GAP;
lsf[4] = ( lsf[4]< lsf_min1)? lsf_min1 : lsf[4];
lsf_min1 = lsf[4]+ LSF_GAP;
lsf[5] = ( lsf[5]< lsf_min1)? lsf_min1 : lsf[5];
lsf_min1 = lsf[5]+ LSF_GAP;
lsf[6] = ( lsf[6]< lsf_min1)? lsf_min1 : lsf[6];
lsf_min1 = lsf[6]+ LSF_GAP;
lsf[7] = ( lsf[7]< lsf_min1)? lsf_min1 : lsf[7];
lsf_min1 = lsf[7]+ LSF_GAP;
lsf[8] = ( lsf[8]< lsf_min1)? lsf_min1 : lsf[8];
lsf_min1 = lsf[8]+ LSF_GAP;
lsf[9] = ( lsf[9]< lsf_min1)? lsf_min1 : lsf[9];
lsf_min1 = lsf[9]+ LSF_GAP;
}
// Lsf_lsp(lsf, lsp, M);
ind1 = (lsf[0]>> 8); offset1 = lsf[0] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[0] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[1]>> 8); offset1 = lsf[1] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[1] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[2]>> 8); offset1 = lsf[2] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[2] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[3]>> 8); offset1 = lsf[3] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[3] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[4]>> 8); offset1 = lsf[4] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[4] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[5]>> 8); offset1 = lsf[5] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[5] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[6]>> 8); offset1 = lsf[6] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[6] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[7]>> 8); offset1 = lsf[7] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[7] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[8]>> 8); offset1 = lsf[8] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[8] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
ind1 = (lsf[9]>> 8); offset1 = lsf[9] & 0x00ff;
L_tmp1 = ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])* offset1) <<1 ;
lsp[9] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
/* Quantize lsp and put on parameter list */ Q_plsf_3(qSt, MRDTX, lsp, lsp_q, pst->lsp_index,
&pst->init_lsf_vq_index);
} *(*anap)++ = pst->init_lsf_vq_index; /* 3 bits */
*(*anap)++ = pst->lsp_index[0]; /* 8 bits */
*(*anap)++ = pst->lsp_index[1]; /* 9 bits */
*(*anap)++ = pst->lsp_index[2]; /* 9 bits */
*(*anap)++ = pst->log_en_index; /* 6 bits */
return 0;}/***************************************************************************
Function : dtx_buffer
Purpose : handles the DTX buffer
Input :
st : State struct
lsp_new[] : LSP vector
speech[] : speech samples
Output :
st : State struct
Return:
**************************************************************************/
int dtx_buffer(dtx_encState *st,Word16 lsp_new[], Word16 speech[] )
{
Word16 i; Word32 L_frame_en; Word16 log_en_e; Word16 log_en_m; Word16 log_en;
Word16*plsp_new = lsp_new, *pspeech = speech;
dtx_encState *pst = st;
/* update pointer to circular buffer */ pst->hist_ptr ++;
pst->hist_ptr = (pst->hist_ptr == DTX_HIST_SIZE ) ? 0 : pst->hist_ptr;
/* copy lsp vector into buffer */ memcpy( &pst->lsp_hist[pst->hist_ptr * M], plsp_new, 20);
/* compute log energy based on frame energy */ L_frame_en = 0; /* Q0 */ for (i=0; i < L_FRAME; i++) {
L_frame_en += (pspeech[i]*pspeech[i] << 1);
if(L_frame_en < 0) { L_frame_en = MAX_32; break; }
} Log2(L_frame_en, &log_en_e, &log_en_m); /* convert exponent and mantissa to Word16 Q10 */ log_en = (log_en_e<< 10); /* Q10 */ log_en += (log_en_m>> 5); /* divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193 */ log_en -= 8521; /* insert into log energy buffer with division by 2 */ log_en >>= 1; pst->log_en_hist[pst->hist_ptr] = log_en; /* Q10 */
return 0;}
Word16 tx_dtx_handler(dtx_encState *st, Word16 vad_flag, Mode *usedMode )
{
Word16 compute_new_sid_possible;
dtx_encState *pst = st;
/* this state machine is in synch with the GSMEFR txDtx machine */
pst->decAnaElapsedCount = pst->decAnaElapsedCount == 0x7fff ? 0x7fff : pst->decAnaElapsedCount + 1;
compute_new_sid_possible = 0;
if (vad_flag != 0)
{
pst->dtxHangoverCount = DTX_HANG_CONST;
}
else
{
/* non-speech */
if (pst->dtxHangoverCount == 0)
{
/* out of decoder analysis hangover */
pst->decAnaElapsedCount = 0;
*usedMode = MRDTX;
compute_new_sid_possible = 1;
}
else
{
/* in possible analysis hangover */
pst->dtxHangoverCount -- ;
/* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */
*usedMode = ( pst->decAnaElapsedCount + pst->dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH ) ? MRDTX : *usedMode ;
}
}
return compute_new_sid_possible;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -