Skip to content

Commit 0c32e65

Browse files
committed
Remove overpadding from FFT computation. Extra zeros were causing erroneous estimation of first and last PSD in timeseries
1 parent d579514 commit 0c32e65

3 files changed

Lines changed: 8 additions & 16 deletions

File tree

mhkit/dolfyn/binned.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,6 @@ def _psd_base(
370370
noise=0,
371371
n_bin=None,
372372
n_fft=None,
373-
n_pad=None,
374373
step=None,
375374
):
376375
"""
@@ -393,8 +392,6 @@ def _psd_base(
393392
n_fft : int
394393
n_fft of veldat2, number of elements per bin if 'None' is taken
395394
from VelBinner
396-
n_pad : int (optional)
397-
The number of values to pad with zero. Default = 0
398395
step : int (optional)
399396
Controls amount of overlap in fft. Default: the step size is
400397
chosen to maximize data use, minimize nens, and have a
@@ -413,11 +410,9 @@ def _psd_base(
413410
fs = self._parse_fs(fs)
414411
n_bin = self._parse_nbin(n_bin)
415412
n_fft = self._parse_nfft(n_fft)
416-
if n_pad is None:
417-
n_pad = min(n_bin - n_fft, n_fft)
418413
out = np.empty(self._outshape_fft(dat.shape, n_fft=n_fft, n_bin=n_bin))
419414
# The data is detrended in psd, so we don't need to do it here.
420-
dat = self.reshape(dat, n_pad=n_pad)
415+
dat = self.reshape(dat)
421416

422417
for slc in slice1d_along_axis(dat.shape, -1):
423418
out[slc] = psd_1D(dat[slc], n_fft, fs, window=window, step=step)
@@ -474,8 +469,8 @@ def _csd_base(self, dat1, dat2, fs=None, window="hann", n_fft=None, n_bin=None):
474469
oshp[-2] = np.min([oshp[-2], int(dat2.shape[-1] // n_bin2)])
475470

476471
# The data is detrended in psd, so we don't need to do it here:
477-
dat1 = self.reshape(dat1, n_pad=n_fft)
478-
dat2 = self.reshape(dat2, n_pad=n_fft)
472+
dat1 = self.reshape(dat1)
473+
dat2 = self.reshape(dat2)
479474
out = np.empty(oshp, dtype="c{}".format(dat1.dtype.itemsize * 2))
480475
if dat1.shape == dat2.shape:
481476
cross = cpsd_1D

mhkit/dolfyn/tools/fft.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,13 @@ def cpsd_1D(a, b, nfft, fs, window="hann", step=None):
246246
window = _getwindow(window, nfft)
247247
fft_inds = slice(1, int(nfft / 2.0 + 1))
248248
wght = 2.0 / (window**2).sum()
249+
# Take FFT of first segment
249250
s1 = fft(detrend_array(a[0:nfft]) * window)[fft_inds]
250251
if auto_psd:
251252
pwr = np.abs(s1) ** 2
252253
else:
253254
pwr = s1 * np.conj(fft(detrend_array(b[0:nfft]) * window)[fft_inds])
255+
# take FFT of remaining segments
254256
if nens - 1:
255257
for i in range(step, l - nfft + 1, step):
256258
s1 = fft(detrend_array(a[i : (i + nfft)]) * window)[fft_inds]

mhkit/dolfyn/velocity.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ def u(
306306
"""
307307
try:
308308
return self.ds["vel"][0].drop_vars("dir")
309-
except:
309+
except KeyError:
310310
return self.ds["vel_avg"][0].drop_vars("dir")
311311

312312
@property
@@ -327,7 +327,7 @@ def v(
327327
"""
328328
try:
329329
return self.ds["vel"][1].drop_vars("dir")
330-
except:
330+
except KeyError:
331331
return self.ds["vel_avg"][1].drop_vars("dir")
332332

333333
@property
@@ -348,7 +348,7 @@ def w(
348348
"""
349349
try:
350350
return self.ds["vel"][2].drop_vars("dir")
351-
except:
351+
except KeyError:
352352
return self.ds["vel_avg"][2].drop_vars("dir")
353353

354354
@property
@@ -967,7 +967,6 @@ def power_spectral_density(
967967
noise=0,
968968
n_bin=None,
969969
n_fft=None,
970-
n_pad=None,
971970
step=None,
972971
):
973972
"""
@@ -991,8 +990,6 @@ def power_spectral_density(
991990
The bin-size. Default = `self.n_bin`
992991
n_fft : int (optional)
993992
The fft size. Default = `self.n_fft`
994-
n_pad : int (optional)
995-
The number of values to pad with zero. Default = 0
996993
step : int (optional)
997994
Controls amount of overlap in fft. Default: the step size is
998995
chosen to maximize data use, minimize nens, and have a
@@ -1056,7 +1053,6 @@ def power_spectral_density(
10561053
noise=noise[idx],
10571054
window=window,
10581055
n_bin=n_bin,
1059-
n_pad=n_pad,
10601056
n_fft=n_fft,
10611057
step=step,
10621058
)
@@ -1076,7 +1072,6 @@ def power_spectral_density(
10761072
noise=noise,
10771073
window=window,
10781074
n_bin=n_bin,
1079-
n_pad=n_pad,
10801075
n_fft=n_fft,
10811076
step=step,
10821077
)

0 commit comments

Comments
 (0)