Python:1d数组的快速Hankel变换

时间:2017-04-06 15:19:37

标签: python numpy transform fft

我正在尝试在Python中找到Hankel变换的任何现有实现(实际上我更多的是两个2d径向对称函数的对称傅立叶变换,但它可以很容易地简化为hankel变换)。

我知道hankel python模块,但它需要lambda函数进行输入,而我只有1d数组。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我是hankel的作者。虽然我不建议在这种情况下使用我的代码(因为正如你所提到的,它需要一个可调用的输入函数,其目的是准确计算积分,而不是做DHT),我会说它可能。

您需要做的就是插入输入1D数组。如何做到这一点取决于你,但通常类似以下内容的工作非常好:

from scipy.interpolate import InterpolatedUnivariateSpline as Spline
import numpy as np

x, y = # Import/create data vectors

# Do this if y is both negative and positive
fnc = Spline(x,y, k=1) #I usually choose k=1 in case anything gets extrapolated.

# Otherwise do this
spl = Spline(np.log(x), np.log(y), k=1)
fnc = lambda x : np.exp(spl(np.log(x)))

# Continue as normal with hankel.transform(fnc, kvec)

执行此操作的一个主要问题是选择参数Nh,以便对kkvec的所有值进行近似转换。如果kvec跨越宽动态范围,则hankel效率非常低,因为它在变换中为每个N使用相同的基础数组(长度为k),这意味着最困难的k设置了性能级别。

再说一遍,简而言之我不会推荐hankel,但如果你找不到任何其他东西,它仍然可以使用; - )

答案 1 :(得分:2)

我的一个朋友正在寻找使用Python进行汉克尔转换的方法,并在确定没有可用的方法后(部分是基于对这个问题的答案),与我分享了我的知识。

我现在整理,记录和发布了代码为PyHankdocs)。

此程序包按照原始问题的要求(如果过了几年!)执行准离散汉克尔变换,但希望此答案能将找到该问题的未来用户(如我的朋友)引导到正确的位置。 / p>

答案 2 :(得分:1)

如果您通过转化部分阅读了Hankel的文档,您会看到要执行您调用hankel.transform(function, array, ret_err=bool)的转换,因此您只需要无论你需要什么形式的转型。我相信在Hankel Transformation的维基百科条目中有一个转换函数列表。