⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sb_celp.c

📁 SPeex语音压缩算法的静态连接库和源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
      fir_mem_up(st->high, h1, st->y1, st->full_frame_size, QMF_ORDER, st->g1_mem, stack);      for (i=0;i<st->full_frame_size;i++)         in[i]=2*(st->y0[i]-st->y1[i]) / SIG_SCALING;#endif      if (dtx)         return 0;      else         return 1;   }   /* LSP quantization */   SUBMODE(lsp_quant)(st->lsp, st->qlsp, st->lpcSize, bits);      if (st->first)   {      for (i=0;i<st->lpcSize;i++)         st->old_lsp[i] = st->lsp[i];      for (i=0;i<st->lpcSize;i++)         st->old_qlsp[i] = st->qlsp[i];   }      mem=PUSH(stack, st->lpcSize, spx_mem_t);   syn_resp=PUSH(stack, st->subframeSize, spx_sig_t);   innov = PUSH(stack, st->subframeSize, spx_sig_t);   for (sub=0;sub<st->nbSubframes;sub++)   {      spx_sig_t *exc, *sp, *res, *target, *sw;      spx_word16_t filter_ratio;      int offset;      spx_word32_t rl, rh;      spx_word16_t eh=0;      offset = st->subframeSize*sub;      sp=st->high+offset;      exc=st->exc+offset;      res=st->res+offset;      target=st->target+offset;      sw=st->sw+offset;            /* LSP interpolation (quantized and unquantized) */      lsp_interpolate(st->old_lsp, st->lsp, st->interp_lsp, st->lpcSize, sub, st->nbSubframes);      lsp_interpolate(st->old_qlsp, st->qlsp, st->interp_qlsp, st->lpcSize, sub, st->nbSubframes);      lsp_enforce_margin(st->interp_lsp, st->lpcSize, LSP_MARGIN);      lsp_enforce_margin(st->interp_qlsp, st->lpcSize, LSP_MARGIN);      lsp_to_lpc(st->interp_lsp, st->interp_lpc, st->lpcSize,stack);      lsp_to_lpc(st->interp_qlsp, st->interp_qlpc, st->lpcSize, stack);      bw_lpc(st->gamma1, st->interp_lpc, st->bw_lpc1, st->lpcSize);      bw_lpc(st->gamma2, st->interp_lpc, st->bw_lpc2, st->lpcSize);      /* Compute mid-band (4000 Hz for wideband) response of low-band and high-band         filters */      st->pi_gain[sub]=LPC_SCALING;      rh = LPC_SCALING;      for (i=1;i<=st->lpcSize;i+=2)      {         rh += st->interp_qlpc[i+1] - st->interp_qlpc[i];         st->pi_gain[sub] += st->interp_qlpc[i] + st->interp_qlpc[i+1];      }            rl = low_pi_gain[sub];#ifdef FIXED_POINT      filter_ratio=DIV32_16(SHL(rl+82,2),SHR(82+rh,5));#else      filter_ratio=(rl+.01)/(rh+.01);#endif            /* Compute "real excitation" */      fir_mem2(sp, st->interp_qlpc, exc, st->subframeSize, st->lpcSize, st->mem_sp2);      /* Compute energy of low-band and high-band excitation */      eh = compute_rms(exc, st->subframeSize);      if (!SUBMODE(innovation_quant)) {/* 1 for spectral folding excitation, 0 for stochastic */         float g;         spx_word16_t el;         el = compute_rms(low_innov+offset, st->subframeSize);         /* Gain to use if we want to use the low-band excitation for high-band */         g=eh/(.01+el);#ifdef FIXED_POINT         g *= filter_ratio/128.;#else         g *= filter_ratio;#endif         /*print_vec(&g, 1, "gain factor");*/         /* Gain quantization */         {            int quant = (int) floor(.5 + 10 + 8.0 * log((g+.0001)));            /*speex_warning_int("tata", quant);*/            if (quant<0)               quant=0;            if (quant>31)               quant=31;            speex_bits_pack(bits, quant, 5);         }      } else {         spx_word16_t gc;         spx_word32_t scale;         spx_word16_t el;         el = compute_rms(low_exc+offset, st->subframeSize);         gc = DIV32_16(MULT16_16(filter_ratio,1+eh),1+el);         /* This is a kludge that cleans up a historical bug */         if (st->subframeSize==80)            gc *= 0.70711;         /*printf ("%f %f %f %f\n", el, eh, filter_ratio, gc);*/#ifdef FIXED_POINT         {            int qgc = scal_quant(gc, gc_quant_bound, 16);            speex_bits_pack(bits, qgc, 4);            gc = MULT16_32_Q15(28626,gc_quant_bound[qgc]);         }#else         {            int qgc = (int)floor(.5+3.7*(log(gc)+0.15556));            if (qgc<0)               qgc=0;            if (qgc>15)               qgc=15;            speex_bits_pack(bits, qgc, 4);            gc = exp((1/3.7)*qgc-0.15556);         }         #endif         if (st->subframeSize==80)            gc *= 1.4142;         scale = SHL(MULT16_16(DIV32_16(SHL(gc,SIG_SHIFT-4),filter_ratio),(1+el)),4);         for (i=0;i<st->subframeSize;i++)            exc[i]=VERY_SMALL;         exc[0]=SIG_SCALING;         syn_percep_zero(exc, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, syn_resp, st->subframeSize, st->lpcSize, stack);                  /* Reset excitation */         for (i=0;i<st->subframeSize;i++)            exc[i]=VERY_SMALL;                  /* Compute zero response (ringing) of A(z/g1) / ( A(z/g2) * Aq(z) ) */         for (i=0;i<st->lpcSize;i++)            mem[i]=st->mem_sp[i];         iir_mem2(exc, st->interp_qlpc, exc, st->subframeSize, st->lpcSize, mem);         for (i=0;i<st->lpcSize;i++)            mem[i]=st->mem_sw[i];         filter_mem2(exc, st->bw_lpc1, st->bw_lpc2, res, st->subframeSize, st->lpcSize, mem);         /* Compute weighted signal */         for (i=0;i<st->lpcSize;i++)            mem[i]=st->mem_sw[i];         filter_mem2(sp, st->bw_lpc1, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, mem);         /* Compute target signal */         for (i=0;i<st->subframeSize;i++)            target[i]=sw[i]-res[i];         for (i=0;i<st->subframeSize;i++)           exc[i]=0;         signal_div(target, target, scale, st->subframeSize);         /* Reset excitation */         for (i=0;i<st->subframeSize;i++)            innov[i]=0;         /*print_vec(target, st->subframeSize, "\ntarget");*/         SUBMODE(innovation_quant)(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,                                    SUBMODE(innovation_params), st->lpcSize, st->subframeSize,                                    innov, syn_resp, bits, stack, (st->complexity+1)>>1);         /*print_vec(target, st->subframeSize, "after");*/         signal_mul(innov, innov, scale, st->subframeSize);         for (i=0;i<st->subframeSize;i++)            exc[i] += innov[i];         if (SUBMODE(double_codebook)) {            char *tmp_stack=stack;            spx_sig_t *innov2 = PUSH(tmp_stack, st->subframeSize, spx_sig_t);            for (i=0;i<st->subframeSize;i++)               innov2[i]=0;            for (i=0;i<st->subframeSize;i++)               target[i]*=2.5;            SUBMODE(innovation_quant)(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,                                       SUBMODE(innovation_params), st->lpcSize, st->subframeSize,                                       innov2, syn_resp, bits, tmp_stack, (st->complexity+1)>>1);            for (i=0;i<st->subframeSize;i++)               innov2[i]*=scale*(1/2.5)/SIG_SCALING;            for (i=0;i<st->subframeSize;i++)               exc[i] += innov2[i];         }      }      /*Keep the previous memory*/      for (i=0;i<st->lpcSize;i++)         mem[i]=st->mem_sp[i];      /* Final signal synthesis from excitation */      iir_mem2(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);            /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */      filter_mem2(sp, st->bw_lpc1, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem_sw);   }#ifndef RELEASE   /* Reconstruct the original */   fir_mem_up(st->x0d, h0, st->y0, st->full_frame_size, QMF_ORDER, st->g0_mem, stack);   fir_mem_up(st->high, h1, st->y1, st->full_frame_size, QMF_ORDER, st->g1_mem, stack);   for (i=0;i<st->full_frame_size;i++)      in[i]=2*(st->y0[i]-st->y1[i]) / SIG_SCALING;#endif   for (i=0;i<st->lpcSize;i++)      st->old_lsp[i] = st->lsp[i];   for (i=0;i<st->lpcSize;i++)      st->old_qlsp[i] = st->qlsp[i];   st->first=0;   return 1;}void *sb_decoder_init(const SpeexMode *m){   SBDecState *st;   const SpeexSBMode *mode;   st = (SBDecState*)speex_alloc(sizeof(SBDecState)+6000*sizeof(spx_sig_t));   st->mode = m;   mode=(SpeexSBMode*)m->mode;   st->encode_submode = 1;   st->stack = ((char*)st) + sizeof(SBDecState);   st->st_low = speex_decoder_init(mode->nb_mode);   st->full_frame_size = 2*mode->frameSize;   st->frame_size = mode->frameSize;   st->subframeSize = mode->subframeSize;   st->nbSubframes = mode->frameSize/mode->subframeSize;   st->lpcSize=mode->lpcSize;   speex_decoder_ctl(st->st_low, SPEEX_GET_SAMPLING_RATE, &st->sampling_rate);   st->sampling_rate*=2;   st->submodes=mode->submodes;   st->submodeID=mode->defaultSubmode;   st->first=1;   st->x0d=PUSH(st->stack, st->frame_size, spx_sig_t);   st->x1d=PUSH(st->stack, st->frame_size, spx_sig_t);   st->high=PUSH(st->stack, st->full_frame_size, spx_sig_t);   st->y0=PUSH(st->stack, st->full_frame_size, spx_sig_t);   st->y1=PUSH(st->stack, st->full_frame_size, spx_sig_t);   st->g0_mem=PUSH(st->stack, QMF_ORDER, spx_word32_t);   st->g1_mem=PUSH(st->stack, QMF_ORDER, spx_word32_t);   st->exc=PUSH(st->stack, st->frame_size, spx_sig_t);   st->qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);   st->old_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);   st->interp_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);   st->interp_qlpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);   st->pi_gain = PUSH(st->stack, st->nbSubframes, spx_word32_t);   st->mem_sp = PUSH(st->stack, 2*st->lpcSize, spx_mem_t);      st->lpc_enh_enabled=0;#ifdef ENABLE_VALGRIND   VALGRIND_MAKE_READABLE(st, (st->stack-(char*)st));#endif   return st;}void sb_decoder_destroy(void *state){   SBDecState *st;   st = (SBDecState*)state;   speex_decoder_destroy(st->st_low);   speex_free(state);}static void sb_decode_lost(SBDecState *st, spx_word16_t *out, int dtx, char *stack){   int i;   spx_coef_t *awk1, *awk2, *awk3;   int saved_modeid=0;   if (dtx)   {      saved_modeid=st->submodeID;      st->submodeID=1;   } else {      bw_lpc(GAMMA_SCALING*0.99, st->interp_qlpc, st->interp_qlpc, st->lpcSize);   }   st->first=1;      awk1=PUSH(stack, st->lpcSize+1, spx_coef_t);   awk2=PUSH(stack, st->lpcSize+1, spx_coef_t);   awk3=PUSH(stack, st->lpcSize+1, spx_coef_t);      if (st->lpc_enh_enabled)   {      spx_word16_t k1,k2,k3;      if (st->submodes[st->submodeID] != NULL)      {         k1=SUBMODE(lpc_enh_k1);         k2=SUBMODE(lpc_enh_k2);         k3=SUBMODE(lpc_enh_k3);      } else {         k1=k2=.7*GAMMA_SCALING;         k3 = 0;      }      bw_lpc(k1, st->interp_qlpc, awk1, st->lpcSize);      bw_lpc(k2, st->interp_qlpc, awk2, st->lpcSize);      bw_lpc(k3, st->interp_qlpc, awk3, st->lpcSize);      /*fprintf (stderr, "%f %f %f\n", k1, k2, k3);*/   }         /* Final signal synthesis from excitation */   if (!dtx)   {      for (i=0;i<st->frame_size;i++)         st->exc[i] *= .9;   }   for (i=0;i<st->frame_size;i++)      st->high[i]=st->exc[i];   if (st->lpc_enh_enabled)   {      /* Use enhanced LPC filter */      filter_mem2(st->high, awk2, awk1, st->high, st->frame_size, st->lpcSize,                   st->mem_sp+st->lpcSize);      filter_mem2(st->high, awk3, st->interp_qlpc, st->high, st->frame_size, st->lpcSize,                   st->mem_sp);   } else {      /* Use regular filter */      for (i=0;i<st->lpcSize;i++)         st->mem_sp[st->lpcSize+i] = 0;      iir_mem2(st->high, st->interp_qlpc, st->high, st->frame_size, st->lpcSize,                st->mem_sp);   }      /*iir_mem2(st->exc, st->interp_qlpc, st->high, st->frame_size, st->lpcSize, st->mem_sp);*/      /* Reconstruct the original */   fir_mem_up(st->x0d, h0, st->y0, st->full_frame_size, QMF_ORDER, st->g0_mem, stack);   fir_mem_up(st->high, h1, st->y1, st->full_frame_size, QMF_ORDER, st->g1_mem, stack);   mix_and_saturate(st->y0, st->y1, out, st->full_frame_size);   if (dtx)   {      st->submodeID=saved_modeid;   }   return;}int sb_decode(void *state, SpeexBits *bits, void *vout){   int i, sub;   SBDecState *st;   int wideband;   int ret;   char *stack;   spx_word32_t *low_pi_gain;   spx_sig_t *low_exc, *low_innov;   spx_coef_t *awk1, *awk2, *awk3;   int dtx;   SpeexSBMode *mode;   spx_word16_t *out = vout;      st = (SBDecState*)state;   stack=st->stack;   mode = (SpeexSBMode*)(st->mode->mode);   {      spx_word16_t *low;      low = PUSH(stack, st->frame_size, spx_word16_t);            /* Decode the low-band */      ret = speex_decode_native(st->st_low, bits, low);            for (i=0;i<st->frame_size;i++)         st->x0d[i] = low[i]*SIG_SCALING;   }   speex_decoder_ctl(st->st_low, SPEEX_GET_DTX_STATUS, &dtx);   /* If error decoding the narrowband part, propagate error */   if (ret!=0)   {      return ret;   }   if (!bits)   {      sb_decode_lost(st, out, dtx, stack);      return 0;   }   if (st->encode_submode)   {      /*Check "wideband bit"*/      if (speex_bits_remaining(bits)>0)         wideband = speex_bits_peek(bits);      else         wideband = 0;      if (wideband)      {         /*Regular wideband frame, read the submode*/         wideband = speex_bits_unpack_unsigned(bits, 1);         st->submodeID = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);      } else      {         /*Was a narrowband frame, set "null submode"*/         st->submodeID = 0;      }      if (st->submodeID != 0 && st->submodes[st->submodeID] == NULL)      {         speex_warning("Invalid mode encountered: corrupted stream?");         return -2;      }   }   /* If null mode (no transmission), just set a couple things to zero*/   if (st->submodes[st->submodeID] == NULL)   {      if (dtx)      {         sb_decode_lost(st, out, 1, stack);         return 0;      }      for (i=0;i<st->frame_size;i++)         st->exc[i]=VERY_SMALL;      st->first=1;      /* Final signal synthesis from excitation */      iir_mem2(st->exc, st->interp_qlpc, st->high, st->frame_size, st->lpcSize, st->mem_sp);      fir_mem_up(st->x0d, h0, st->y0, st->full_frame_size, QMF_ORDER, st->g0_mem, stack);      fir_mem_up(st->high, h1, st->y1, st->full_frame_size, QMF_ORDER, st->g1_mem, stack);      mix_and_saturate(st->y0, st->y1, out, st->full_frame_size);      return 0;   }   for (i=0;i<st->frame_size;i++)      st->exc[i]=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -