CMSIS DSP 库中的复杂点积

标签 c arm signal-processing

最近我一直在检查 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++);

应该可以工作,因为它错过了样本的真实*图像部分的乘积?

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

最佳答案

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

假设我们有 z = x + i*yw = 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 = hermitian inner product 的实部

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

关于CMSIS DSP 库中的复杂点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13241276/

相关文章:

c - 字符串比预期的要长,并被视为多个输入

c - 当线程执行for循环迭代时如何继续与master一起工作?

c++ - 如何为我的 curses 应用程序关闭或忽略按键重复?

linux - 如何禁用 SVC ARM 指令(gcc、uclibc、buildroot)?

azure - 使用 ARM 订阅级部署部署多个资源时出现问题

linux - 我在哪里可以得到 remap_pfn_range 的 vm_area_struct?

ios - 循环不断收集附近接入点的 Wifi 强度

python - 在 Python 中使用 LPC 估计共振峰

c - 我应该相信调用库初始化函数有利于性能吗?

winapi - 如何实时处理麦克风输入?