0

我正在尝试使用以下等式计算 Ricean Fading PDF。Ricean 褪色 PDF . 其中“y”是归一化包络,“gamma”是 SNR

如果 K 值很大,那么

math.exp(-((1.+_gamma)*pow(_y,2.) + _gamma))

exp 产生大浮点数(eq 1.01e-5088)。在 python 中,它将显示 '0.0' 作为值

mpmath.besseli(0,2. * _y * np.sqrt(_gamma * (1. + _gamma)))

Bessel 函数的值显示大 int 值(eq 7.78e+5092)。在 python 中它会显示 '**inf**' 值

如何在 python 中存储大整数和浮点值并计算 pdf?

def rice_pdf(self, _y, _gamma):
   返回 2. * _y * (1. + _gamma) * math.exp(-((1.+_gamma)*pow(_y,2.) + _gamma)) * special.i0(2. * _y * np.sqrt (_gamma * (1. + _gamma)))

谢谢。

4

1 回答 1

0

如果您有一种方法来计算贝塞尔函数的对数,则可以通过将其转换为求和以及随后的求幂来避免非常大和非常小的数字相乘,这应该可以解决数值问题(利用事实exp(a) * exp(b) == exp(a + b))。

def rice_pdf(_y, _gamma):
    a = np.log(2. * _y * (1. + _gamma))
    b = -((1.+_gamma)*pow(_y,2.) + _gamma)
    c = lni(2. * _y * np.sqrt(_gamma * (1. + _gamma))) 
    return np.exp(a + b + c)

此函数假定存在lni计算的实现log(i0(z))。但是,我知道没有此类功能的现有实现。mpmath您可以通过使用中间结果来解决此问题:

def lni(z):
    i0 = mpmath.besseli(0, z)  # may become a big number
    logi0 = mpmath.log(i0)  # logarithm brings big number into sensible range
    return float(logi0)  # convert back to normal floating point
于 2017-04-07T09:45:45.383 回答