Finding the velocity from displacement
    41 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
Hi guys,
I'm trying to model a jump, using simulink I've found the displacement ( height vs. distance), I'm trying to find the velocity and acceleration of the jump. I've tried to use a derivative block, where I've inserted after my transfer block it (between the y displacement and my XY graph). The velocity isn't coming out right, and reducing the size of the step size doesn't seem to be helping.
Could anyone give me any advice?
I can attach the m file or a screenshot if needed.
Thanks
2 Kommentare
Antworten (3)
  Dr. Seis
      
 am 12 Jan. 2012
        This is a function I wrote to convert seismograms from one domain to another:
function dataout =  iomega(datain, dt, datain_type, dataout_type)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%   IOMEGA is a MATLAB script for converting displacement, velocity, or
%   acceleration time-series to either displacement, velocity, or
%   acceleration times-series. The script takes an array of waveform data
%   (datain), transforms into the frequency-domain in order to more easily
%   convert into desired output form, and then converts back into the time
%   domain resulting in output (dataout) that is converted into the desired
%   form.
%
%   Variables:
%   ----------
%   
%   datain       =   input waveform data of type datain_type
%
%   dataout      =   output waveform data of type dataout_type
%
%   dt           =   time increment (units of seconds per sample)
%
%                    1 - Displacement
%   datain_type  =   2 - Velocity
%                    3 - Acceleration
%
%                    1 - Displacement
%   dataout_type =   2 - Velocity
%                    3 - Acceleration
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %   Make sure that datain_type and dataout_type are either 1, 2 or 3
    if (datain_type < 1 || datain_type > 3)
        error('Value for datain_type must be a 1, 2 or 3');
    elseif (dataout_type < 1 || dataout_type > 3)
        error('Value for dataout_type must be a 1, 2 or 3');
    end
    %   Determine Number of points (next power of 2), frequency increment
    %   and Nyquist frequency
    N = 2^nextpow2(max(size(datain)));
    df = 1/(N*dt);
    Nyq = 1/(2*dt);
    %   Save frequency array
    iomega_array = 1i*2*pi*(-Nyq : df : Nyq-df);
    iomega_exp = dataout_type - datain_type;
    %   Pad datain array with zeros (if needed)
    size1 = size(datain,1);
    size2 = size(datain,2);
    if (N-size1 ~= 0 && N-size2 ~= 0)
        if size1 > size2
            datain = vertcat(datain,zeros(N-size1,1));
        else
            datain = horzcat(datain,zeros(1,N-size2));
        end
    end
    %   Transform datain into frequency domain via FFT and shift output (A)
    %   so that zero-frequency amplitude is in the middle of the array 
    %   (instead of the beginning)
    A = fft(datain);
    A = fftshift(A);
    %   Convert datain of type datain_type to type dataout_type
    for j = 1 : N
        if iomega_array(j) ~= 0
            A(j) = A(j) * (iomega_array(j) ^ iomega_exp);
        else
            A(j) = complex(0.0,0.0);
        end
    end
    %   Shift new frequency-amplitude array back to MATLAB format and
    %   transform back into the time domain via the inverse FFT.
    A = ifftshift(A);
    datain = ifft(A);    
    %   Remove zeros that were added to datain in order to pad to next
    %   biggerst power of 2 and return dataout.
    if size1 > size2
        dataout = real(datain(1:size1,size2));
    else
        dataout = real(datain(size1,1:size2));
    end
    return
7 Kommentare
  Sohaib Sulehri
 am 21 Feb. 2018
				Hi x, Can you explain the way you are calibrating and filtering you data. Moreover, which accelerometer are you using?
  MANTHAN SHAH
 am 28 Jun. 2022
				Hello Dr. Seis, Thanks for answering this. I appreciate your efforts towards the community. I am new with  Matlab and working with vibrational data too. I was wondering how to tune the displacement data we get? As the output from this code is completely different from what it supoosed to be.
  Guy Rouleau
    
 am 12 Jan. 2012
        I like to use a filtered derivative to do that.
A transfer function in the form s/(tau*s+1)^2 with the right "tau" will give you something close to "s" for low frequency and close to "1" for high frequency, limiting that spike that you probably see in your model.
You can find some doc on that in the SimMechanics doc:
0 Kommentare
  Dr. Erol Kalkan, P.E.
 am 11 Jul. 2019
        In regards to filtering the seismograms, I developed an automated algorithm: https://www.mathworks.com/matlabcentral/fileexchange/70270-autodetect-bandpass-filter-corner-frequencies?s_tid=prof_contriblnk 
This algorithm finds the corner filter frequencies based on the frequency content. It has been already implemeted to the USGS's PRISM software (https://earthquake.usgs.gov/research/software/prism/). 
0 Kommentare
Siehe auch
Kategorien
				Mehr zu Array and Matrix Mathematics finden Sie in Help Center und File Exchange
			
	Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!