2012-11-05 28 views
4

最近我一直在檢查CMSIS DSP複雜的數學函數庫,並且我看到了一些我無法完全理解的東西,因此我在SO上發表了第一篇文章。CMSIS DSP LIBRARY中的複雜點積

我無法掌握的是他如何才能使複雜的點積函數產生正確的結果?該功能可以在這裏找到: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++); 

應該工作,因爲它錯過了樣品的真實圖像部分的產物?

它可能 - 最可能是 - 一個非常愚蠢的問題,但不知何故,我根本無法看到它的工作。

+1

是的 - 看起來完全錯了 - 可能是夏季實習生寫的,沒有經過適當的審查/測試。 ;-) –

回答

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都不以任何簡單的方式與內積的實/虛部分或雙線性乘積有關。