连载17:两个旋转向量合成旋转向量的动画
摘自·通信人家园·陈爱军
$$\qquad$$下面动画展示了两个旋转方向相反的向量合成正弦信号的过程。
$$\qquad$$这个动画是通过MATLAB制作并转存为.avi文件完成的。生成动画的过程较为复杂,大约调试了半小时。希望能得到MATLAB专家的进一步指导。谢谢!
$$\qquad$$动画中,横轴表示实数部分,纵轴表示虚数部分。
$$\qquad$$每个向量由一根连杆表示,这些连杆首尾相连,显示向量相加的过程。连杆的末端移动的轨迹展示了合成的信号。
$$\qquad$$每个连杆的初始位置对应于信号的复傅里叶系数。
matlab代码如下:
clear; clf; close all;
% 定义参数
w = 2; % 角频率
t = linspace(0, 2*pi, 200); % 时间向量
% 计算复指数
ejwt = 0.5*exp(1j*w*t); % e^(jwt)的0.5倍
eminusjwt = 0.5*exp(-1j*w*t); % e^(-jwt)的0.5倍
% 合成信号
f = ejwt + eminusjwt; % 合成信号
% 提取实部和虚部
x = real(f); % 实部,即合成的正弦信号
y = imag(f); % 虚部
% 设置视频写入器
v = VideoWriter('sinusoidal_animation.avi');
v.FrameRate = 25; % 设置帧率
open(v);
% 创建绘图窗口
figure;
% 循环创建每一帧动画
for k = 1:length(t)
clf;
subplot(1, 2, 1);
hold on;
axis equal;
xlim([-1, 1]);
ylim([-1, 1]);
% 绘制向量
quiver(0, 0, real(ejwt(k)), imag(ejwt(k)), 'b', 'AutoScale', 'off');
quiver(0, 0, real(eminusjwt(k)), imag(eminusjwt(k)), ...
'r', 'AutoScale', 'off');
quiver(0, 0, real(f(k)), imag(f(k)), 'k', 'AutoScale', 'off');
% 标记
title('Vector Representation');
xlabel('Real');
ylabel('Imaginary');
subplot(1, 2, 2);
plot(t(1:k), x(1:k), 'm');
xlim([0, 2*pi]);
ylim([-1, 1]);
title('Sinusoidal Signal Over Time');
xlabel('Time');
ylabel('Amplitude');
% 获取当前帧
frame = getframe(gcf);
writeVideo(v, frame);
end
% 关闭视频文件
close(v);