我正在编写一个C程序来在Fixed Point中执行2个复数的划分。 我无法从中得到分数部分。下面是更多细节。
我有两个复数:
N = a + ib
M = c + jd
我需要在固定点(不使用浮点)
进行N/M
上述复数的示例值可以是:
a = 1.55, b = 1.44, c = 1.24, d = 0.55
N = 1.55 + i(1.44)
M = 1.24 + j(0.55)
为了转换为固定点,我将这些a,b,c和d与2^14
相乘。
之后他们变成了:
a = 0x6333, b = 0x5c28, c = 0x4f5c and d = 0x2333
然后执行N/M
操作:
N/M = (a + ib)/(c + jd) = ((a + ib) * (c - jd)) / ((c + jd) * (c - jd))
然后对于真实的部分:
(ac + bd) / (c^2 + d^2)
依旧......
我面临的问题是我不理解如何从分部获得小数部分。 我只得到小数部分,大部分是1或0.
获得小数部分的正确方法是什么?在上面的例子中,实部应该是1.47490。但我只能得到1。
任何人都可以帮我正确地进行固定点的复杂划分吗?
非常感谢。
答案 0 :(得分:0)
在定点除法和乘法中,必须注意结果值必须还有缩放因子 K 。
in addition / subtraction:
a * K + b * K = K * ( a + b)
in multiplication:
(a * K) * (b * K) = K^2 * (a * b) --> must compensate with 1/K
proper form: (aK * bK) / K
in division:
(a * K) / (b * K) = a / b --> must pre-multiply with K
proper form: (aK * K) / (bK)
答案 1 :(得分:0)
对于两个复杂的X=a+jb
和Y=c+jd
,j=sqrt(-1)
,a
,b
,c
,d
是实数,除法X/Y
由
(ac+bd)/(c^2+d^2) + j(bc-ad)/(c^2+d^2)
如您所述,设K = 2^14
,用于保存分数的二进制数字。
让A
是a
的固定数字表示,即A = a * K
,同样地让B = b*K
,C=c*K
和最后D=d*K
。假设您的数字不足以溢出计算机的整数,在以下计算中:
您应首先计算U = A * C + B * D
,V = C * C + D * D
,W = B * C - A * D
然后,您应该计算V' = V >> 14
。然后,X/Y
的实部为U/V'
,X/Y
的虚部为W/V'
,两个部分均以固定点形式表示。