最近我一直在检查CMSIS DSP复杂的数学函数库,我看到了一些我无法完全理解的东西,因此我在SO上发表了第一篇文章。
我无法理解的是复杂的点积函数如何能够产生正确的结果?该功能可在此处找到: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++);
应该有效,因为它错过了样品的真实*成像部分的产物?
它可能 - 而且很可能是 - 一个非常愚蠢的问题,但不知怎的,我根本看不到它的工作。
答案 0 :(得分:1)
这看起来很简单,并且实现与描述不符。
假设z = x + i*y
和w = u + i*v
x, 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_sum
和imag_sum
都不是以内部产品的实/虚部分和双线性产品相关的简单方式。