Frequency Response Function (FRF) Dr Michael Sek FREQUENCY RESPONSE FUNCTION (FRF) The concept of Frequency Response Function (Figure 1) is at the foundation of modern experimental system analysis. A linear system such as an SDOF or an MDOF, when subjected to sinusoidal excitation, will respond sinusoidally at the same frequency and at specific amplitude that is characteristic to the frequency of excitation. The phase of the response, in general case, will be different than that of the excitation. The phase difference between the response and the excitation will vary with frequency. The system does not need to be excited at one frequency at the time. The same applies if the system is subjected to a broadband excitation comprising a blend of many sinusoids at any given time, such as in the white noise (Gaussian random excitation) or an impulse. It is obvious that, in order to find how the system responds at various frequencies, the excitation and the response signals must be subjected to the DFT. The characteristics of a system that describe its response to excitation as the function of frequency is the Frequency Response Function H(f) defined as the ratio of the complex spectrum of the response to the complex spectrum of the excitation. The spectra are raw (unfolded two-sided). H( f ) = X( f ) F( f ) The H(f) is a spectrum whose magnitude |H| is the ratio of |X| / |F| and the phase φH = φX - φF . Figure 2 shows an example of experimental setup. Figure 1 Concept of Frequency Response Function (Brüel&Kjær "Structural Testing") Figure 2 Car body undergoing testing to acquire its FRFs (Brüel&Kjær "Structural Testing") 1 Frequency Response Function (FRF) Dr Michael Sek VIRTUAL EXPERIMENT TO MEASURE THE FREQUENCY RESPONSE FUNCTION Let's find the FRF of a system in a virtual experiment. For this purpose let's use the SDOF system (m=100kg, c=1000N/(m/s), k=1e6N/m) studied in the module "ORDINARY DIFFERENTIAL EQUATIONS. VIBRATIONS OF SINGLE DEGREE OF FREEDOM (SDOF) SYSTEM". We use the simulation model as a virtual system, pretending that we do not know much about it, as the faded section of Figure 3 indicates. As in the real experiment, we will obtain the "experimental" data from the oscilloscope "Scope1". We need to enable the scope's storage feature. Since the Scope1 has multiple inputs connected to it we choose the format "Structure with time" as shown in Figure 4. After running the model once we can check field names in the structure ScopeData1. 2 VIRTUAL SYSTEM Figure 3 Virtual experimental setup to acquire the data for the FRF of a system >> ScopeData1 ScopeData1 = time: [2048x1 double] signals: [1x4 struct] blockName: 'SDOF/Scope1' >> ScopeData1.signals ans = 1x4 struct array with fields: values dimensions label title plotStyle Figure 4 Data history settings for Scope1 and field names in the structure ScopeData1 It is obvious that, following the order of connections to Scope1, the essential "measurements" are accessible in the structure ScopeData1 as shown Time ScopeData1.time Excitation Force ScopeData1.signals(1).values Response Acceleration ScopeData1.signals(2).values Response Velocity ScopeData1.signals(3).values Response Displacement ScopeData1.signals(4).values 2 Frequency Response Function (FRF) Dr Michael Sek Simulation Parameters block is setup as shown in Figure 5. Note that "Save to workspace" items are ticked-off since the data is returned via Scope1. The variables dt and tmax control the sampling interval and the duration of the virtual experiment which resembles the real situation. Figure 5 Settings of Simulation Parameters block Random Excitation The variable Fmax controls the maximum excitation. Variance in the Random Number block refers to the squared standard deviation σ. The normal random signal only rarely exceeds 3σ. The entered expression for the variance will cause the maximum instantaneous force to be close enough to Fmax. Figure 6 Settings of Random Number block The FRFs can be found for any parameter that describes the response of the system, i.e. acceleration, velocity and displacement. Figure 8 shows the results for random excitation obtained with the code shown in the Appendix. The resonance is near 15Hz. The curves look noisy. Random excitation requires longer sample time and averaging. Note that the scaling and multiplication by 2 are not required for the folding of H(f) since H(f) is the ratio. Impact Excitation Better results are obtained with an impact excitation (see Figure 9). In the model it can be achieved with the Pulse Generator set up as shown in Figure 7. Pulse duration is expressed in multiples of dt. 3 Frequency Response Function (FRF) Dr Michael Sek Figure 7 Settings of Pulse Generator block to produce an impact Figure 8 Excitation and responses of the system under test (random excitation) and the corresponding FRFs 4 Frequency Response Function (FRF) Dr Michael Sek Figure 9 Excitation and responses of the system under test (impact excitation) and the corresponding FRFs Identification (Recovery) of System's Parameters from its FRF FRFs allow to recover the "unknown" parameters of the system. • • • The value of Ha at large frequency approximately equals 1/mass. The value of Hx at near-zero frequency approximates 1/stiffness coefficient. The width of Hv is proportional to the damping. Using the results in Figure 9: • mass m= 1 / 0.01 = 100 kg • stiffness coefficient k= 1 / 0.1e-5 = 1e6 N/m The results match the values used for the simulation. 5 Frequency Response Function (FRF) Dr Michael Sek APPENDIX AN EXAMPLE OF A FUNCTION USED TO GENERATE A HARMONIC SIGNAL 6 Frequency Response Function (FRF) Dr Michael Sek IMPLEMENTATION OF THE FOLDING ALGORITHM sFreq = 8000; nPts = 2048; g= ?????; %obtain the signal df = sFreq/nPts; fNyquist = sFreq / 2; spec = fft(g, nPts); spec = spec(1:nPts/2+1); spec = spec / nPts; spec(2:end) = 2 * spec(2:end); mag = abs(spec); phase = atan(imag(spec)./real(spec)); or phase = angle(spec); freq = linspace(0, fNyquist, nPts/2+1)'; or freq = [0: nPts/2]' * df; plot(freq, mag) plot(freq, phase); 7 Frequency Response Function (FRF) Dr Michael Sek The code used to obtain the FRFs of the system in Figure 3 and produce Figure 8 and Figure 9. %SDOF start up m=100; k=1e6; %f0 = 1/(2*pi)*sqrt(k/m) %c0 = 2*sqrt(k*m) c=1000; %zeta = c/c0 %initial conditions xdot0=0; x0=0; samplingFrequency = 200; dt = 1/samplingFrequency; FFTsize = 2048; tmax = (FFTsize-1)*dt; Fmax = 1000; pulseDuration = 5*dt; SDOF %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 %THIS SECTION USES ScopeData (Structure with time) % Time...... ScopeData1.time % Excitation Force ScopeData1.signals(1).values % Response Acceleration ScopeData1.signals(2).values % Response Velocity ScopeData1.signals(3).values % Response Displacement ScopeData1.signals(4).values sim('SDOF'); %plotting the results figure subplot(4,1,1) plot(ScopeData1.time,ScopeData1.signals(1).values) title('Excitation') ylabel('Force [N]') grid on subplot(4,1,2) plot(ScopeData1.time,ScopeData1.signals(2).values) ylabel('Accel [m/s^2]') grid on subplot(4,1,3) plot(ScopeData1.time,ScopeData1.signals(3).values) ylabel('Vel [m/s]') grid on subplot(4,1,4) plot(ScopeData1.time,ScopeData1.signals(4).values) ylabel('Disp [m]') xlabel('Time [s]') grid on %Calculating FRFs F = fft(ScopeData1.signals(1).values); A = fft(ScopeData1.signals(2).values); V = fft(ScopeData1.signals(3).values); X = fft(ScopeData1.signals(4).values); Ha = A ./ F; Hv = V ./ F; Hx = X ./ F; %Folded frequency axis df = samplingFrequency/FFTsize; freq = [0:FFTsize/2]'*df; 8 Frequency Response Function (FRF) Dr Michael Sek %folding Ha = Ha(1:FFTsize/2+1); %No need to scale since H's are the ratio HaMag = abs(Ha); figure subplot(3,1,1) plot(freq, HaMag) ylabel('FRF H_a[(m/s^2)/N]') xlabel('Frequency [Hz]') grid on [HaMax,idx] = max(HaMag); fResonance = freq(idx); title(sprintf('Max=%.2e(m/s^2)/N @ %.2fHz',HaMax,fResonance)) Hv = Hv(1:FFTsize/2+1); HvMag = abs(Hv); subplot(3,1,2) plot(freq, HvMag) ylabel('FRF H_v[(m/s)/N]') xlabel('Frequency [Hz]') grid on [HvMax,idx] = max(HvMag); fResonance = freq(idx); title(sprintf('Max=%.2e(m/s)/N @ %.2fHz',HvMax,fResonance)) Hx = Hx(1:FFTsize/2+1); HxMag = abs(Hx); subplot(3,1,3) plot(freq, HxMag) ylabel('FRF H_x[m/N]') xlabel('Frequency [Hz]') grid on [HxMax,idx] = max(HxMag); fResonance = freq(idx); title(sprintf('Max=%.2em/N @ %.2fHz',HxMax,fResonance)) 9