Scaling of fft output?
73 次查看(过去 30 天)
显示 更早的评论
I'm noticing that in the fft examples in the MATLAB help files, sometimes the output of the fft function is divided by the length of the original time-domain signal before it's plotted, say, as power against frequency. What does that scaling accomplish? Is it necessary for all fft applications, or if not, what determines whether or not you need it? I'm trying to understand exactly what I'm looking at when I plot a frequency spectrum using that code. Thanks!
0 个评论
回答(2 个)
Honglei Chen
2012-5-24
4 个评论
Dr. Seis
2012-5-25
I am not talking about power... I am talking about the correct scaling factor for the result of the FFT. I use Parseval's theorem, which compares the ENERGY (not power) of a signal in the time domain to the ENERGY of the signal in the frequency domain. See my answer in the other post. You compute the energy in the time domain by squaring the amplitudes and integrating over the time interval... or simply:
dt=1/Fs;
sum(y.^2)*dt
In the frequency domain you square the magnitude of the amplitudes and integrate over the frequency interval... or simply:
df = Fs/N;
sum(abs(fft(y)*dt).^2)*df
If the amplitudes are scaled correctly, the ENERGY should be the exact same for both cases.
Dr. Seis
2012-5-25
Also, the Fourier transform is an integral. The FFT is basically performing a discrete version of the integral, but it is assuming a discrete sampling frequency of 1 when it does this (at zero frequency it is simply the sum of the amplitudes in the time domain). But the width between samples is not always one, and therefore the area (length x width) under a single sample is not simply the amplitude (length) times 1 (width) - it is the amplitude (length) times "dt" (width = time increment between samples). In order to correct for the fact that the discrete integral is essentially computed assuming an Fs = 1, you need to multiply the result by dt = 1/Fs.
Dr. Seis
2012-5-25
See my answer here:
In order to conserve energy in a signal whose length does not happen to be the same number as the one associated with the sampling frequency (Fs) - the third example in Honglei Chen's post has a signal that is 1025 samples long and an Fs of 1024 - then you need to scale the result of the FFT by the sampling frequency. This example that is provided by Matlab is just plain WRONG and needs to be changed !!!
Another example is that of a spike in the time domain at time = 0 and zeros at every other time sample. A true spike, by definition, should have infinite amplitude and width of 1/infinity (see http://en.wikipedia.org/wiki/Dirac_delta_function) such that the Fourier transform of it (in a continuous domain) would result in 1 at all frequencies between -inf to +inf. We do not have infinitesimally small sampling frequency, so the amplitude of the spike (or Dirac delta) in the time domain must be equal to the number represented by Fs. In the frequency domain, we only get 1's at all of our frequencies if we divide the FFT result by Fs (unless of course our signal happens to have a length equal to the number associated with Fs... then by all means divide your result by the length of your signal because it won't matter).
1 个评论
Kenny
2018-2-14
A 'spike' having 'infinite' amplitude and 'zero width' is definable --- as we can certainly give it a definition. But as far as conservation of 'energy' is concerned, the energy in a spike is uncontained, or infinite, right? So the amount of energy in a time-domain spike is 'undefined' right?
I can understand conservation of energy for time domain signal that drops off to zero at some point in the negative and positive time values. But for those signals that don't drop off to zero, then probably can't talk about conservation of (infinite) energy, right? Because infinite is unbounded.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Fourier Analysis and Filtering 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!