Losing energy during Fast Fourier Transform

Click For Summary
SUMMARY

The discussion centers on the challenges faced by an engineering student, Gordon, while simulating ocean wave environments using Fast Fourier Transform (FFT) in Python with the NumPy FFT package. Gordon's initial results showed a significant loss of energy in the reconstructed spectrum, with amplitudes off by a factor of 30. After further analysis and community input, it was determined that the issue stemmed from a numerical error involving a missing factor in the reconstruction process, which, once corrected, improved the results significantly.

PREREQUISITES
  • Understanding of Fast Fourier Transform (FFT) principles
  • Familiarity with Python programming and NumPy FFT package
  • Knowledge of Power Density Spectrum (PDS) and JONSWAP spectrum
  • Basic concepts of signal processing and wave simulation
NEXT STEPS
  • Explore advanced FFT techniques and their numerical stability
  • Research the JONSWAP spectrum and its applications in oceanography
  • Learn about signal reconstruction methods and error analysis
  • Investigate the impact of sampling rates on FFT results
USEFUL FOR

Engineering students, signal processing researchers, and developers working on simulations of wave phenomena will benefit from this discussion, particularly those interested in FFT applications and numerical accuracy in signal analysis.

Gordon89
Messages
2
Reaction score
0
Alright guys.

First off, this is my first post (happy to be here!) and I'm hoping this is the correct section of the forum. I'm an engineering student, currently working towards finishing my master's thesis.

Short introduction. I am trying to simulate an ocean wave environment, as a superposition of simple traveling sinusoidal waves. The amplitudes and frequencies of these single components obviously is not random (this would hardly produce usable results), but are instead sampled from a standard Power Density Spectrum called a 'JONSWAP' spectrum. For an example, see http://www.wikiwaves.org/Ocean-Wave_Spectra (look for 'JONSWAP' on the page, approximately one screen down from the top).

The point being, that the wave climate I attempt generate is supposed to be statistically fully dependent on the input spectrum. The problem I have, is that when I attempt to analyse the resulting signal (a superposition of a few hundred sinusoids, with amplitude and frequency sampled from the PSD and phases randomly assigned between -pi and +pi) by Fast Fourier Transform, I expect to roughly get back my original PSD but I don't.

The shape of the resulting (reconstructed) spectrum looks quite nice but the amplitudes are off by a factor 30 or so (too low). Basically, I am loosing a heck of a lot of 'energy' somewhere between the sampling and FFS analysis. It is worth mentioning that analysis of the generated signal of sinusoids by using mathematical moments and some set relations between variables yields very good results, convincing me that the sampling of the amplitudes/frequencies and superposition parts function just fine.

The question to you guys being: what is happening here, and how can I accurately sample my generated signal?

I will freely admit that my knowledge of the FFT is not without gaps. Currently, I am sampling the signal and truncating the frequencies to be left only with the ones I am interested in (the ones from the original PSD). Then I plot the results. Please see the attached images.

Other information: working in Python (using the numpy FFT package).

The original PDS:
JONSWAP.jpg


The signal constructed from it:
Realized.jpg


The reconstructed spectrum (note the much lower amplitudes):
reconstructed.jpg
Thanks for your input guys! Regards,Gordon.
 
Mathematics news on Phys.org
Hard to tell if you do not show your calculations, but I would guess missing factors of 2 pi.
 
Thanks for the reply!

I guess showing you guys the calculations would have helped. I had been told that some inaccuracies are a natural part of the FFT, so I guess I was looking for a more phenomenological explanation.

As per usual however, it turned out the mistake was purely numerical - I forgot a small factor in the reconstruction process. After adding it, things look much better!
 

Similar threads

  • · Replies 12 ·
Replies
12
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 16 ·
Replies
16
Views
4K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 3 ·
Replies
3
Views
4K