如何用matlab编写基于瞬时源模型涌现曲线

如何用matlab编写基于瞬时源模型涌现曲线,第1张

Matlab求瞬时频率(基于EMD)

对序列x(t),已经作emd得到各阶imf,现求各阶IMF瞬间频率,根据HHT定义,z=hilbert(imf(1:20,:));%对前20阶imf作HHT

tA=abs(z);%求瞬时幅值

Theta=angle(z);%求瞬时相位

tf=diff(Theta)/(2pi);%对瞬时相位求导得瞬时频率,(有归一化现象)

但是 theta求出后范围是 -pi-----pi 有很多负值,导致求导后频率也出现很多负值,没有意义,本人一直在纠结是否应该限制theta范围,如何限制?

或有高手直接给新程序,求得各阶imf的正确瞬时频率!!!

Python调用Matlab实现混合编程

>

emdm文件

function imf = emd(x)

% Empiricial Mode Decomposition (Hilbert-Huang Transform)

% EMD分解或HHT变换

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

x = transpose(x(:));

imf = [];

while ~ismonotonic(x)

x1 = x;

sd = Inf;

while (sd > 01) || ~isimf(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)

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

if u1 > 0

u = 0;

else

u = 1;

end

% 是否IMF分量

function u = isimf(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);

这是对信号进行分解的程序,看看对你有没有帮助

问题找到了,f_final和t_final不同,自己骗了自己哦!改成一样的即可。

该谦虚就谦虚,该细心就得细心,这个问题与菜鸟无关,要自信噢!

放在一个程序里也可以,以下程序是通的:

function hh

t0=0;t_final=20;

x0=[0;0362;0;0362];

[t,x]=ode45(@sys,[t0,t_final],x0);

plot(t,x)

function xdot=sys(t,x)

xdot=[x(2);

-048849789(x(1)-x(3))+002811192(x(2)-x(4));

x(4);

-x(3)+010060126(x(1)-x(3))+000579(x(2)-x(4))-0006975824x(4)];

以上就是关于如何用matlab编写基于瞬时源模型涌现曲线全部的内容,包括:如何用matlab编写基于瞬时源模型涌现曲线、如何实现python与matlab连接、对图像进行emd分解程序得到各个imf分量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9738850.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存