G-Rilling EMD工具箱
工具箱的安装
运行install_emd.m文件可以实现此工具箱的安装,uninstall_emd.m实现卸载。
安装中的问题
complex.h的问题
解决方法:EMDS/make_emdc.m中第28行中mex(’-DC99_OK‘,args(:))语句中的 '-DC99_OK' 即可。
#define CLOCAL_MEAN_H
#ifndef M_PI
#define M_PI 3.1415926
#endif
http://www.chinavib.com/thread-84036-1-1.html
工具箱的使用
工具箱函数
index_emd.M list of functions in the EMD package
EMD分解函数
函数 | 功能 |
emd | 计算EMD、双变量/复数EMD |
emd_local | 计算local EMD |
emd_online | 计算在线EMD(不是真正在线应用,此函数只是一个示范) |
emdc | 使用Cauchy-like停止准则的快速EMD实现,需编译 |
emdc_fix | 使用预定义迭代次数的快速EMD实现,需编译 |
cemdc | 使用Cauchy-like停止准则的快速双变量/复数EMD实现(方法1),需编译 |
cemdc_fix | 使用预定义迭代次数的快速双变量/复数EMD实现(方法1),需编译 |
cemdc2 | 使用Cauchy-like停止准则的快速双变量/复数EMD实现(方法2),需编译 |
cemdc2_fix | 使用预定义迭代次数的快速双变量/复数EMD实现(方法2),需编译 |
工具函数
函数 | 功能 |
install_emd | 设置Matlab路径,编译c代码 |
uninstall_emd | 回复install_emd做的修改,移除文件 |
make_emdc | 编译c代码 |
emd_visu | EMD可视化 |
cemd_visu | 双变量/复数EMD可视化(emd_visu的输入是双变量或复数时自动改为调用cemd_visu) |
cenvelope | 计算双变量EMD的包络曲线 |
cemd_disp | 显示复数包络曲线 |
plot3c | 三维中绘制复数向量 |
plotc | 绘制复数向量在一个可变方向上的投影 |
dirstretch | 复数向量的方向拉伸 |
hhspectrum | 计算Hilbert-Huang谱(需要时频工具箱http://tftb.nongnu.org) |
toimage | 将一个一维函数谱转化为图像 |
disp_hhs | 以Hilbert-Huang谱的形式显示toimage函数的输出 |
addtag | 添加标签到一个图形对象 |
rmtag | 移除标签从一个图形对象 |
hastag | 测试一个图形对象是否有指定的标签 |
findtag | 找有指定标签的图形对象 |
来自《On Empirical Mode Decomposition and its algorithms》的Examples
函数 | 功能 |
emd_fmsin | 一个包含3组分的例子(需要时频工具箱) |
emd_triang | 另一个包含3组分的例子 |
emd_sampling | effect of sampling on 1 tone |
emd_separation | separation of 2 tones |
ex_online | the way emd_online.m works |
triangular_signal | emd_triang文件调用的子程序 |
来自《Bivariate Empirical Mode Decomposition》的Examples
函数 | 功能 |
bivariate_EMD_principle | 双变量/复数EMD原则 |
bivariate_EMD_mean_definitions | 各种方法的平均值的定义 |
bivariate_EMD_illustration | 双变量EMD在海洋漂流位置的应用图解 |
工具箱使用示例
EMD
clc
clear all
close all
% 原始数据
fs = 1000;
ts = 1/fs;
t=0:ts:0.3;
z=2*sin(2*pi*10*t) + 5.*sin(2*pi*100*t);
figure
plot(t, z)
title('原始信号')
% EMD
imf=emd(z);
emd_visu(z,t,imf)
[A,f,tt]=hhspectrum(imf);
[im,tt]=toimage(A,f);
disp_hhs(im);
边际谱
clc
clear all
close all
% 原始数据
fs = 1000;
ts = 1/fs;
t=0:ts:0.3;
y=2*sin(2*pi*10*t);% + 5.*sin(2*pi*100*t);
figure
plot(t, y)
title('原始信号')
% 求Hilbert-Huang谱
[A,fh,th] = hhspectrum(y);
figure
subplot(211)
plot(th*ts, A)
title('瞬时幅值') % 就是包络
subplot(212)
plot(th*ts, fh*fs)
title('瞬时频率')
% 显示结果
[im,tt,ff] = toimage(A,fh,th);
disp_hhs(im,tt)
colormap(flipud(gray))
% 编程实现显示
figure
imagesc(tt*ts,[0,0.5*fs],im);
ylabel('frequency/Hz')
set(gca,'YDir','normal')
xlabel('time/s')
title('Hilbert-Huang spectrum')
例子程序
EMD分解如下
N = 2000;% # of data samples
T = 1:4:N;
t = 1:N;
p = N/2;% period of the 2 sinusoidal FM's
% sinusoidal FM 1
fmin1 = 1/64;% min frequency
fmax1 = 1.5*1/8;% max frequency
x1 = fmsin(N,fmin1,fmax1,p,N/2,fmax1);
% sinusoidal FM 1
fmin2 = 1/32;% min frequency
fmax2 = 1.5*1/4;% max frequency
x2 = fmsin(N,fmin2,fmax2,p,N/2,fmax2);
% logon
f0 = 1.5*1/16;% center frequency
x3 = amgauss(N,N/2,N/8).*fmconst(N,f0);
a1 = 1;
a2 = 1;
a3 = 1;
x = real(a1*x1+a2*x2+a3*x3);
x = x/max(abs(x));
[imf,ort,nbits] = emd(x);
emd_visu(x,t,imf,1);
figure(1)
% time-frequency distributions
Nf = 256;% # of frequency bins
Nh = 127;% short-time window length
w = tftb_window(Nh,'Kaiser');
[s,rs] = tfrrsp(x,T,Nf,w,1);
[s,rs1] = tfrrsp(imf(1,:)',T,Nf,w,1);
[s,rs2] = tfrrsp(imf(2,:)',T,Nf,w,1);
[s,rs3] = tfrrsp(imf(3,:)',T,Nf,w,1);
figure(4)
subplot(221)
imagesc(flipud(rs(1:128,:)))
set(gca,'YTick',[]);set(gca,'XTick',[])
xlabel('time')
ylabel('frequency')
title('signal')
pause
subplot(222)
imagesc(flipud(rs1(1:128,:)))
set(gca,'YTick',[]);set(gca,'XTick',[])
xlabel('time')
ylabel('frequency')
title('mode #1')
pause
subplot(223)
imagesc(flipud(rs2(1:128,:)))
set(gca,'YTick',[]);set(gca,'XTick',[])
xlabel('time')
ylabel('frequency')
title('mode #2')
pause
subplot(224)
imagesc(flipud(rs3(1:128,:)))
set(gca,'YTick',[]);set(gca,'XTick',[])
xlabel('time')
ylabel('frequency')
title('mode #3')