為什么Kaiser Window函式中Beta的最大值是709?當我使用 710 或更大的值(在 Matlab 和 NumPy 中)時,我得到了錯誤。似乎是一個愚蠢的問題,但我仍然無法找到答案......提前致謝!

這是長度為 M=64 和 Beta = 710 的 Kaiser 視窗。

uj5u.com熱心網友回復:
對于大x,i0(x)大約是exp(x),并且exp(x)在 x 處溢位,接近 709.79。
如果您使用 Python 編程并且不介意對 SciPy 的依賴,則可以使用該函式scipy.special.i0e以避免溢位的方式實作該函式:
In [47]: from scipy.special import i0e
In [48]: def i0_ratio(x, y):
...: return i0e(x)*np.exp(x - y)/i0e(y)
...:
驗證該函式是否回傳與以下相同的值np.i0(x)/np.i0(y):
In [49]: np.i0(3)/np.i0(4)
Out[49]: 0.4318550956673735
In [50]: i0_ratio(3, 4)
Out[50]: 0.43185509566737346
一個簡單的實作溢位但i0_ratio沒有溢位的示例:
In [51]: np.i0(650)/np.i0(720)
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/numpy/lib/function_base.py:3359: RuntimeWarning: overflow encountered in exp
return exp(x) * _chbevl(32.0/x - 2.0, _i0B) / sqrt(x)
Out[51]: 0.0
In [52]: i0_ratio(650, 720)
Out[52]: 4.184118428217628e-31
在 Matlab 中,要獲得與 相同的縮放貝塞爾函式i0e(x),您可以使用besseli(0, x, 1).
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522625.html
