matlab在振动信号处理中的应用,关于《matlab在振动信号处理中的应用》

本帖最后由 fyx10319 于 2019-4-11 20:23 编辑

本人正在学习使用正交多项式法拟合频响函数的matlab实现,发现王济老师的《matlab在振动信号处理中的应用》里面的程序运行得不到正确结果,请问该程序是否有错误?能否指导一下如何改正?谢谢!

clear

format long

global mn;

fni=input('输入数据文件名称:','s');

fi=fopen(fni,'r');       %打开输入数据文件

mn=fscanf(fi,'%d',1);    %输入模态阶数

df=fscanf(fi,'%f',1);    %输入频率间隔

fo=fscanf(fi,'%s',1);    %输出文件名称

h=fscanf(fi,'%f',[2,inf]);   %输入实测频响函数实部和虚部

status=fclose(fi);       %关闭文件

nm=mn*2;                %定义频响函数有理分式的阶数

n=length(h(1,:));       %频响函数长度

f=0:df:(n-1)*df;        %定义频率向量

w=[-f(n:-1:1) f(1:n)]/max(f);

H1=[h(1,n:-1:1)-i*h(2,n:-1:1) h(1,1:n)+i*h(2,1:n)];%建立扩展的实测频响函数向量

w=w.';

H1=H1.';

[p,cp]=fun85(H1,w,1,nm);

[q,cq]=fun85(H1,w,2,nm);

for k=1:nm

Q(:,k)=(H1.*q(:,k));

end

P=p;

T=-real(P'*Q);

g=real(P'*(H1.*q(:,nm+1)));

D=-inv(eye(nm)-T'*T)*T'*g;

C=g-T*D;

D(nm+1)=1;

A=cp*C;

B=cq*D;

A=A(nm+1:-1:1).';

B=B(nm+1:-1:1).';

[R,U,K]=residue(A,B);

F1=abs(U)*max(f);

以上是前部分程序,F1得不到正确解。

以下是fun85

if ig==1

W=ones(size(w));

else

W=(abs(H)).^2;

end

R0=zeros(size(w));

R1=ones(size(w))./sqrt(sum(W));

R=[R0,R1];

cf=zeros(m+1,m+2);

cf(1,2)=1/sqrt(sum(W));

for k=1:m

V=sum(w.*R(:,k+1).*R(:,k).*W);

S=w.*R(:,k+1)-V*R(:,k);

D=sqrt(sum((S.^2).*W));

R=[R,S/D];

cf(:,k+2)=-V*cf(:,k);

cf(2:k+1,k+2)=cf(2:k+1,k+2)+cf(1:k,k+1);

cf(:,k+2)=cf(:,k+2)/D;

end

R=R(:,2:m+2);

cf=cf(:,2:m+2);

for k=1:m+1

P(:,k)=R(:,k)*i^(k-1);

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值