使用定点的复数除法
Posted
技术标签:
【中文标题】使用定点的复数除法【英文标题】:Complex division using Fixed Point 【发布时间】:2014-11-14 06:48:30 【问题描述】:我正在编写一个 C 程序来执行定点中 2 个复数的除法。 我无法从中获得小数部分。以下是有关它的更多详细信息。
我有 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 个。
谁能帮助我正确地进行定点的复杂除法?
非常感谢。
【问题讨论】:
对 a、b、c、d 使用浮点变量!!!或将任何一个操作数类型转换为浮动 先尝试真正的固定算术:你会从中得到什么,例如(一/二)?我打赌你得到 1 而不是 (16384 * 1.55 / 1.44)。 【参考方案1】:在定点除法和乘法中,必须注意结果值还必须具有缩放因子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)
【讨论】:
【参考方案2】:对于两个复数X=a+jb
和Y=c+jd
,其中j=sqrt(-1)
和a
、b
、c
、d
是实数,除法X/Y
由下式给出p>
(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'
,这两部分都用你的不动点形式表示。
【讨论】:
以上是关于使用定点的复数除法的主要内容,如果未能解决你的问题,请参考以下文章