- clear
- clc
- close all hidden
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- fni=input('生成人工地震波-输入数据文件名(20041012):','s');
- fid=fopen(fni,'r');
- fs=fscanf(fid,'%f',1);%采样频率
- tu=fscanf(fid,'%f',1);
- %上升时间包络线线形(1-直线、2-抛物线、3-指数曲线)
- iu=fscanf(fid,'%f',1);
- cu=fscanf(fid,'%f',1);
- ta=fscanf(fid,'%f',1);%持时时间长度
- td=fscanf(fid,'%f',1);%下降时间长度
- id= fscanf(fid,'%f',1);
- cd=fscanf(fid,'%f',1);
- dp=fscanf(fid,'%f',1);%阴尼比值
- p=fscanf(fid,'%f',1);%概率系数(一般可取P=0.85)
- nn=fscanf(fid,'%f',1);%迭代次数
- fno=fscanf(fid,'%f',1);%输出数据文件名
- x=fscanf(fid,'%f',[2,inf]);%反应谱频率和幅值数据
- tatus=fclose(fid);
- tl=tu+ta+td;
- nt=round(fs*tl+1);
- nfft=2^nestpow2(nt)
- %计算频率间隔(Hz)
- df=fs/nfft
- %定义反应谱的离散频率向量
- f=0:df:(nfft/2-1)*df
- %计算时间间隔(s)
- dt=1/fs;
- %定义的离散时间向量
- t=0:dt:(nt-1)*dt
- %生成0到2PI的随机数为随机相位
- g=rand(1,nfft/s)*2*pi;
- en=ones(1,nt);
- l=round(tu*fs)+1
- switch iu
- case 1 %直线
- en(1:l)=linspace(0,1,1);% y = linspace(a,b,n) generates a row vector y of n points linearly
- spaced between and including a and b.
- case 2 %抛物线
- a=0:l-1;
- en(1:l)=(a/(l-1)).^2;
- case 3 %指数曲线
- a=0:l-1;
- en(1:l)=1-exp(-cu*a/(l-1));
- end
- m=round((tu+ta)*fs)+1;
- switch id
- case 1 %直线
- en(m:nt)=linspace(1,0,nt-m+1);
- case 2 %抛物线
- a=0:nt-m;
- en(m:nt)=1-cd*(a/(nt-m)).^2;
- case 3 %指数曲线
- a=0:nt-m;
- en(m:nt)=exp(-cd*a/(nt-m));
- end
- a0=zeros(x(1,:));
- n=length(x(1,:));
- nb=round(x(1,n)/df)+1;
- for k=1:n-1
- l=round(x(1,K)/df)+1;
- m=round(x(1,K+1)/df)+1;
- a0(1:m)=linspace(x(2,k),x(2,k+1),m-l+1)
- end
- a1=a0;
- s=zeros(1,nfft/2);
- k=nb:ne;
- s(k)=2*dp/(pi.*(a1(k).^2)./f(k)./(-2*log(-log(p)*pi/tl)./f(k)));
- %将功率谱转换成傅里叶幅值谱
- b1=sqrt(4*df*s)*nfft/2;
- hf=zeros(ne,nfft);
- for j-0:ne-1
- w=2*pi*df*j
- wd=w*sqrt(1-dp*dp);
- e=exp(-t.*W*dp);
- a=t.*wd;
- s=sin(a)>*((1-2*dp*dp)/(1-dp*dp));
- c=cos(a).*(2*dp/sqrt(1-dp*dp));
- h=wd*e.*(s+c)/fs;
- hf(j+1,:)=fft(h,nfft);
- end
- mm=nn
- for k=1:100
- c=b1.*exp(i*g);
- d=[c,c(nfft/2:-1:1)];
- e=ifft(d,nfft);
- y=en.*real(e(1:nt));
- yf=fft(y,nfft);
- for j=1:ne
- d=ifft(yf.*hf(j,:),nfft);
- al(j)=max(real(d(1:nt)));
- end
- if k==mm
- subplot(2,1,1);
- plot(t,y,t,en,t,-en);
- xlabel('时间(s)');
- ylabel('加速度(g)');
- grid on
- sublpot(2,1,2);
- l=1:ne
- plot(f(l),a0(l),':'f(l),a1(l));
- xlabel('频率(Hz)');
- ylabel('加速度(g)');
- legend('目标谱','计算谱');
- grid on;
- ig=input('继续迭代次数[取值1-9,否则退出]:');
- if ig>0&ig<10 %如果输入数字是1-9
- mm=mm+ig
- else
- break;
- end
- end
- c=bl
- j=nb:ne;
- bl(j)=c(j).*a0(j)./a1(j);
- end
- fid=fopen(fno,'W');
- for K=1:nt
- fprintf(fid,'%f%f\n',t(k),y(k));
- end
- status=fclose(fid);
复制代码
|