from Vibration Response Spectrum by Tom Irvine
This program calculates the VRS for a base input PSD.

vrs_engine(fi,ai,damp,df);
function[fn,a_vrs,rd_vrs] = vrs_engine(fi,ai,damp,df);
%
    disp(' Calculating VRS.... ')
    disp(' ')
%
	fn(1)=5.;
    oct=1./24.;
    tpi=2.*pi;
    last=length(fi);
%
	for i=1:1000   % natural frequency loop
%
%   absolute acceleration
%    fid = fopen('vrs.dat','w')
%
        sum=0.; 
%
		for j=1:last 
%
		    rho = fi(j)/fn(i);
			tdr=2.*damp*rho;
%
            c1= tdr^ 2.;
			c2= (1.- (rho^2.))^ 2.;
%
			t= (1.+ c1 ) / ( c2 + c1 );
            sum = sum + t*ai(j)*df;
%
%       fprintf(fid,'%9.3g %9.3g %9.3g %9.3g %9.3g %9.3g t=%9.3g ai(j)=%9.3g df=%9.3g sum=%9.3g \n',fi(j),fn(i),rho,tdr,c1,c2,t,ai(j),df,sum);
%       
        end
    a_vrs(i)=sqrt(sum);
%    fclose(fid);           
%
%   relative displacement
%
		sum=0.; 
%
		for j=1:last 
%
            c1= ((fn(i)^2.)-(fi(j)^2.) )^2.;
			c2= ( 2.*damp*fn(i)*fi(j))^2.;
%
			t= 1. / ( c2 + c1 );
%
			if(j==1)
               t=t/2.;
            end   
%
            sum = sum + t*ai(j)*df;
        end
         rd_vrs(i)=sqrt(sum)*386./(tpi^2.);
%
        if(fn(i) > 10000. )
            break;
        end
        if(fn(i) > 2.*fi(last) )
            break;
        end    
     	fn(i+1)=fn(i)*(2.^oct);   
     end

Contact us at files@mathworks.com