📄 nb_celp.c
字号:
ALLOC(interp_qlsp, st->lpcSize, spx_lsp_t); if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost) { multicomb(st->exc-st->subframeSize, out, st->interp_qlpc, st->lpcSize, 2*st->subframeSize, best_pitch, 40, SUBMODE(comb_gain), stack); multicomb(st->exc+st->subframeSize, out+2*st->subframeSize, st->interp_qlpc, st->lpcSize, 2*st->subframeSize, best_pitch, 40, SUBMODE(comb_gain), stack); } else { for (i=0;i<st->frameSize;i++) out[i]=st->exc[i-st->subframeSize]; } /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */ if (st->count_lost) { spx_word16_t exc_ener; spx_word32_t gain32; spx_word16_t gain; exc_ener = compute_rms16 (st->exc, st->frameSize); gain32 = PDIV32(ol_gain, ADD16(exc_ener,1));#ifdef FIXED_POINT if (gain32 > 32767) gain32 = 32767; gain = EXTRACT16(gain32);#else if (gain32 > 2) gain32=2; gain = gain32;#endif for (i=0;i<st->frameSize;i++) { st->exc[i] = MULT16_16_Q14(gain, st->exc[i]); out[i]=st->exc[i-st->subframeSize]; } } /*Loop on subframes */ for (sub=0;sub<st->nbSubframes;sub++) { int offset; spx_word16_t *sp; spx_word16_t *exc; /* Offset relative to start of frame */ offset = st->subframeSize*sub; /* Original signal */ sp=out+offset; /* Excitation */ exc=st->exc+offset; /* LSP interpolation (quantized and unquantized) */ lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, st->lpcSize, sub, st->nbSubframes); /* Make sure the LSP's are stable */ lsp_enforce_margin(interp_qlsp, st->lpcSize, LSP_MARGIN); /* Compute interpolated LPCs (unquantized) */ lsp_to_lpc(interp_qlsp, ak, st->lpcSize, stack); /* Compute analysis filter at w=pi */ { spx_word32_t pi_g=LPC_SCALING; for (i=0;i<st->lpcSize;i+=2) { /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/ pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i]))); } st->pi_gain[sub] = pi_g; } iir_mem16(sp, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp, stack); for (i=0;i<st->lpcSize;i++) st->interp_qlpc[i] = ak[i]; } if (st->highpass_enabled) highpass(out, out, st->frameSize, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp); /*for (i=0;i<st->frameSize;i++) printf ("%d\n", (int)st->frame[i]);*/ /* Store the LSPs for interpolation in the next frame */ for (i=0;i<st->lpcSize;i++) st->old_qlsp[i] = qlsp[i]; /* The next frame will not be the first (Duh!) */ st->first = 0; st->count_lost=0; st->last_pitch = best_pitch;#ifdef FIXED_POINT st->last_pitch_gain = PSHR16(pitch_average,2);#else st->last_pitch_gain = .25*pitch_average; #endif st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain; if (st->pitch_gain_buf_idx > 2) /* rollover */ st->pitch_gain_buf_idx = 0; st->last_ol_gain = ol_gain; return 0;}int nb_encoder_ctl(void *state, int request, void *ptr){ EncState *st; st=(EncState*)state; switch(request) { case SPEEX_GET_FRAME_SIZE: (*(spx_int32_t*)ptr) = st->frameSize; break; case SPEEX_SET_LOW_MODE: case SPEEX_SET_MODE: st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr); break; case SPEEX_GET_LOW_MODE: case SPEEX_GET_MODE: (*(spx_int32_t*)ptr) = st->submodeID; break; case SPEEX_SET_VBR: st->vbr_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_VBR: (*(spx_int32_t*)ptr) = st->vbr_enabled; break; case SPEEX_SET_VAD: st->vad_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_VAD: (*(spx_int32_t*)ptr) = st->vad_enabled; break; case SPEEX_SET_DTX: st->dtx_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_DTX: (*(spx_int32_t*)ptr) = st->dtx_enabled; break; case SPEEX_SET_ABR: st->abr_enabled = (*(spx_int32_t*)ptr); st->vbr_enabled = st->abr_enabled!=0; if (st->vbr_enabled) { spx_int32_t i=10; spx_int32_t rate, target; float vbr_qual; target = (*(spx_int32_t*)ptr); while (i>=0) { speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i); speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate); if (rate <= target) break; i--; } vbr_qual=i; if (vbr_qual<0) vbr_qual=0; speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual); st->abr_count=0; st->abr_drift=0; st->abr_drift2=0; } break; case SPEEX_GET_ABR: (*(spx_int32_t*)ptr) = st->abr_enabled; break; case SPEEX_SET_VBR_QUALITY: st->vbr_quality = (*(float*)ptr); break; case SPEEX_GET_VBR_QUALITY: (*(float*)ptr) = st->vbr_quality; break; case SPEEX_SET_QUALITY: { int quality = (*(spx_int32_t*)ptr); if (quality < 0) quality = 0; if (quality > 10) quality = 10; st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality]; } break; case SPEEX_SET_COMPLEXITY: st->complexity = (*(spx_int32_t*)ptr); if (st->complexity<0) st->complexity=0; break; case SPEEX_GET_COMPLEXITY: (*(spx_int32_t*)ptr) = st->complexity; break; case SPEEX_SET_BITRATE: { spx_int32_t i=10; spx_int32_t rate, target; target = (*(spx_int32_t*)ptr); while (i>=0) { speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i); speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate); if (rate <= target) break; i--; } } break; case SPEEX_GET_BITRATE: if (st->submodes[st->submodeID]) (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/st->frameSize; else (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/st->frameSize; break; case SPEEX_SET_SAMPLING_RATE: st->sampling_rate = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SAMPLING_RATE: (*(spx_int32_t*)ptr)=st->sampling_rate; break; case SPEEX_RESET_STATE: { int i; st->bounded_pitch = 1; st->first = 1; for (i=0;i<st->lpcSize;i++) st->old_lsp[i]=(M_PI*((float)(i+1)))/(st->lpcSize+1); for (i=0;i<st->lpcSize;i++) st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0; for (i=0;i<st->frameSize+st->max_pitch+1;i++) st->excBuf[i]=st->swBuf[i]=0; for (i=0;i<st->windowSize-st->frameSize;i++) st->winBuf[i]=0; } break; case SPEEX_SET_SUBMODE_ENCODING: st->encode_submode = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SUBMODE_ENCODING: (*(spx_int32_t*)ptr) = st->encode_submode; break; case SPEEX_GET_LOOKAHEAD: (*(spx_int32_t*)ptr)=(st->windowSize-st->frameSize); break; case SPEEX_SET_PLC_TUNING: st->plc_tuning = (*(spx_int32_t*)ptr); if (st->plc_tuning>100) st->plc_tuning=100; break; case SPEEX_GET_PLC_TUNING: (*(spx_int32_t*)ptr)=(st->plc_tuning); break; case SPEEX_SET_VBR_MAX_BITRATE: st->vbr_max = (*(spx_int32_t*)ptr); break; case SPEEX_GET_VBR_MAX_BITRATE: (*(spx_int32_t*)ptr) = st->vbr_max; break; case SPEEX_SET_HIGHPASS: st->highpass_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_HIGHPASS: (*(spx_int32_t*)ptr) = st->highpass_enabled; break; /* This is all internal stuff past this point */ case SPEEX_GET_PI_GAIN: { int i; spx_word32_t *g = (spx_word32_t*)ptr; for (i=0;i<st->nbSubframes;i++) g[i]=st->pi_gain[i]; } break; case SPEEX_GET_EXC: { int i; for (i=0;i<st->nbSubframes;i++) ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*st->subframeSize, st->subframeSize); } break; case SPEEX_GET_RELATIVE_QUALITY: (*(float*)ptr)=st->relative_quality; break; case SPEEX_SET_INNOVATION_SAVE: st->innov_rms_save = (spx_word16_t*)ptr; break; case SPEEX_SET_WIDEBAND: st->isWideband = *((spx_int32_t*)ptr); break; case SPEEX_GET_STACK: *((char**)ptr) = st->stack; break; default: speex_warning_int("Unknown nb_ctl request: ", request); return -1; } return 0;}int nb_decoder_ctl(void *state, int request, void *ptr){ DecState *st; st=(DecState*)state; switch(request) { case SPEEX_SET_LOW_MODE: case SPEEX_SET_MODE: st->submodeID = (*(spx_int32_t*)ptr); break; case SPEEX_GET_LOW_MODE: case SPEEX_GET_MODE: (*(spx_int32_t*)ptr) = st->submodeID; break; case SPEEX_SET_ENH: st->lpc_enh_enabled = *((spx_int32_t*)ptr); break; case SPEEX_GET_ENH: *((spx_int32_t*)ptr) = st->lpc_enh_enabled; break; case SPEEX_GET_FRAME_SIZE: (*(spx_int32_t*)ptr) = st->frameSize; break; case SPEEX_GET_BITRATE: if (st->submodes[st->submodeID]) (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/st->frameSize; else (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/st->frameSize; break; case SPEEX_SET_SAMPLING_RATE: st->sampling_rate = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SAMPLING_RATE: (*(spx_int32_t*)ptr)=st->sampling_rate; break; case SPEEX_SET_HANDLER: { SpeexCallback *c = (SpeexCallback*)ptr; st->speex_callbacks[c->callback_id].func=c->func; st->speex_callbacks[c->callback_id].data=c->data; st->speex_callbacks[c->callback_id].callback_id=c->callback_id; } break; case SPEEX_SET_USER_HANDLER: { SpeexCallback *c = (SpeexCallback*)ptr; st->user_callback.func=c->func; st->user_callback.data=c->data; st->user_callback.callback_id=c->callback_id; } break; case SPEEX_RESET_STATE: { int i; for (i=0;i<st->lpcSize;i++) st->mem_sp[i]=0; for (i=0;i<st->frameSize + st->max_pitch + 1;i++) st->excBuf[i]=0; } break; case SPEEX_SET_SUBMODE_ENCODING: st->encode_submode = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SUBMODE_ENCODING: (*(spx_int32_t*)ptr) = st->encode_submode; break; case SPEEX_GET_LOOKAHEAD: (*(spx_int32_t*)ptr)=st->subframeSize; break; case SPEEX_SET_HIGHPASS: st->highpass_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_HIGHPASS: (*(spx_int32_t*)ptr) = st->highpass_enabled; break; case SPEEX_GET_PI_GAIN: { int i; spx_word32_t *g = (spx_word32_t*)ptr; for (i=0;i<st->nbSubframes;i++) g[i]=st->pi_gain[i]; } break; case SPEEX_GET_EXC: { int i; for (i=0;i<st->nbSubframes;i++) ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*st->subframeSize, st->subframeSize); } break; case SPEEX_GET_DTX_STATUS: *((spx_int32_t*)ptr) = st->dtx_enabled; break; case SPEEX_SET_INNOVATION_SAVE: st->innov_save = (spx_word16_t*)ptr; break; case SPEEX_SET_WIDEBAND: st->isWideband = *((spx_int32_t*)ptr); break; case SPEEX_GET_STACK: *((char**)ptr) = st->stack; break; default: speex_warning_int("Unknown nb_ctl request: ", request); return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -