【问题标题】:Improving frequency time normalization/hilbert transfer runtimes改善频率时间归一化/希尔伯特传输运行时间
【发布时间】:2017-01-31 13:30:02
【问题描述】:

所以这是一个有点棘手的问题......

我有一个时间序列信号,它的响应谱不均匀,我需要对其进行美白处理。我使用频率时间归一化方法进行此白化,其中我使用恒定的窄频带(~1/4 最低频率端成员)在两个频率端点之间增量过滤我的信号。然后我找到表征这些窄带中每一个的包络,并将该频率分量归一化。然后我使用这些规范化的信号重建我的信号......全部在 python 中完成(抱歉,必须是 python 解决方案)......

这是原始数据:

这是它的光谱:

这是白化数据的光谱:

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

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

我正在寻找替代包络例程/函数(非 Hilbert),或替代方法来计算整个窄带响应函数而无需执行循环。

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

欢迎提出任何建议!!!

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

【问题讨论】:

  • hilbert 使用 fft,因此将信号长度设置为 2**n 会加快一点速度。
  • 离最近的 pow2 太远了,但我确保它至少是一个偶数,这可以改善它。

标签: python numpy math scipy


【解决方案1】:

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

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 函数来查找下一个局部最大点并迭代地对局部最大点进行归一化。

【讨论】:

  • 谢谢海瑞!是的,大约 6 倍的速度增加返回相同的包络,并最终导致相同的频率时间归一化信号。
  • 您能解释一下如何计算 calc_envelope 函数的“ind”参数吗?
猜你喜欢
  • 2014-06-14
  • 2010-09-11
  • 2021-03-16
  • 1970-01-01
  • 2017-08-31
  • 2010-12-16
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多