I work with depth time series data from electronically tagged fish. When the fish spend time on the bottom we get a prominent tidal signal (approx 1.96 cycles per day). This interferes with our analysis of the data, so I have been experimenting with removing it using FFT - i.e. run FFT attenuate the bins around 1.96 cpd then inverse FFT. It nearly works, but the tidal signal varies over time (the time series can be up to a year long, with varying sample rates between 10 s and 2 mins). So in some parts the signal is removed, in others it is exaggerated. I have attempted to divide the time series into blocks and deal with each individually, but it doesn't seem to work. I work in C#. Any help and advice would be much appreciated!

  • $\begingroup$ Can I please ask if it Is possible to obtain bathymetry and the actual tidal "signal" from nearby buoys? What sort of accuracy in the estimation of depth are you after? $\endgroup$
    – A_A
    Commented Oct 10, 2016 at 10:06
  • 1
    $\begingroup$ I would first resample the data to a single sampling rate. $\endgroup$ Commented Oct 10, 2016 at 11:11
  • $\begingroup$ do you know what is the sampling frequency for each blocks before processing it ? $\endgroup$
    – Arpit Jain
    Commented Oct 10, 2016 at 11:22
  • $\begingroup$ A_A: The animals we tagged are free ranging so no reliable actual tidal signal is available. We can use a signal from a fixed tide gauge, but the data is not very helpful - there are many gaps and the signal only matches at the fixed location, not where our animals roam. $\endgroup$ Commented Oct 11, 2016 at 13:48
  • $\begingroup$ Olli and arpit - Yes, I do know the sampling frequency - but it differs between and during time series - i.e. it might be a 20 s intervals for 3 months then drop to 2 mins for the rest of the sample - however, I can easily re-sample to the higher rate. $\endgroup$ Commented Oct 11, 2016 at 13:50

2 Answers 2


The answer is "No, you cannot attenuate the impact of tide on pressure derived depth data you have already captured without extraneous information".

The reason for this is that the hydrostatic pressure derived depth measurements from the tracked fish ($depth_{fish}(n)$), is only a component of the captured signal.

The illustrative example here is a "freakishly intelligent fish" which manages to stay at one point (with respect to the bottom of the sea) and adjusts its buoyancy with respect to pressure. When the tidal potential piles up the water in a water column above the fish, it ascends. When the water recedes, the fish descends. The pressure derived depth of this fish is constant, when clearly, it has been going up and down.

The hydrostatic pressure signal on the fish body is $P_{recorded}(n) = P_{tidal}(n) \cdot P_{fishDepth}(n)$ where $n$ is some variable that indicates time.

You are FFTing the $P_{recorded}$, aiming at suppressing the $P_{tidal}$, but, multiplication in the time domain is convolution in the frequency domain. Therefore, just by having $P_{recorded}$, you have both $P_{tidal}, P_{fishDepth}$ intertwined. That's not entirely bad news but it certainly is not the best news ever.

You need to somehow fix one to recover the other and to an extent, whether with freakish frightening accuracy as above or simply casual preference, fish do regulate their buoyancy, but perhaps faster than the speed by which the tidal potential moves over the globe. Therefore, your task might become as easy as applying a low pass filter to attenuate the tidal component which is more likely to exist at the low frequencies. The speed at which the fish are moving versus tidal variation is probably your best "weapon" here. For a bit more background information, you might want to see this link which is not exactly what is asked here but is relevant. (Note: It depends very much on the scale of observation too. Fish might have specific life patterns that are modulated by the time of day. So again, their signal might "hide" in the tide because it just so happens to be driven by the celestial objects that also drive the tide.)

Now, the reason I am asking you about your accuracy specifications is because you might be able to construct some kind of model by which you could isolate the movement of the fish from tide and/or depth.

The simplest way to think about this is to say, "My sensor says 23 meters. Where is the fish? It's at XYZ location. When is the fish? It's at some hh:mm:ss time. Right, what is the depth (from the datum) at the where? It's 50 meters. What is the depth at the where and the when? (Due to tide), it's 52 meters.", Ah! So, the tide has added two meters, therefore the fish is now at 21 meters from the bottom.

It might be possible to work out a probabilistic model too. That answers the question of what is the probability of a depth value, given the prior formed by the sum of bathymetry and tidal data and the data obtained by the sensor.

In any case, you either need extraneous information (bathymetry,tide) or to make an assumption (tidal signal much slower, therefore at very low frequencies, apply a low pass, done).

Finally, please note that bathymetry does play a significant role. For a trivial example, imagine a basin that fills up with water (and fish) during the tide and then preserves water (and fish) even after the tide has receded. For those fish, the readings will always be (for instance) between 4-5 meters when around them, the depth could well be zero. So, your $P_{tidal}$ is actually a sum of bathymetry and tide.

I suspect that this is probably "bad news" (?) but I hope it helps anyway.

  • $\begingroup$ HI @A_A, many thanks for such a comprehensive comment. I am working with bottom living skates and so we have a clear tidal signal many times larger than the vertical displacements we observe from horizontal movements over the sea bed topography. Therefore the signal we get is one of high frequency movement modulated by the larger ~1.96 cpd tidal signal. I need a digital filter to remove the ~1.96 cpd signal leaving the other frequencies. I have had some success, but the method assumes the signal has the same amplitude throughout, which it doesn't (spring/neap), so it goes a bit wrong. $\endgroup$ Commented Oct 18, 2016 at 11:05
  • $\begingroup$ You are welcome, if you felt that the response was helpful so far, please consider upvoting or accepting it via the controls on the left. Can I please ask you to "post" a tiny extract of the data you have at your disposal? If possible, can you please take a subset of the pressure values you have and put them up on something like pastebin? It would be of great help in providing a useful response. $\endgroup$
    – A_A
    Commented Oct 24, 2016 at 10:18

As Olli suggested, get all of your data, short term and long term into the same format and sample rate (might require interpolation with the lower sample rate).

then apply a notch filter at that frequency of 1.96 cycles per day. the notch wouldn't need to go down to $-\infty$ dB, but should reduce the gain at that frequency.

in the audio world, we call that kind of notch or bandreject filtering a "parametric equalizer". dial the frequency to 1.96 cycles per day, cut that frequency by some level of dB. try different amounts of dB cut and values of Q and you'll stumble upon an optimal value of each


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.