|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
看了论坛上很多关于测量传递函数的帖子:
具有代表性的:
http://forum.vibunion.com/thread-110984-1-1.html
里面有H1,H2,Hv的程序
我自己找了个例子实现了一下,发现这三个方法均差与互谱除以自谱的方法。
互谱和自谱分别用的是matlab中的psd,csd来做。
有兴趣的可以运行一下:
- %% 传递函数
- clear
- close all
- num=1;
- den=[1 6.2832e+001 9.8696e+004];
- sys=tf(num,den);
- %% 输入
- nfft=1024;
- x=randn(1,nfft);
- fs=1000;
- t=(1:nfft)/fs;
- f1=(0:nfft/2-1)/(nfft/2)*fs/2;
- %% 求输出
- y=lsim(sys,x,t);
- y=y';
复制代码- %% GXF./GXX
- X=fft(x);
- Y=fft(y);
- X=X(1:end/2);
- Y=Y(1:end/2);
- Sxx=X.*conj(X);
- Syx=Y.*conj(X);
- Txy=Syx./Sxx;
- figure;plot(f1,abs(Txy)/max(abs(Txy)));
- ang=angle(Txy);
- for i=1:length(ang)
- if ang(i)<0
- ang(i)=ang(i)+2*pi;
- end
- end
- figure;plot(f1,ang);
复制代码- %% GXF./GXX
- Syy=Y.*conj(Y);
- Sxy=X.*conj(Y);
- Txy=Syy./Sxy;
- figure;plot(f1,abs(Txy)/max(abs(Txy)));
- ang=angle(Txy);
- for i=1:length(ang)
- if ang(i)<0
- ang(i)=ang(i)+2*pi;
- end
- end
- figure;plot(f1,ang);
复制代码- %% Hv
- for ii=1:nfft/2;
- G=[Syy(1,ii),Sxy(1,ii);Syx(1,ii),Sxx(1,ii)];
- [xx,d]=eig(G);
- orig_lambda=diag(d);
- [Y,I]=sort(real(orig_lambda));
- lambda=orig_lambda(I);
- psi=xx(:,I);
- Hv(1,ii)=-psi(2,1)/psi(1,1);
- end;
- Txy=Hv;
- figure;plot(f1,abs(Txy)/max(Txy));
- ang=angle(Txy);
- for i=1:length(ang)
- if ang(i)<0
- ang(i)=ang(i)+2*pi;
- end
- end
- figure;plot(f1,ang);
复制代码- %% PSD 互谱/自谱
- window=gausswin(nfft/4)';
- [Sxx,f1]=psd(x,nfft/4,fs,window);
- [Sxy,f1]=csd(x,y,nfft/4,fs,window);
- Txy=Sxy./Sxx;
- figure;plot(f1,abs(Txy)/max(abs(Txy)));
- ang=angle(Txy);
- for i=1:length(ang)
- if ang(i)<0
- ang(i)=ang(i)+2*pi;
- end
- end
- figure;plot(f1,ang);
复制代码
|
评分
-
2
查看全部评分
-
|