【问题标题】:Complex Dot Product in CMSIS DSP LIBRARYCMSIS DSP LIBRARY 中的复杂点积
【发布时间】:2012-11-05 22:14:15
【问题描述】:

最近我一直在查看 CMSIS DSP 复杂数学函数库,我看到了一些我无法完全理解的东西,因此我在 SO 上发表了第一篇文章。

我无法理解的是 he11 复杂的点积函数如何产生正确的结果?该功能可以在这里找到:Complex Dot Product

就我而言

for(n=0; n<numSamples; n++) {  
   realResult += pSrcA[(2*n)+0]*pSrcB[(2*n)+0] - pSrcA[(2*n)+1]*pSrcB[(2*n)+1];  
   imagResult += pSrcA[(2*n)+0]*pSrcB[(2*n)+1] + pSrcA[(2*n)+1]*pSrcB[(2*n)+0];  
}  

没关系,但是怎么样:

/* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
real_sum += (*pSrcA++) * (*pSrcB++);
/* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
imag_sum += (*pSrcA++) * (*pSrcB++);

应该可以工作,因为它错过了样本的 real*imag 部分的乘积?

这可能——而且很可能是——一个非常愚蠢的问题,但不知何故,我根本看不到它有效。

【问题讨论】:

  • 是的 - 在我看来完全错误 - 可能是由暑期实习生写的,从未经过适当的审查/测试。 ;-)

标签: c arm signal-processing


【解决方案1】:

这看起来完全错误,实现与描述不符。

假设我们有z = x + i*yw = u + i*vx, y, u, v 实数。那么

z*w = (x + i*y)*(u + i*v) = (x*u - y*v) + i*(x*v + y*u)

z*conjugate(w) = (x + i*y)*(u - i*v) = (x*u + y*v) + i*(y*u - x*v)

所以循环

while(blkCnt > 0u)
{
  /* CReal = A[0]* B[0] + A[2]* B[2] + A[4]* B[4] + .....+ A[numSamples-2]* B[numSamples-2] */
  real_sum += (*pSrcA++) * (*pSrcB++);
  /* CImag = A[1]* B[1] + A[3]* B[3] + A[5]* B[5] + .....+ A[numSamples-1]* B[numSamples-1] */
  imag_sum += (*pSrcA++) * (*pSrcB++);
  /* Decrement the loop counter */
  blkCnt--;
}

你最终会得到real_sum + imag_sum = Real part of hermitian inner product

real_sumimag_sum 都与内积的实部/虚部和双线性积没有任何简单的关系。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多