本文gif生成参考matlab官方帮助文档
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绘制gif%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 模拟自干扰消除 : 调节 幅度 相位 ,达到 等幅 反相 。
% 其中动态函数为RF参考信号(因为Tx端发射功率大,到达self_Rx有相位幅度偏差)
% 构造一个静止的余弦函数 :y1 = 3*sin(2*x1)
% 在静止的余弦函数基础上,构造动态的余弦函数 y = (8-m(t))*sin(2*x1+p(t))
% 其中 m(t) 表示随时间变化的幅度,8-m(t)表示随时间增大,幅度减小,直到 8-m(t) = 3 与静止信号相同
% 同理 p(t) 表示随时间变化的相位, p(t)随时间递增,直到值为pi(180°反相)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绘制gif%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear all
close all
%初始化自变量长度(4*pi),步长0.1
%n是为了生成动图的索引(index)
x = 0:0.1:4*pi;
n = 0:0.1:5; %生成一个数组n,可在右侧变量区查看
phase = 0:0.1:4*pi %生成一个数组phase,可在右侧变量区查看
nImages = length(n);
fig = figure;
for idx = 1:nImages
x1 = 0:0.1:4*pi
y1 = 3*sin(2*x1) %静止的余弦函数
%条件判断是否达到与静止函数反相,没有达到pi(180°)则继续运行
%达到了就停止增加相位。
%注意 n 我们设置的长度为5,所以迭代结束 8 - 5 = 3 就等于静止函数的幅度
%所以不必写判断调幅的判断
if phase(idx)<pi
y = (8-n(idx)).*sin(2*x+phase(idx)); %动态的余弦函数
% 开始时,n(1) = 0.1 ,phase(0)=0:
% (8-0)*sin(2x+0.1)=8*sin(2*x1)
else
y = (8-n(idx)).*sin(2*x+pi) %相位达到反相(180°)后则等待幅度迭代到8-5 = 3
end
subplot(2,1,1)
plot(x,y,'LineWidth',5)
hold on
plot(x1,y1,'LineWidth',5)
hold off
set(gca,'ylim',[-10,10])
title(['动图y = a(t)*sin(x+p(t)), n = ' num2str( n(idx)) ])
%num2str可以在图形窗显示变化的参数
legend('SR(参考信号)','SOI+SI[接收端]')
drawnow %作图
subplot(2,1,2)
p=y+y1 %两个信号叠加
plot(x,p,'b','LineWidth',5)
set(gca,'ylim',[-10,10])
legend('两个信号叠加后的幅度')
frame = getframe(fig); %一次迭代截取一帧
im{idx} = frame2im(frame); %保存每一帧为了生成gif动图
end
filename = 'UserGif.gif'; %指定生成动图后的图片名字
for idx = 1:nImages
[A,map] = rgb2ind(im{idx},256);
if idx == 1
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.1); %这里可以设置每一帧延迟速度,可加快动图
else
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);
end
end
本文对自干扰消除的模拟并不严谨,只是楼主自己学习后的总结,如有问题请见谅,欢迎指出不足。