2011-05-03 24 views
-1

美好的一天!我如何使用浮點採樣進行回聲消除處理?我試圖改變中心功能的接口和身體:我如何使Speex回聲消除器能夠處理浮點樣本?

void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out); 

void float_speex_echo_cancellation(SpeexEchoState *st, const float rec[], const float play[], float out[]); 

... 
     for (i=0;i<st->frame_size;i++) 
     { 
     spx_word32_t tmp_out; 
     tmp_out = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(st->e[chan*N+i+st->frame_size])); 
     tmp_out = ADD32(tmp_out, EXTEND32(MULT16_16_P15(st->preemph, st->memE[chan]))); 

     if (in[i*C+chan] <= -32000 || in[i*C+chan] >= 32000) 
     { 
     if (st->saturated == 0) 
      st->saturated = 1; 
     } 

     **out[i*C+chan] = (spx_int16_t)WORD2INT(tmp_out);** 

     st->memE[chan] = tmp_out; 
     } 
... 

... 

    for (i=0;i<st->frame_size;i++) 
      { 
      spx_word32_t tmp_out; 
      tmp_out = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(st->e[chan*N+i+st->frame_size])); 
      tmp_out = ADD32(tmp_out, EXTEND32(MULT16_16_P15(st->preemph, st->memE[chan]))); 

      if (in[i*C+chan] <= -32000 || in[i*C+chan] >= 32000) 
      { 
      if (st->saturated == 0) 
       st->saturated = 1; 
      } 

      **out[i*C+chan] = /*(spx_int16_t)WORD2INT(*/tmp_out*/)*/;** 

      st->memE[chan] = tmp_out; 
      } 
    ... 

和從

static inline void filter_dc_notch16(const spx_int16_t *in, spx_word16_t radius, spx_word16_t *out, int len, spx_mem_t *mem, int stride) 
{ 
    int i; 
    spx_word16_t den2; 
    den2 = (spx_word16_t)(radius*radius + .7f*(1.f-radius)*(1.f-radius)); 
    for (i=0;i<len;i++) 
    { 
     spx_int16_t vin = in[i*stride]; 
     spx_word32_t vout = mem[0] + SHL32(EXTEND32(vin),15); 
     mem[0] = mem[1] + 2*(-vin + radius*vout); 
     mem[1] = SHL32(EXTEND32(vin),15) - MULT16_32_Q15(den2,vout); 
     out[i] = SATURATE32(PSHR32(MULT16_32_Q15(radius,vout),15),32767); 
    } 
} 

static inline void float_filter_dc_notch16(const /*spx_int16_t*/spx_word16_t *in, spx_word16_t radius, spx_word16_t *out, int len, spx_mem_t *mem, int stride) 
{ 
    int i; 
    spx_word16_t den2; 
    den2 = /*(spx_word16_t)*/(radius*radius + .7f*(1.f-radius)*(1.f-radius)); 
    for (i=0;i<len;i++) 
    { 
     /*spx_int16_t*/spx_word16_t vin = in[i*stride]; 
     spx_word32_t vout = mem[0] + SHL32(EXTEND32(vin),15); 
     mem[0] = mem[1] + 2*(-vin + radius*vout); 
     mem[1] = SHL32(EXTEND32(vin),15) - MULT16_32_Q15(den2,vout); 
     out[i] = /*SATURATE32(*/PSHR32(MULT16_32_Q15(radius,vout),15)/*,32767)*/; 
    } 
} 

所以,我防止從浮子式輸出結果轉換到短整型,但現在我得到一個警告:

speex_warning(「回聲取消人開始行事滑稽,並被打了耳光(重置)。它發誓它現在的行爲「);

指向ST->有50個值screwed_up參數,並將其標誌設置爲零全力以赴樣本:

... 

if (!(Syy>=0 && Sxx>=0 && See >= 0) 
    || !(Sff < N*1e9 && Syy < N*1e9 && Sxx < N*1e9) 
) 

{ st->screwed_up += 50; for (i=0;iframe_size*C;i++) out[i] = 0; } 

... 

我能做些什麼

enter code here 

回答

1

你爲什麼要使用浮動樣品 標準線性PCM音頻根據選定的比特率表示爲整數樣本 - 8位,16位等

你從哪裏得到這個輸入?

如果我是你,我會將你得到的任何短褲轉換成短褲並將其提供給Speex,以便它可以使用它。