Changing the amplitude (y-axis) of an FFT back to units of force.

55 views (last 30 days)
Hello. I used Matlab to compute the FFT for my force vs time signals. The result was amplitude vs frequency, however, I would like to convert my amplitude signals back to units of force and plot force as a function of frequency. Does anyone have any idea on how I can do that with my current code? Thanks in advance.
Here is my code in a screen shot.

Accepted Answer

Ameer Hamza
Ameer Hamza on 9 Nov 2020
Amplitude is just a general term used for signals. If your signal has a unit (in your case, units of force), then the output of fft() still has the same units. You can just replace the ylabel('P1(f) [Units of force]'), and it will be correct.
  8 Comments
Ameer Hamza
Ameer Hamza on 11 Nov 2020
It just means that that the relative strength of 50 Hz frequency in your original signal. From the Fourier transform, we know that any arbitrary signal can be expressed as a sum of sinusoids. So the value of 9N at 50 Hz means that if you want to create the original signal, then you can need to add a 50Hz sinusoidal wave with an amplitude of 9. Similarly, you will multiply other sinusoids with their corresponding amplitudes and sum them all together to get the original signal back.
Kev
Kev on 12 Nov 2020
Thank you, Hamza. That was simply put, I understand now!

Sign in to comment.

More Answers (1)

David Goodmanson
David Goodmanson on 9 Nov 2020
Edited: David Goodmanson on 9 Nov 2020
Hi Kev,
The first thing is, the time and frequency arrays have to be correct. You are not actually using the 'time' variable but presumably it is equally spaced and consistent wth your choice of Fs. The frequency grid calculation is correct except that L is supposed to be the number of points in the time array (and also the Fx1 array). L is set at 4999.94, close to 5000. But you say that there are 1e5 points. With 5000 the frequency array is going to be incorrect, as will the amplitude in the frequency domain.
For the amplitude, if the data reperesents a periodic function that keeps going on in time, then using Y/ L is correct. However, using 5000 for L instead of 1e5 gives an answer that is too large by a factor of 20, which is what you are off by.
In this case the units in the frequency domain are Nt.
If the data represents a nonrepeated pulse function of some kind. such as a decaying oscillation, then there are two possibilities. One is to decree that the decaying oscillation repeats as it would if you put many of your existing time windows side-by-side. Then (after fixing up L) you use Y/L as above. That keeps things simple, as long as you are aware of what is being represented.
The other possibility is to say it really is a one-time occurrence. In that case the natural assumption is that the fft represents an approximation to the fourier integral of a continuous function. Since you are approximating Integral [something] dt, dt is replaced by delta_t = 1/Fs, the spacing of the time array. The fft is multiplied by delta_t and the result is Y/Fs.
In this case the units in the frequency domain are Nt/Hz.
  6 Comments
David Goodmanson
David Goodmanson on 11 Nov 2020
Hi Kev,
That means that there is a continuous wave fourier component with an amplitude of 9 N at that frequency, which contributes to the force in the time domain. If 50 Hz were an isolated frequency, you would see a wave of that size in the time domain. When there are a lot of nearby frequencies as well, things get mixed together and you don't see that.
When you have a lot of amplitudes that are dense in frequency, that's an argument for the second mehtod I mentioned in the answer. When the horizontal scale is V/Hz, suppose the fourier transform is fairly constant in a certain region, say around 50Hz and has a value 2 N/Hz. Roughly speaking, that tells you that frequency content between, say 40 and 60 Hz is worth 20 x 2 = 40N of response in the time domain.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!