最后几句代码将远场经过滤波之后加到了传入的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]);
}
}
}