希尔伯特-黄变换:瞬时频率

Posted

技术标签:

【中文标题】希尔伯特-黄变换:瞬时频率【英文标题】:Hilbert–Huang transform: Instantaneous frequency 【发布时间】:2014-06-14 09:43:44 【问题描述】:

我正在用 Java 实现“经验模式分解”。下一步是希尔伯特-黄 变换,我需要找到如何获得“瞬时频率”。有人知道如何获得吗?

使用 EMD 方法,任何复杂的数据集都可以分解为有限且通常数量很少的分量,即固有模态函数 (IMF) 的集合。下一步是希尔伯特-黄变换。从这里我计算信号的相位,在我必须计算瞬时频率之后,我在 Matlab 代码中搜索,如下链接:http://read.pudn.com/downloads100/sourcecode/math/408870/emd/instfreq/archive/ifreq.m__.htm

但我不明白。

谢谢

【问题讨论】:

请详细说明您想要实现的目标以及您尝试实现的目标。 您愿意分享您的 java 代码,以便其他人可以从它的实现中受益吗? 【参考方案1】:

实例频率可以在Python中计算

def hilb(s, unwrap=False):
    from scipy.signal import hilbert
    H = hilbert(s)
    amp = np.abs(H)
    phase = np.arctan2(H.imag, H.real)
    if unwrap: phase = np.unwrap(phase)
    return amp, phase

inst_amp, phase = hilb(imf, unwrap=True)
inst_freq = np.diff(phase)

【讨论】:

为什么这个答案没有被选为最佳? 嗨,我在使用你的代码,但在 hilbert(s) 中获取了 nan 值,可能是什么问题?【参考方案2】:

Hilbert-Huang 变换是经验模态分解 (EMD) 和 Hilbert 变换的组合。

首先,EMD 是一种算法,可为您提供内在模式函数 (IMF)。

然后将希尔伯特变换应用于每个 IMF。

从 IMF,希尔伯特变换给出一个 pi/2 相位延迟信号,您可以从中计算相位,以及相位的时间导数,它与瞬时频率成正比。

您将在该页面上找到有关 EMD 算法变体的有趣教程和详细信息:http://perso.ens-lyon.fr/patrick.flandrin/emd.html

【讨论】:

【参考方案3】:

您可以使用 Hilbert-Huang 变换 (HHT) 处理您的信号数据,HHT 是经验模式分解 (EMD) 和 Hilbert 谱分析 (HSA) 与 Matlab 或 Python 的结合。在 Matlab 或 Python 中,有 HHT 方法可以直接使用,不需要自己计算瞬时频率(IF)。

以 Matlab 为例:

首先,你可以通过对信号数据实现 emd 来获得 IMF 和残差,代码为: [IMF,residual,info] = emd(signal,'Interpolation','pchip', 'Display', 0);

那么,IF,即IMFINSF,可以通过hht(IMF, fs)得到,其中fs是采样频率 [P,F,T,IMFINSF,IMFINSE]=hht(IMF,fs);

另外,Python中还有一些工具和方法。

【讨论】:

能分享一下python工具吗

以上是关于希尔伯特-黄变换:瞬时频率的主要内容,如果未能解决你的问题,请参考以下文章

信号处理-基于希尔伯特解调(包络谱)的轴承故障诊断实战,通过python代码实现超详细讲解

经验模式分解(EMD)和希尔伯特-黄变换(HHT)

使用希尔伯特-黄变换(HHT)进行时间序列分析

EMD算法原理分解信号

在 MATLAB 中绘制二维希尔伯特谱

随时间变化的瞬时频率