how to distinguish fft frequency is real existence or noise

i useing fft analyze tide water level
i want find exist tide component
but fft present a lot of noise
i want distinguish frequency which is real existence (very likely to exist) or not exist(noise)
how should i distinguish fft produce real frequency and noise
attached file is my plot fft amplitude and frequency

Answers (1)

You need to have a priori knowledge of the spectrum of the signal and the noise, and design an appropriate noise filter
  • if the noise stectrums are well separated, you are OK
  • if they are partially overlap, you have to make a compromise
  • if they are totally overlapped you are screwed

14 Comments

attached file is my plot fft amplitude and frequency
As can be seen have much frequency point
matlab can find real exist tide component or very likely exist tide component?
You are not actually screwed if the signal has broadband noise, you simply cannot use a frequency-selective filter to elimiinate it. Instead, use either wavelet denoising (requires the Wavelet Toolbox) or the Savitzky-Golay filter (sgolayfilt) to eliminate as much of it as posible from the time-domain signal.
my tide signal is not complete data
i useing spline code fill up my data
then can use sgolayfilt eliminate noise?
I would use sgolayfilt on the interpolated data. It may eliminiate the noise, however it will be necessary for you to experiment with it. I usually use a 3-degre polynomial, and vary the window length until I get the best possible result, that being minimal noise without eliminating the details from the signal features.
What do you really want to know? Maybe we can find that out despite the noise. Like if you just wanted to find the location of those really tall peaks. I think they're obviously not due to noise so we can find them even if there is a low level of noise everywhere else that we didn't do anything about.
dear star srtider:
what is window length?
sgolayfilt(x,order,framelen)
is framelen?
window length is data length?
Dear image analyst:
I want find tide component (M2 O2 ....)
I use fft find frequency but time is not an integer multiple of the tidal component period
So I can't tell which is the actual frequency
@peter huang — Yes. I was referring to ‘framelen’.
@Star Strider I would like to ask how framelen value is determine
i try use sgolayfilt remove noise
but I compare the difference between the two and there is no other difference
Increase the ‘framelen’ value until you get the result you want.
ok
so the steps i should do the fft should be
rawdata > spline_data (complete data points) > sgolayfilt_data (noise removal) > fft_data?
@peter huang I don't know what M2 and O2 are. Can you point them out on this diagram?
and, like I asked before, if you're just trying to find really tall peaks less than 0.1, then what does it matter if there is noise? Those peaks could still be found without any denoising.
Even if you did want to do denoising, wouldn't it make sense to do it on the original data instead of the Fourier Transform of the data?
I understand what you mean so I probably don't need to do the denoising
The m2 period is about 12.45hr which is clearly the most prominent point in the graph
Maybe the real tidal component will be very prominent (large amplitude) in fft
How do I now filter out the other sub-tide so that only the larger amplitude values ​​are left?

Sign in to comment.

Asked:

on 16 Apr 2022

Commented:

on 18 Apr 2022

Community Treasure Hunt

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

Start Hunting!