webRTC AEC 远场滤波器

最后几句代码将远场经过滤波之后加到了传入的yf(合成回声信号)中,但是在调用本滤波器之前已经将yf全部设置为0了,因此输出的合成回声信号就是滤波器的输出。

static void FilterFarSSE2(AecCore* aec, float yf[2][PART_LEN1]) {
  int i;
  // 设置分块数
  const int num_partitions = aec->num_partitions;
  // 按块循环计算
  for (i = 0; i < num_partitions; i++) {
    int j;
	// 指针指向当前块的开始位置
    int xPos = (i + aec->xfBufBlockPos) * PART_LEN1;
    int pos = i * PART_LEN1;
    // 边界检查,如果超出了边界则回到第一块的开始
    if (i + aec->xfBufBlockPos >= num_partitions) {
      xPos -= num_partitions * (PART_LEN1);
    }

    // 向量计算
    for (j = 0; j + 3 < PART_LEN1; j += 4) {
		// 载入远场数据的实部、虚部
      const __m128 xfBuf_re = _mm_loadu_ps(&aec->xfBuf[0][xPos + j]);
      const __m128 xfBuf_im = _mm_loadu_ps(&aec->xfBuf[1][xPos + j]);
	  // 载入权值系数的实部、虚部
      const __m128 wfBuf_re = _mm_loadu_ps(&aec->wfBuf[0][pos + j]);
      const __m128 wfBuf_im = _mm_loadu_ps(&aec->wfBuf[1][pos + j]);
	  // 载入合成回声的实部、虚部
      const __m128 yf_re = _mm_loadu_ps(&yf[0][j]);
      const __m128 yf_im = _mm_loadu_ps(&yf[1][j]);
	  // 复数*复数 = 实部*实部 + 虚部*虚部 + 虚实交叉相乘 + 实虚交叉相乘
      const __m128 a = _mm_mul_ps(xfBuf_re, wfBuf_re);
      const __m128 b = _mm_mul_ps(xfBuf_im, wfBuf_im);
      const __m128 c = _mm_mul_ps(xfBuf_re, wfBuf_im);
      const __m128 d = _mm_mul_ps(xfBuf_im, wfBuf_re);
	  // e=实数结果
      const __m128 e = _mm_sub_ps(a, b);
	  // f=虚数结果
      const __m128 f = _mm_add_ps(c, d);
	  // 实数结果加到合成回声的实部,虚数结果加到合成回声的虚部,
	  //但是在调用本滤波器之前memset(yf, 0, sizeof(yf));已经设置为0了
      const __m128 g = _mm_add_ps(yf_re, e);
      const __m128 h = _mm_add_ps(yf_im, f);
	  // 将计算结果存储到合成回声中
      _mm_storeu_ps(&yf[0][j], g);
      _mm_storeu_ps(&yf[1][j], h);
    }
    // scalar code for the remaining items.
    for (; j < PART_LEN1; j++) {
      yf[0][j] += MulRe(aec->xfBuf[0][xPos + j],
                        aec->xfBuf[1][xPos + j],
                        aec->wfBuf[0][pos + j],
                        aec->wfBuf[1][pos + j]);
      yf[1][j] += MulIm(aec->xfBuf[0][xPos + j],
                        aec->xfBuf[1][xPos + j],
                        aec->wfBuf[0][pos + j],
                        aec->wfBuf[1][pos + j]);
    }
  }
}

 

你可能感兴趣的:(C++,音频开发,语音信号处理,DSP,webRTC)