w1470852 2024-06-26 16:17 采纳率: 62.5%
浏览 1
已结题

matlab可以把图像数据转换为小波分析吗

如下图所示,目标是用小波变换把下图变换为横坐标为采样点,纵坐标为振幅的形式,原程序见图二图三.请问需要调用哪个函数来实现?万分感谢

img

clear;clc;close all;
t_of_v = @(v)(505.2*log(49897/(55000-398.7*v))*2.3+1460*(12.8-v)/398.7);
finverse = @(t) fzero(@(v) t_of_v(v)-t, 5);
wm_func = @(t)((finverse(t)*3.6)*9550/(3600*0.4064/(0.93*14)))*pi*2/60;
zi=4;%内转子极对数
zo=14;%外转子极对数k
z1=32;%小齿轮齿数
z2=99;%大齿轮齿数
ms=4.62e-3;
I=z2/z1;%机械齿轮速比
G=(zo+zi)/zi;%磁齿轮速比
%一、计算过程
tmax=4.9;
tspan = 0:1e-4:tmax;
bc=1e-4;
y0=[0;0;0;wm_func(0);wm_func(0)/G;wm_func(0)/(G*I)];
[t,y] = ode23(@(t,y)myfun3(t,y,wm_func), tspan, y0);
figure;plot(t,y(:,1)/G-y(:,2));
set(gca,'FontSize',16);
title('时域响应图','FontSize',16);
xlabel('时间 (s)','FontSize',16);
ylabel('扭转振幅(rad)','FontSize',16);%磁齿轮的相对弹性角度
figure;plot(t,y(:,2)/I-y(:,3));
set(gca,'FontSize',16);
title('时域响应图','FontSize',16);
xlabel('时间 (s)','FontSize',16);
ylabel('扭转振幅(rad)','FontSize',16);%机械齿轮的相对弹性转角;
function dydt=myfun3(t,y,wm_func)
wm=wm_func(t);

zi=4;%内转子极对数
zo=14;%外转子极对数
z1=32;%小齿轮齿数
z2=99;%大齿轮齿数
arf0=20/180*pi;%压力角
ms=4.62e-3;
r2=ms*z1/2;%小齿轮分度圆
r3=ms*z2/2;%大齿轮分度圆
rb2=r2*cos(arf0);%小齿轮基圆
rb3=r3*cos(arf0);%大齿轮基圆
I=z2/z1;%机械齿轮速比
G=(zo+zi)/zi;%磁齿轮速比
% Tm=randi([1 135]);
% Tm =(1460*9.8*0.012+1.04*1460*2.67+0.32*2.25*(10+2.67*t*3.6)^2/21.15)*0.4064/(0.93*14);%起步加速
Tm=9550*55/(60*wm/(2*pi));  
% Tm=114.8;
TL=Tm*I*G;%变速器负载
%3 转动惯量
IM=0.081197;%电机转子转动惯量kgm2
I0=0.181197;%磁齿轮低速级转动惯量kgm2
I1=0.013663;%磁齿轮高速级转动惯量kgm2
I2=0.0230596;%机械小齿轮转动惯量
I3=1.9825692;%机械大齿轮转动惯量
IL=21;%整车等效转动惯量

%4 刚度与阻尼
%齿轮的阻尼和刚度
w1=wm*G;%机械小齿轮输入转速
kp=10.51e8;
kb=0.25e8;%两个齿轮的刚度曲线为正弦曲线,
km=kp+kb*sin(w1*t*z1);
sg=0.16;%齿轮阻尼比
cm=2*sg*sqrt(kp*I2*I3/(I2*rb3^2+I3*rb2^2));
 b=1e-4;
 xx=rb2*y(2)-rb3*y(3);
 dxx=rb2*y(5)-rb3*y(6);

  if xx-b>0
      fx=xx-b;
  elseif xx+b<0
      fx=xx+b;
  else
      fx=0;
  end
F23=km*fx+cm*dxx;
T0=1.7*Tm*G;
Tc1=0.1*T0*sin(wm*t);
Tc=0.1*(zi*y(4)-(zi+zo)*y(5));
T21=T0*sin(zi*y(1)-(zi+zo)*y(2))+Tc+Tc1;

y(7)=(Tm-T21/G)/(I0+IM);
y(8)=(T21-r2*F23)/(I2+I1);
y(9)=(-TL+r3*F23)/(I3+IL);

dydt=[y(4)
      y(5)
      y(6)
      y(7)
      y(8)
      y(9)];
end
  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-26 16:17
    关注

    引自免费微信小程序:皆我百晓生

    要将给定的时间序列数据(即时域响应)通过小波变换进行处理并转换成横坐标为采样点,纵坐标为振幅的形式,我们需要利用MATLAB中的wavedec函数来分解信号到不同尺度,并提取每个尺度的特征值。

    首先,我们需要定义一个函数来计算小波系数。在下面的代码示例中,我们使用了waveletCoefficients函数,它接受信号的长度t、信号的初始值y0以及小波函数wm_func作为参数,并返回信号经过小波变换后得到的小波系数。

    function [coeffs] = waveletCoefficients(y0, wm_func, t)
        % 将信号分解到不同尺度
        coeffs = wvd(y0, 'db4', 'level', 1);
        % 计算小波系数
        coeffs = coeffs(1:end-1, :);
    end
    

    接下来,我们将原始信号分解到不同的尺度,并取每种尺度下的最小模成分。然后,我们可以计算这些小波系数的平均值,这将为我们提供振幅信息。

    function [amplitudes] = calculateAmplitudes(coeffs)
        % 计算振幅
        amplitudes = zeros(size(coeffs));
        for i = 1:size(coeffs, 1)
            amplitudes(i) = min(abs(coeffs(i)));
        end
    end
    

    最后,我们可以通过绘制横轴为采样点,纵轴为振幅的图来展示结果。

    function plotWavelets(y0, wm_func, t)
        % 绘制时域响应图
        figure;
        plot(t, abs(y0), '-o');
        
        % 分解信号到不同尺度
        coeffs = waveletCoefficients(y0, wm_func, t);
        
        % 计算振幅
        amplitudes = calculateAmplitudes(coeffs);
        
        % 绘制振幅图
        plot(t, amplitudes);
        set(gca, 'YTick', linspace(min(amplitudes), max(amplitudes), 10));
        xlabel('时间(s)');
        ylabel('振幅(rad)');
        title('小波变换后的时域响应');
    end
    

    这个脚本会创建一个名为plotWavelets的函数,用于显示原始信号、其小波系数以及振幅。根据您的需求,您可以修改这段代码以适应您具体的数据集。如果您有任何其他问题或需要进一步的帮助,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(17条)

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 创建了问题 6月26日