〔实例 2.1〕试仿真得出一个幅度调制系统的输入输出波形。设输入被调制信号是一个幅度为 2v,频率为 1000Hz 的馀弦波,调制度为 0.5,调制载波信号是一个幅度为 5v,频率为 10KHz 的馀弦波。所有馀弦波的初相位为 0。
% ch2example1prg1.m
dt=1e-5; % 仿真采样间隔
T=3*1e-3; % 仿真终止时间
t=0:dt:T;
input=2*cos(2*pi*1000*t); % 输入被调信号
carrier=5*cos(2*pi*1e4*t); % 载波
output=(2+0.5*input).*carrier; % 调制输出
% 作图: 观察输入信号, 载波, 以及调制输出
subplot(4,1,1); plot(t,input);xlabel('时间 t');ylabel('被调信号');
subplot(4,1,2); plot(t,carrier);xlabel('时间 t');ylabel('载波');
subplot(4,1,3); plot(t,output);xlabel('时间 t');ylabel('调幅输出');
% 无噪声包络检波及恢复原信号
y = hilbert(output);
am = (abs(y)/5-2)*2;
subplot(4,1,4); plot(t,am);xlabel('时间 t');ylabel('包络检波');axis([0 0.003 -2 2]);
模拟真实示波器显示的调幅仿真波形
程序中故意将输入被调信号的频率设置为1005Hz,这样其信号周期就与仿真的帧周期不是整数倍关系,运行后将看到「不断」滑动的被调信号,载波显示出相位抖动现象,而接收信号则沾染了噪声。
% ch2example1prg3.m
dt=1e-6; % 仿真采样间隔
T=2*1e-3; % 仿真的帧周期
for N=0:500 % 总共仿真的帧数
t=N*T+(0:dt:T); % 帧中的取样时刻
input=2*cos(2*pi*1005*t); % 输入被调信号,将1005改为1000就不会看不到动态图。
carrier=5*cos(2*pi*(1e4)*t+0.1*randn); % 载波
output=(2+0.5*input).*carrier; % 调制输出
noise=randn(size(t)); % 噪声
r=output+noise; % 调制信号通过加性噪声信道
% 作图: 观察输入信号, 载波, 以及调制输出
subplot(3,1,1); plot([0:dt:T],input);xlabel('时间 t');
ylabel('被调信号');text(T*2/3,1.5,['当前帧数: N=',num2str(N)]);
subplot(3,1,2); plot([0:dt:T],carrier);
xlabel('时间 t');ylabel('载波');
subplot(3,1,3); plot([0:dt:T],r);
xlabel('时间 t');ylabel('调幅输出');
set(gcf,'DoubleBuffer','on'); % 双缓冲避免作图闪烁
drawnow;
end
〔实例 2.2〕仿真电容的充电过程。
一个电压源通过电阻与电容串联的网络对电容充电。设 t = 0 为初始时刻(初始时刻之前电路断开,不工作),电压源输出电压 x(t) 为单位阶跃函数,电容两端的电压为 y(t),回路电流为 i(t),并将电压源视为系统输入,电容上的电压视为系统输出。电路的初始状态为 y(0)。图 2.3 给出了电路图和等价的系统模型。
根据题意建立电路方程组
化简得到:
将dy(t)=y(t+dt)-y(t)代入上式得:
微分方程的欧拉算法
% ch2example2prg1.m
dt=1e-5; % 仿真采样间隔
R=1e3; % 电阻值
C=1e-6; % 电容量
T=5*1e-3; % 仿真区间从 -T 到 +T
t=-T:dt:T; % 计算的离散时刻序列
y(1)=0; % 电容电压初始值, 在时间小于零区间将保持不变
% 如果要仿真零输入响应, 可设置 y(1)=1 等非零值.
% ----输入信号设定:可选择: 零输入,阶跃输入,正弦输入,方波输入等----
x=zeros(size(t)); % 初始化输入信号存储矩阵
x=1*(t>=0); % 在0时刻的输入信号跃变为1, 即输入为阶跃信号.
% 如果要仿真零输入响应, 这里可设 x=0 即可
% x=sin(2*pi*1000*t).*(t>=0); % 这是从0时刻开始的1000Hz的正弦信号
% x=square(2*pi*500*t).*(t>=0); % 这是从0时刻开始的500Hz的方波信号
% 仿真开始, 注意: 设零时刻之前电路不工作, 系统状态保持不变
for k=1:length(t)
time=-T+k*dt;
if time>=0
y(k+1)=y(k)+1./(R*C)*(x(k)-y(k))*dt; %递推求解下一个仿真时刻的状态值
else
y(k+1)=y(k); % 在时间小于零时设电路断开,系统不工作
end
end
subplot(2,1,1);plot(t,x(1:length(t)));axis([-T T -1.1 1.1]);
xlabel('t');ylabel('input');
subplot(2,1,2);plot(t,y(1:length(t)));axis([-T T -1.1 1.1]);
xlabel('t');ylabel('output');
来源:CSDN
作者:紫色银杏树
链接:https://blog.csdn.net/qq_37431083/article/details/103948315