4

最近、私は 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];  
}  

A-大丈夫ですが、それはどうですか:

/* 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 部分の積を見逃しているため、機能するはずですか?

それは本当にばかげた質問かもしれませんが、おそらくそうです。

4

1 に答える 1

1

それは単に間違っているように見え、実装は説明と一致しません。

z = x + i*y私たちが持っていてw = 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_sumん。imag_sum

于 2012-11-05T22:34:19.100 に答える