Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations cowski on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

Shock Response Spectrum (SRS) in Matlab

Status
Not open for further replies.

tomirvine

Mechanical
Joined
Jun 14, 2000
Messages
187
Here is an SRS code in Matlab. I have more of these types of programs for shock and vibration, so please let me know if there is an interest.

Tom Irvine

******************************************

disp(' ')
disp(' srs.m ver 1.4 January 31, 2005')
disp(' by Tom Irvine Email: tomirvine@aol.com')
disp(' ')
disp(' This program calculates the shock response spectrum')
disp(' of an acceleration time history, which is pre-loaded into Matlab.')
disp(' The time history must have two columns: time(sec) & acceleration')
disp(' ')
%
clear t;
clear y;
clear yy;
clear n;
clear fn;
clear a1;
clear a2
clear b1;
clear b2;
clear jnum;
clear THM;
clear resp;
clear x_pos;
clear x_neg;
%
iunit=input(' Enter acceleration unit: 1= G 2= m/sec^2 ');
%
disp(' ')
disp(' Select file input method ');
disp(' 1=external ASCII file ');
disp(' 2=file preloaded into Matlab ');
file_choice = input('');
%
if(file_choice==1)
disp(' Enter the input filename ');
filename = input(' ','s');
fid = fopen(filename,'r');
THM = fscanf(fid,'%g %g',[2 inf]);
THM=THM';
else
THM = input(' Enter the matrix name: ');
end
%
t=THM(:,1);
y=THM(:,2);
%
tmx=max(t);
tmi=min(t);
n = length(y);
%
out1 = sprintf('\n %d samples \n',n);
disp(out1)
%
dt=(tmx-tmi)/(n-1);
sr=1./dt;
%
out1 = sprintf(' SR = %g samples/sec dt = %g sec \n',sr,dt);
disp(out1)
%
fn(1)=input(' Enter the starting frequency (Hz) ');
if fn(1)>sr/30.
fn(1)=sr/30.;
end
%
idamp=input(' Enter damping format: 1= damping ratio 2= Q ');
%
disp(' ')
if(idamp==1)
damp=input(' Enter damping ratio (typically 0.05) ');
else
Q=input(' Enter the amplification factor (typically Q=10) ');
damp=1./(2.*Q);
end
%
tmax=(tmx-tmi) + 1./fn(1);
limit = round( tmax/dt );
n=limit;
yy=zeros(1,limit);
for i=1:length(y)
yy(i)=y(i);
end
%
disp(' ')
disp(' Calculating response..... ')
%
% SRS engine
%
for j=1:1000
%
omega=2.*pi*fn(j);
omegad=omega*sqrt(1.-(damp^2));
cosd=cos(omegad*dt);
sind=sin(omegad*dt);
domegadt=damp*omega*dt;
a1(j)=2.*exp(-domegadt)*cosd;
a2(j)=-exp(-2.*domegadt);
b1(j)=2.*domegadt;
b2(j)=omega*dt*exp(-domegadt);
b2(j)=b2(j)*( (omega/omegad)*(1.-2.*(damp^2))*sind -2.*damp*cosd );
%
forward=[ b1(j), b2(j), 0 ];
back =[ 1, -a1(j), -a2(j) ];
%
resp=filter(forward,back,yy);
%
x_pos(j)= max(resp);
x_neg(j)= min(resp);
%
jnum=j;
if fn(j) > sr/8.
break
end
fn(j+1)=fn(1)*(2. ^ (j*(1./12.)));
end
%
% Output options
%
disp(' ')
disp(' Select output option ');
choice=input(' 1=plot only 2=plot & output text file ' );
disp(' ')
%
if choice == 2
disp(' Enter output filename ');
SRS_filename = input(' ','s');
%
fid = fopen(SRS_filename,'w');
for j=1:jnum
fprintf(fid,'%7.2f %10.3f %10.3f \n',fn(j),x_pos(j),abs(x_neg(j)));
end
fclose(fid);
end
%
% Plot SRS
%
disp(' ')
disp(' Plotting output..... ')
%
% Find limits for plot
%
srs_max = max(x_pos);
if max( abs(x_neg) ) > srs_max
srs_max = max( abs(x_neg ));
end
srs_min = min(x_pos);
if min( abs(x_neg) ) < srs_min
srs_min = min( abs(x_neg ));
end
%
figure(1);
plot(fn,x_pos,fn,abs(x_neg),'-.');
%
if iunit==1
ylabel('Peak Accel (G)');
else
ylabel('Peak Accel (m/sec^2)');
end
xlabel('Natural Frequency (Hz)');
Q=1./(2.*damp);
out5 = sprintf(' Acceleration Shock Response Spectrum Q=%g ',Q);
title(out5);
grid;
set(gca,'MinorGridLineStyle','none','GridLineStyle',':','XScale','log','YScale','log');
legend ('positive','negative',2);
%
ymax= 10^(round(log10(srs_max)+0.8));
ymin= 10^(round(log10(srs_min)-0.6));
%
fmax=max(fn);
fmin=fmax/10.;
%
fmax= 10^(round(log10(fmax)+0.5));
%
if fn(1) >= 0.1
fmin=0.1;
end
if fn(1) >= 1
fmin=1;
end
if fn(1) >= 10
fmin=10;
end
if fn(1) >= 100
fmin=100;
end
axis([fmin,fmax,ymin,ymax]);
%
disp(' ')
disp(' Plot pseudo velocity? ');
vchoice=input(' 1=yes 2=no ' );
if(vchoice==1)
figure(2);
%
% Convert to pseudo velocity
%
for j=1:jnum
if iunit==1
x_pos(j)=386.*x_pos(j)/(2.*pi*fn(j));
x_neg(j)=386.*x_neg(j)/(2.*pi*fn(j));
else
x_pos(j)=x_pos(j)/(2.*pi*fn(j));
x_neg(j)=x_neg(j)/(2.*pi*fn(j));
end
end
%
srs_max = max(x_pos);
if max( abs(x_neg) ) > srs_max
srs_max = max( abs(x_neg ));
end
srs_min = min(x_pos);
if min( abs(x_neg) ) < srs_min
srs_min = min( abs(x_neg ));
end
%
plot(fn,x_pos,fn,abs(x_neg),'-.');
%
if iunit==1
ylabel('Velocity (in/sec)');
else
ylabel('Velocity (m/sec)');
end
xlabel('Natural Frequency (Hz)');
Q=1./(2.*damp);
out5 = sprintf(' Pseudo Velocity Shock Response Spectrum Q=%g ',Q);
title(out5);
grid;
set(gca,'MinorGridLineStyle','none','GridLineStyle',':','XScale','log','YScale','log');
legend ('positive','negative',2);
%
ymax= 10^(round(log10(srs_max)+0.8));
ymin= 10^(round(log10(srs_min)-0.6));
%
axis([fmin,fmax,ymin,ymax]);
end
 
I don't understand. What is your question?

M

--
Dr Michael F Platten
 
Tom didn't have question, he was essentially posting the answer to a FAQ, which is probably where it should go.

TTFN
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top