基于python的希尔伯特-黄变换|绘制时间-频率-幅值谱(hilbert谱)|HHT谱图|边际谱

如何基于python绘制hilbert谱?

网上关于基于python的emd分解的代码,以及求取瞬时频率、瞬时相位、瞬时幅值的代码都比较多,但是却难以找到python的HHT谱图(即时间-频率-幅值的)以及边际谱的求取代码,这里写了个demo,供大家交流学习!

代码

import emd
import matplotlib.pyplot as plt

sample_rate = 1000
seconds = 10
num_samples = sample_rate*seconds

import numpy as np
time_vect = np.linspace(0, seconds, num_samples)
# 信号合成
x = 1.5*np.sin(2*np.pi*7*time_vect+3)
x += np.cos(2*np.pi*1*time_vect)
x += 0.8*np.cos(2*np.pi*3*time_vect)
# emd分解
imf = emd.sift.sift(x)
# 瞬时相位/幅值/频率
IP, IF, IA = emd.spectra.frequency_transform(imf, sample_rate, 'hilbert')
# HHT 谱
freq_range = (0, 30, 300)  # 0 to 10Hz in 100 steps
f, hht = emd.spectra.hilberthuang(IF, IA, freq_range, sum_time=False)

# 绘图
plt.figure(figsize=(16, 8))
#plt.subplot(211, frameon=False)
plt.plot(time_vect, x, 'k')
plt.plot(time_vect, imf[:, 0]-5, 'r')
plt.plot(time_vect, imf[:, 1]-8, 'g')
plt.plot(time_vect, imf[:, 2]-12, 'b')
plt.xlim(time_vect[0], time_vect[-1])
plt.grid(True)
plt.savefig('1.png',dpi=300)
#plt.subplot(212)
fig = plt.figure(figsize=(16,8))
#plt.pcolormesh(time_vect, f, hht, cmap='ocean_r')
a=plt.pcolormesh(time_vect, f, hht, cmap='jet')
fig.colorbar(a,shrink=0.5)
fig.colorbar
plt.ylabel('Frequency (Hz)')
plt.xlabel('Time (secs)')
#plt.grid(True)
plt.savefig('2.png',dpi=300)
plt.show()

# 边际谱
bjp = np.sum(hht,1)
fig = plt.figure(figsize=(16,8))
plt.plot(f, bjp, 'b')
plt.title('marginal spectrum');
plt.ylabel('amplitude')
plt.xlabel('Frequency')
plt.savefig('3.png',dpi=300)
plt.show()

结果图

原始信号和EMD分解结果

基于python的希尔伯特-黄变换|绘制时间-频率-幅值谱(hilbert谱)|HHT谱图|边际谱_第1张图片

HHT 谱图

基于python的希尔伯特-黄变换|绘制时间-频率-幅值谱(hilbert谱)|HHT谱图|边际谱_第2张图片

边际谱

基于python的希尔伯特-黄变换|绘制时间-频率-幅值谱(hilbert谱)|HHT谱图|边际谱_第3张图片

代码验证过,和matlab版本的结果一致哦!如果有用,支持一下哦!

你可能感兴趣的:(信号处理,python)