详细注释上一段代码
时间: 2024-02-19 07:03:37 浏览: 19
以下是对上一段代码的详细注释:
```
clear all; close all; % 清空变量和关闭所有图形窗口
ts=0.001; % 采样时间
a=25; b=133; c=10; % 传递函数的系数
sys=tf(b,[1,a,c]); % 构建传递函数模型
dsys=c2d(sys,ts,'z'); % 零阶保持法去离散化对象
[num,den]=tfdata(dsys,'v'); % 将离散化的传递函数模型处理为向量形式
Am=0.5; % 正弦信号的幅值
kk=0; % 计数器
for F=1:0.5:10 % 循环不同频率的正弦信号
kk=kk+1;
FF(kk)=F; % 记录频率
u_1=0.0; u_2=0.0; y_1=0; y_2=0; % 初始化输入输出变量
for k=1:1:20000
time(k)=k*ts; % 记录时间
u(k)=Am*sin(1*2*pi*F*k*ts); % 生成正弦信号
y(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; % 通过离散化的传递函数模型计算输出信号
u_2=u_1; u_1=u(k);
y_2=y_1; y_1=y(k);
end
plot(time,u,'r',time,y,'b'); % 绘制输入输出曲线
pause(0.2); % 暂停一段时间
for i=10001:1:15000
fai(1,i-10000) = sin(2*pi*F*i*ts); % 计算正弦函数值
fai(2,i-10000) = cos(2*pi*F*i*ts);
end
Fai=fai'; % 转置矩阵
fai_in(kk)=0; % 初始化输入相位
Y_out=y(10001:1:15000)'; % 截取输出信号的一段时间
cout=inv(Fai'*Fai)*Fai'*Y_out; % 通过最小二乘法计算幅度和相位
fai_out(kk)=atan(cout(2)/cout(1)); % 计算相位
if fai_out(kk)>0 % 处理相位为正的情况
fai_out(kk)=fai_out(kk)-pi;
end
Af(kk)=sqrt(cout(1)^2+cout(2)^2); % 计算幅度
mag_e(kk)=20*log10(Af(kk)/Am); % 计算幅度响应,单位为dB
ph_e(kk)=(fai_out(kk)-fai_in(kk))*180/pi; % 计算相位响应,单位为度
if ph_e(kk)>0 % 处理相位为正的情况
ph_e(kk)=ph_e(kk)-360;
end
end
FF=FF'; % 转置矩阵
%%%%%%%%%%%%%%% Closed system modelling
mag_e1=Af'/Am; % 将幅度响应从dB转换为实际值
ph_e1=fai_out'-fai_in'; % 将相位响应从度转换为弧度
hp=mag_e1.*(cos(ph_e1)+j*sin(ph_e1)); % 计算实际频率响应向量
na=2; % 二阶传递函数
nb=0;
w=2*pi*FF; % 将频率从Hz转换为rad/s
[bb,aa]=invfreqs(hp,w,nb,na); % 使用最小二乘法计算传递函数的分子和分母系数
G=tf(bb,aa); % 构建估计的传递函数模型
figure(1); bode(sys,'r',G,'k:'); % 绘制原始传递函数和估计传递函数的幅频响应曲线
legend('practical model','estimate model');
```
希望对你有所帮助!