test.m文件

clc

clear all

close all

% [x, Fs] = wavread('Hum.wav');

% Ts = 1/Fs;

% x = x(1:6000);

Ts = 0.001;

Fs = 1/Ts;

t=0:Ts:1;

x = sin(2*pi*10*t) + sin(2*pi*50*t) + sin(2*pi*100*t) + 0.1*randn(1, length(t));%函数randn:产生正态分布的随机数或矩阵的函数

imf = emd(x);

plot_hht(x,imf,1/Fs);

k = 4;

y = imf{k};

N = length(y);

t = 0:Ts:Ts*(N-1);

[yenvelope, yfreq, yh, yangle] = HilbertAnalysis(y, 1/Fs);

yModulate = y./yenvelope;

[YMf, f] = FFTAnalysis(yModulate, Ts);

Yf = FFTAnalysis(y, Ts);

figure

subplot(321)

plot(t, y)

title(sprintf('IMF%d', k))

xlabel('Time/s')

ylabel(sprintf('IMF%d', k));

subplot(322)

plot(f, Yf)

title(sprintf('IMF%d的频谱', k))

xlabel('f/Hz')

ylabel('|IMF(f)|');

subplot(323)

plot(t, yenvelope)

title(sprintf('IMF%d的包络', k))

xlabel('Time/s')

ylabel('envelope');

subplot(324)

plot(t(1:end-1), yfreq)

title(sprintf('IMF%d的瞬时频率', k))

xlabel('Time/s')

ylabel('Frequency/Hz');

subplot(325)

plot(t, yModulate)

title(sprintf('IMF%d的调制信号', k))

xlabel('Time/s')

ylabel('modulation');

subplot(326)

plot(f, YMf)

title(sprintf('IMF%d调制信号的频谱', k))

xlabel('f/Hz')

ylabel('|YMf(f)|');

findpeaks.m文件

function n = findpeaks(x)

% Find peaks. 找极大值点,返回对应极大值点的坐标

n    = find(diff(diff(x) > 0) < 0); % 相当于找二阶导小于0的点

u    = find(x(n+1) > x(n));

n(u) = n(u)+1;                      % 加1才真正对应极大值点

% 图形解释上述过程

% figure

% subplot(611)

% x = x(1:100);

% plot(x, '-o')

% grid on

%

% subplot(612)

% plot(1.5:length(x), diff(x) > 0, '-o')

% grid on

% axis([1,length(x),-0.5,1.5])

%

% subplot(613)

% plot(2:length(x)-1, diff(diff(x) > 0), '-o')

% grid on

% axis([1,length(x),-1.5,1.5])

%

% subplot(614)

% plot(2:length(x)-1, diff(diff(x) > 0)<0, '-o')

% grid on

% axis([1,length(x),-1.5,1.5])

%

% n    = find(diff(diff(x) > 0) < 0);

% subplot(615)

% plot(n, ones(size(n)), 'o')

% grid on

% axis([1,length(x),0,2])

%

% u    = find(x(n+1) > x(n));

% n(u) = n(u)+1;

% subplot(616)

% plot(n, ones(size(n)), 'o')

% grid on

% axis([1,length(x),0,2])

plot_hht.m文件

function plot_hht(x,imf,Ts)

% Plot the HHT.

% :: Syntax

%    The array x is the input signal and Ts is the sampling period.

%    Example on use: [x,Fs] = wavread('Hum.wav');

%                    plot_hht(x(1:6000),1/Fs);

% Func : emd

% imf = emd(x);

for k = 1:length(imf)

b(k) = sum(imf{k}.*imf{k});

th   = unwrap(angle(hilbert(imf{k})));  % 相位

d{k} = diff(th)/Ts/(2*pi);          % 瞬时频率

end

[u,v] = sort(-b);

b     = 1-b/max(b);                     % 后面绘图的亮度控制

% Hilbert瞬时频率图

N = length(x);

c = linspace(0,(N-2)*Ts,N-1);           % 0:Ts:Ts*(N-2)

for k = v(1:2)                          % 显示能量最大的两个IMF的瞬时频率

figure

plot(c,d{k});

xlim([0 c(end)]);

ylim([0 1/2/Ts]);

xlabel('Time/s')

ylabel('Frequency/Hz');

title(sprintf('IMF%d', k))

end

% 显示各IMF

M = length(imf);

N = length(x);

c = linspace(0,(N-1)*Ts,N);             % 0:Ts:Ts*(N-1)

for k1 = 0:4:M-1

figure

for k2 = 1:min(4,M-k1)

subplot(4,2,2*k2-1)

plot(c,imf{k1+k2})

set(gca,'FontSize',8,'XLim',[0 c(end)]);

title(sprintf('第%d个IMF', k1+k2))

xlabel('Time/s')

ylabel(sprintf('IMF%d', k1+k2));

subplot(4,2,2*k2)

[yf, f] = FFTAnalysis(imf{k1+k2}, Ts);

plot(f, yf)

title(sprintf('第%d个IMF的频谱', k1+k2))

xlabel('f/Hz')

ylabel('|IMF(f)|');

end

end

figure

subplot(211)

plot(c,x)

set(gca,'FontSize',8,'XLim',[0 c(end)]);

title('原始信号')

xlabel('Time/s')

ylabel('Origin');

subplot(212)

[Yf, f] = FFTAnalysis(x, Ts);

plot(f, Yf)

title('原始信号的频谱')

xlabel('f/Hz')

ylabel('|Y(f)|');

emd.m文件

function imf = emd(x)

% Empiricial Mode Decomposition (Hilbert-Huang Transform)

% EMD分解或HHT变换

% 返回值为cell类型,依次为一次IMF、二次IMF、...、最后残差

x   = transpose(x(:));%TRANSPOSE函数可返回转置单元格区域,即将行单元格区域转置成列单元格区域

imf = [];

while ~ismonotonic(x) %当x不是单调函数,分解终止条件

x1 = x;

sd = Inf;%均值

%直到x1满足IMF条件,得c1

while (sd > 0.1) || ~isimf(x1) %当标准偏差系数sd大于0.1或x1不是固有模态函数时,分量终止条件

s1 = getspline(x1);         % 极大值点样条曲线

s2 = -getspline(-x1);       % 极小值点样条曲线

x2 = x1-(s1+s2)/2;

sd = sum((x1-x2).^2)/sum(x1.^2);

x1 = x2;

end

imf{end+1} = x1;

x          = x-x1;

end

imf{end+1} = x;

% 是否单调

function u = ismonotonic(x)

%u=0表示x不是单调函数,u=1表示x为单调的

u1 = length(findpeaks(x))*length(findpeaks(-x));

if u1 > 0

u = 0;

else

u = 1;

End

% 是否IMF分量

function u = isimf(x)

%u=0表示x不是固有模式函数,u=1表示x是固有模式函数

N  = length(x);

u1 = sum(x(1:N-1).*x(2:N) < 0);                     % 过零点的个数

u2 = length(findpeaks(x))+length(findpeaks(-x));    % 极值点的个数

if abs(u1-u2) > 1

u = 0;

else

u = 1;

End

% 据极大值点构造样条曲线

function s = getspline(x)

N = length(x);

p = findpeaks(x);

s = spline([0 p N+1],[0 x(p) 0],1:N);

FFTAnalysis.m文件

% 频谱分析

function [Y, f] = FFTAnalysis(y, Ts)

Fs = 1/Ts;

L = length(y);

NFFT = 2^nextpow2(L);

y = y - mean(y);

Y = fft(y, NFFT)/L;

Y = 2*abs(Y(1:NFFT/2+1));

f = Fs/2*linspace(0, 1, NFFT/2+1);

end

HilbertAnalysis.m文件

% Hilbert分析

function [yenvelope, yf, yh, yangle] = HilbertAnalysis(y, Ts)

yh = hilbert(y);

yenvelope = abs(yh);                % 包络

yangle = unwrap(angle(yh));         % 相位

yf = diff(yangle)/2/pi/Ts;          % 瞬时频率

end

matlab emd x,EMD程序解释相关推荐

  1. matlab怎么求imf图,MATLAB中提取EMD分解后的每个IMF图像,并导出每个IMF数据

    题目: MATLAB中提取EMD分解后的每个IMF图像,并导出每个IMF数据 EMD分解程序我就不给了,网上都是一样的. 例: M = length(imf); N = length(x); c = ...

  2. 【Python】这篇文章能让你明白经验模态分解(EMD)——EMD在python中的实现方法

    暂时打断一下滤波专题,插播一条EMD在python中实现方法的文章. 本篇是Mr.看海:这篇文章能让你明白经验模态分解(EMD)--EMD在MATLAB中的实现方法的姊妹篇,也就是要在python中实 ...

  3. MATLAB工具箱,应用程序,软件和资源的精选清单

    精选的MATLAB工具箱,应用程序,软件和资源的精选清单. # Awesome MATLAB [![Awesome](https://cdn.rawgit.com/sindresorhus/aweso ...

  4. matlab绘制频散曲线,Matlab绘制频散曲线程序代码.docx

    Matlab绘制频散曲线程序代码.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...

  5. matlab有意思程序,matlab有意思的小程序

    10个C++趣味小程序,很有意思的.VIP专享文档 VIP专享文档是百度文库认... 现在很多人使用微信的时间已经非常长了,他们注册的微信号往上可能已经是5年前的事情了,正是由于不少使用者在这个过程当 ...

  6. java的解释程序_JAVA改错和程序解释

    JAVA改错和程序解释 这是我看书打的,,但运行时有个错误....说符号找不到是什么原因..另外判断秒针,分针,时针位置是怎么算来的,,看不懂,,希望明白的解释下 import java.awt.*; ...

  7. dmc matlab程序,matlab编的DMC程序.doc

    matlab编的DMC程序 clear all; % close all; %系统模型建立 num=[0.8]; den=[225 1]; [a,b,c,d]=tf2ss(num,den); % st ...

  8. 精馏塔matlab,MATLAB图解精馏塔理论塔板数程序代码

    <MATLAB图解精馏塔理论塔板数程序代码>由会员分享,可在线阅读,更多相关<MATLAB图解精馏塔理论塔板数程序代码(6页珍藏版)>请在人人文库网上搜索. 1.MATLAB图 ...

  9. 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt

    基于MATLAB的车牌识别程序详解 自定义一个字符函数,用来从车牌区域中提取出7个字符,其中利用切割函数来进行切割. 程序:function [word,result]=getword(d) word ...

最新文章

  1. 火爆 GitHub!这个图像分割神器究竟有什么魅力?
  2. Java - 从文件压缩聊一聊I/O一二事
  3. 漫话:如何给女朋友解释什么是HTTP
  4. 安装qgis显示python错误_ArcGIS 与 QGIS 3 冲突的解决方案
  5. JAVA多线程之扩展ThreadPoolExecutor
  6. python怎么重命名word文件,Python读取word文本操作详解
  7. MySQL 基础 ———— 子查询
  8. 子div用了float浮动之后,如何撑开父元素,让父元素div自动适应高度的问题
  9. 机器学习:单变量线性回归及梯度下降
  10. 股票大作手操盘术---择时
  11. 10-Little prince's trip to Java-奇数魔方阵
  12. OTA升级常见问题及流程
  13. 【微信小程序】实现简单轮播图效果
  14. 基于JAVA银创科技有限公司人事信息系统计算机毕业设计源码+系统+数据库+lw文档+部署
  15. (转)走进全球CTA领导者:元盛资本(Winton CapitalManagement)
  16. 成功解决:fatal: detected dubious ownership in repository at ‘E:/workspace/CSMarket‘。如何使用git工具通过命令行的形式
  17. Heap的讲解 - 介绍
  18. NCQ与TCQ的区别及测试比较
  19. sql语句insert插入函数如果values值括号里放变量名
  20. javascript事件侦听器是什么东西,用来干哈子

热门文章

  1. 可自定义的vue下拉框组件
  2. UEFI 里的 IGD Minimum Memory 和 IGD Aperture Size
  3. java计算机毕业设计竞赛信息发布及组队系统源程序+mysql+系统+lw文档+远程调试
  4. doe五步法_【准则讲解之IFRS15】第贰章 五步法之贰识别P.O.(一)
  5. c++中的引用,默认参数,占位参数
  6. UG NX 12 基准平面
  7. 使用 swift3.0高仿新浪微博
  8. 2.9寸黑白红电子标签【蓝牙版】
  9. 感受日本——之电车篇
  10. IMP-00038: Could not convert to environment character set's handle