使用定点的复数除法

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+jbY=c+jd,其中j=sqrt(-1)abcd是实数,除法X/Y由下式给出p>

(ac+bd)/(c^2+d^2) + j(bc-ad)/(c^2+d^2)

如您所述,让K = 2^14 保存分数的二进制数字。 让Aa 的固定数字表示,即A = a * K,同样让B = b*KC=c*K,最后是D=d*K。假设您的数字不足以溢出您计算机的整数,在以下计算中:

你应该先计算U = A * C + B * DV = C * C + D * DW = B * C - A * D 然后,您应该计算V' = V >> 14。那么X/Y 的实部是U/V'X/Y 的虚部是W/V',这两部分都用你的不动点形式表示。

【讨论】:

以上是关于使用定点的复数除法的主要内容,如果未能解决你的问题,请参考以下文章

请问怎样用加法-移位实现定点乘除法?

C++:模拟定点除法/乘法

计算机组成原理——定点除法运算

DSP Math加速优化整理

DSP Math加速优化整理

DSP Math加速优化整理