所以这是一个非常棘手的问题……
我有一个时间序列信号,它具有非均匀的响应频谱,我需要白化.我使用频率时间归一化方法进行白化,其中我使用恒定的窄频带(~1 / 4最低频率的最终成员)在两个频率端点之间递增地过滤我的信号.然后我找到表征这些窄带中每一个的包络线,并对该频率成分进行归一化.然后我使用这些标准化信号重建我的信号…所有都在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
这是一个示例输出:
它比希尔伯特快约6倍.为了加速甚至更多,您可以编写一个cython函数来查找下一个局部最大点,并迭代地执行归一化到局部最大点.