项目动机

在上信号与系统时,再一次讨论课,因为提到了这个模型生成信号,老师就让我用matlab画了一个类似的话不多说,下面是我的matlab代码:

项目原理

本次项目实际上原理也十分的简单,就是在复平面上模拟方波信号的合成过程。

主要用到的知识有:

  1. 傅里叶级数
  2. 合成圆模型
  3. 复平面上的圆产生信号的原理

项目代码

%制作行星运动模型
clear 
%设定一些参数
w0=1; %角频率的大小
r1=1;  %一次谐波的模的大小
r2=1/3;%3次谐波模的大小
r3=1/5;%5次谐波模的大小
r4=1/7;%7次谐波模的大小
r5=1/9;%9次谐波模的大小
r6=1/11;%11次谐波模的大小
pp=0:pi/100:2*pi;


%下面是对图像的一些设置
figure;
title('方波谐波的合成图像');
hold on
axis equal;
axis([-3 8 -3 3]);
xlabel('时间t');
ylabel('合成的信号');
set(gca,'XAxisLocation','origin'); %将x轴的位置设置在y=0处
set(gca,'YAxisLocation','origin'); %将x轴的位置设置在y=0处
set(gca,'linewidth',1);
set(gca,'linewidth',1);
set(gca,'xtick',[]);
set(gca,'ytick',[]);
set(gca, 'Xcolor', [0.8, 0.52, 0.98]);
set(gca, 'Ycolor', [0.8, 0.52, 0.98]);
axis normal
set(gca, 'Position', get(gca, 'OuterPosition') - get(gca, 'TightInset') * [-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1]);
%初始的产生位置
x1=-1+r1*cos(pp);
y1=r1*sin(pp);
plot(x1,y1,'k');
vidObj = VideoWriter('output','MPEG-4');
open(vidObj);
%下面是圆的具体绘制对的过程
for t=0:0.01:8
    %下面是图形的数学原理展示
    %1次的圆形叠加
    xx2=-1+r1*cos(w0*pi*t);%3次谐波的运动圆心x坐标
    yy2=r1*sin(w0*pi*t);%3次谐波的运动圆心y坐标
    x2=xx2+r2*cos(pp);%3次谐波的运动圆
    y2=yy2+r2*sin(pp);%3次谐波的运动圆
    px2=xx2+r2*cos(w0*3*pi*t);%3次谐波圆上的点X坐标
    py2=yy2+r2*sin(w0*3*pi*t);%3次谐波圆上的点X坐标
    h=plot(x2,y2,'k'); %绘制三次谐波的运动圆
    l_0=plot([xx2,-1],[yy2,0],'-k');
    l_2=plot([xx2,px2],[yy2,py2],'-k'); %设置连线

    
    %三个圆叠加
    xx3=xx2+r2*cos(w0*pi*3*t);
    yy3=yy2+r2*sin(w0*pi*3*t);
    x3=xx3+r3*cos(pp);
    y3=yy3+r3*sin(pp);
    px3=xx3+r3*cos(w0*pi*5*t);
    py3=yy3+r3*sin(w0*pi*5*t);
    h_2=plot(x3,y3,'k');
    l_3=plot([xx3,px3],[yy3,py3],'k');
 
    
    %四个圆叠加
    xx4=xx3+r3*cos(w0*pi*5*t);
    yy4=yy3+r3*sin(w0*pi*5*t);
    x4=xx4+r4*cos(pp);
    y4=yy4+r4*sin(pp);
    px4=xx4+r4*cos(w0*pi*5*t);
    py4=yy4+r4*sin(w0*pi*5*t);
    h_3=plot(x4,y4,'k');
    l_4=plot([xx4,px4],[yy4,py4],'k');
    
    
    %五个圆叠加
    xx5=xx4+r4*cos(w0*pi*7*t);
    yy5=yy4+r4*sin(w0*pi*7*t);
    x5=xx5+r5*cos(pp);
    y5=yy5+r5*sin(pp);
    px5=xx5+r5*cos(w0*pi*9*t);
    py5=yy5+r5*sin(w0*pi*9*t);
    h_4=plot(x5,y5,'k');
    l_7=plot([xx5,px5],[yy5,py5],'k');
    
    %六个圆叠加
    xx6=xx5+r5*cos(w0*pi*9*t);
    yy6=yy5+r5*sin(w0*pi*9*t);
    x6=xx6+r6*cos(pp);
    y6=yy6+r6*sin(pp);
    px6=xx6+r6*cos(w0*pi*11*t);
    py6=yy6+r6*sin(w0*pi*11*t);
    h_5=plot(x6,y6,'k');
    l_8=plot([xx6,px6],[yy6,py6],'k');
    plot(xx6,yy6,'.g','Linewidth',1);
    
    
    %最终点到圆心的连线
    l_5=plot([xx6,-1],[yy6,0],'--g','Linewidth',1);
    
    %合成模的y坐标的大小
    l_6=plot([xx6,xx6],[yy6,0],'r','Linewidth',1);
    
    
    %原理图与生成图之间的联系关系
    % h_10=annotation('arrow',[xx6,t],[yy6,yy6]) ;  %建立从点(x(1),y(1))到点(x(2),y(2))的剪头注释对象。
    h_6=plot([xx6,t],[yy6,yy6],'-');
    plot(t,yy6,'.r','Linewidth',1);
    %生成第一张图片写入gif文件中
    if(abs(t-0)<1e-3)
      frame = getframe(gcf);
      frame.cdata = imresize(frame.cdata, [960 1380]); %// 设置视频宽高:H为行数(高),W为列数(宽)
      writeVideo(vidObj,frame);
      frame=getframe(gcf);
      imind=frame2im(frame);
      [imind,cm]=rgb2ind(imind,256);
      imwrite(imind,cm,'简单谐波合成方波.gif','gif','Loopcount',inf,'DelayTime',1e-3);  
    else
      frame = getframe(gcf);
      frame.cdata = imresize(frame.cdata, [960 1380]); %// 设置视频宽高:H为行数(高),W为列数(宽)
      writeVideo(vidObj,frame);
      frame=getframe(gcf);
      imind=frame2im(frame);
      [imind,cm]=rgb2ind(imind,256);
      imwrite(imind,cm,'简单谐波合成方波.gif','gif','WriteMode','append','DelayTime',1e-3);
    end
    %删除之前产生的连线
    delete(h);
    delete(l_0);
    delete(l_2);
    delete(h_2);
    delete(l_3);
    delete(h_3);
    delete(l_4);
    delete(l_5);
    delete(l_6);
    delete(l_7);
    delete(h_4);
    delete(l_8);
    delete(h_5);   
    delete(h_6);  
end
hold off;

close(vidObj);

项目结果

下面是生成的gif文件:

下面是生成的视频:

链接: https://pan.baidu.com/s/16f9S6v8HMnN_5WyTYt6_EQ 提取码: iq6q 复制这段内容后打开百度网盘手机App,操作更方便哦

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐