希尔伯特-黄变换:瞬时频率
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工具吗以上是关于希尔伯特-黄变换:瞬时频率的主要内容,如果未能解决你的问题,请参考以下文章