改善频率时间归一化/希尔伯特传输运行时间

时间:2016-09-22 20:09:05

标签: python numpy math scipy

所以这是一个非常棘手的问题......

我有一个时间序列信号,它具有我需要变白的非均匀响应谱。我使用频率时间归一化方法进行白化,其中我使用恒定的窄频带(~1 / 4最低频率的最终成员)在两个频率端点之间递增地过滤我的信号。然后我找到表征这些窄带中每一个的包络线,并对该频率成分进行归一化。然后我使用这些标准化信号重建我的信号...所有都在python中完成(对不起,必须是一个python解决方案)......

这是原始数据: enter image description here

这是它的频谱: enter image description here

以下是白化数据的频谱: enter image description here

问题是,我必须为这样的~500,000个信号执行此操作,并且需要一段时间(每个〜一分钟)...几乎整个时间花在做实际(多个)希尔伯特转变

我已经在小型集群上运行了它。我不想并行化希尔伯特所处的循环。

我正在寻找替代的包络例程/函数(非希尔伯特),或者在不进行循环的情况下计算整个窄带响应函数的替代方法。

另一种选择是使频带适应其过滤的中心频率,因此当我们进行例程时它们会逐渐变大;这只会减少我必须经历循环的次数。

欢迎任何和所有建议!!!

示例代码/数据集: https://github.com/ashtonflinders/FTN_Example

1 个答案:

答案 0 :(得分:2)

这是一种通过局部最大值计算包络的更快方法:

def calc_envelope(x, ind):
    x_abs = np.abs(x)
    loc = np.where(np.diff(np.sign(np.diff(x_abs))) < 0)[0] + 1
    peak = x_abs[loc]
    envelope = np.interp(ind, loc, peak)
    return envelope

以下是输出示例:

enter image description here

它比希尔伯特快6倍。为了加快速度,您可以编写一个cython函数来查找下一个局部最大点并迭代地进行归一化直到局部最大点。