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

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

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

这是原始数据:
《python – 改善频率时间归一化/希尔伯特传输运行时间》

这是它的频谱:
《python – 改善频率时间归一化/希尔伯特传输运行时间》

这是白化数据的光谱:
《python – 改善频率时间归一化/希尔伯特传输运行时间》

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

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

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

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

任何和所有建议欢迎!

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

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

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

这是一个示例输出:

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

它比希尔伯特快约6倍.为了加速甚至更多,您可以编写一个cython函数来查找下一个局部最大点,并迭代地执行归一化到局部最大点.

点赞