当我去信号和系统时,我又上了一堂讨论课。因为提到这个模型生成信号,老师让我用matlab我画了一个类似的词,不多说。下面是我的matlab代码:
其实这个项目的原理也很简单,就是在复平面上模拟方波信号的合成过程。
主要知识有:
- 傅里叶级数
- 合成圆模型
- 复平面上圆产生信号的原理
%制作行星运动模型 clear %设置一些参数 w0=1; %角频率大小 r1=1; 谐波模的大小为% r2=1/3;3%谐波模的大小 r3=1/5;%5次谐波模的大小 r4=1/7;谐波模大小为%7次 r5=1/9;9%谐波模的大小 r6=1/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);运动圆心x坐标3%谐波 yy2=r1*sin(w0*pi*t);运动圆心y坐标3次谐波 x2=xx2 r2*cos(pp);运动圆3次谐波 y2=yy2 r2*sin(pp);运动圆3次谐波 px2=xx2 r2*cos(w0*3*pi*t);点X坐标在%3次谐波圆上 py2=yy2 r2*sin(w0*3*pi*t);点X坐标在%3次谐波圆上 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,yy六、 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/1K6vpvy02ho5oTm_0GS0pMA?pwd=rp5n
: rp5n