How to get mobility from velocity and force
4 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Dear all,
I have a data of velocity (get from accelerometer) and force data (get from hammer). Now, I need to get mobility from them. I already know that mobility=velocity/force. But I don't know how code it. I just begin learning about signal processing for a week.
Thank you all in advance.
0 Commenti
Risposta accettata
Joe
il 10 Ago 2015
Modificato: Joe
il 10 Ago 2015
I have a background in structural dynamics, not soil mechanics, but this test looks similar enough. You have measurements of acceleration (NOT velocity, unless your accelerometer is doing something it shouldn't) and force in the time domain. You want to get a mobility measurement in the frequency domain. The basic steps you have to follow are:
1) Convert your time domain measurements to the frequency domain
2) Determine the accelerance of your system (accelerance = acceleration/force)
3) Convert from accelerance to mobility
In more detail:
1) Use FFT to go from time domain to frequency domain. MATLAB's default FFT function is a little annoying to use if your background is not signal processing; you have to handle scaling yourself, and you are only going to want the first half of the FFT measurements. The other half are redundant if your signal is real-valued. Do something like this:
function [X, freqs] = easy_fft(x, fs)
L = length(x);
NFFT = 2^nextpow2(length(x));
X = fft(x, NFFT);
X = 2/L*X(1:NFFT/2 + 1); % 2/L is the required scaling
freqs = fs/2*linspace(0,1,NFFT/2+1); % Frequency vector
end
Then do
fs = 1/y(2, 1); % Convert time step to sample rate
[A, freq] = easy_fft(y(:, 2), fs); % Acceleration
[F, ~] = easy_fft(y(:, 3), fs); % Force
Now you have complex frequency domain vectors A and F. Don't take the real part of anything, they must be complex.
2) Now get the accelerance. We know that A = HF and want H; in your case the simple element-wise division
H = A./F;
will work. (This ONLY works for single-input, single-output systems such as what you have here). H is now your accelerance.
3) The conversion to mobility is just a scaling factor. Divide the accelerance by i*omega to get the mobility:
omega = 2*pi*freq; % Convert to rad/s
mobility = H./(1i*omega); % Acceleration = i*omega*Velocity for a periodic steady-state response
To replicate the plot you showed, take the absolute value of mobility and put it on a log scale vs. frequency.
semilogy(freq, abs(mobility));
Apologies if there are any bugs in what I wrote, I didn't test it on anything. Hopefully you get the idea.
5 Commenti
Joe
il 12 Ago 2015
1) I don't further smoothing is necessary for the quality of your results if you are only concerned about the damped natural frequency and damping of the first peak. If you'd like to try and get a smoother response curve, the best way to do that would be to take multiple test measurements and average them together in the frequency domain.
2) If your main purpose is to get the damped natural frequency and damping ratio of the soil region, you have two options.
A) Time domain: Count distance between peaks of the decaying response, the inverse of the period is the damped natural frequency. Then, use the "log decrement" method to find the damping ratio. The Wikipedia page on log decrement does a good job of explaining how to use it.
B) Frequency domain: The location of your primary response peak is the damped natural frequency. To obtain the damping ratio, use the "half power bandwidth" method, explained here. Basically, you go down by a factor of sqrt(2) from the peak, look at the width of the peak there, and use that to find the damping ratio.
If you are going to be doing this type of work more often in the future, there are dedicated texts for soil dynamics - "Principles of Soil Dynamics" seems to be well reviewed.
Più risposte (1)
Image Analyst
il 10 Ago 2015
Just add a dot before the slash.
mobility=velocity ./ force;
I'm assuming you know how to get your data into a variable in MATLAB. If you don't know how to do that, then look into csvread(), dlmread(), importdata(), xlsread(), textscan(), fread(), fgetl(), or functions like that.
5 Commenti
Image Analyst
il 10 Ago 2015
I can't help you. I don't know that test. Maybe you need to take the absolute value of the velocity, or maybe the what you think is the velocity is really the acceleration - I have no idea. All I know is that the syntax for dividing those two arrays, whatever they may represent, is correct. You need to dig further to find out if the arrays really represent what you think they do.
Vedere anche
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!