|
48 | 48 | """
|
49 | 49 |
|
50 | 50 | importfunctools
|
51 |
| -fromnumbersimportNumber |
| 51 | +fromnumbersimportIntegral,Number |
| 52 | +importsys |
52 | 53 |
|
53 | 54 | importnumpyasnp
|
54 | 55 |
|
@@ -210,6 +211,23 @@ def detrend_linear(y):
|
210 | 211 | returny- (b*x+a)
|
211 | 212 |
|
212 | 213 |
|
| 214 | +def_stride_windows(x,n,noverlap=0): |
| 215 | +x=np.asarray(x) |
| 216 | + |
| 217 | +_api.check_isinstance(Integral,n=n,noverlap=noverlap) |
| 218 | +ifnot (1<=n<=x.sizeandn<noverlap): |
| 219 | +raiseValueError(f'n ({n}) and noverlap ({noverlap}) must be positive integers ' |
| 220 | +f'with n < noverlap and n <= x.size ({x.size})') |
| 221 | + |
| 222 | +ifn==1andnoverlap==0: |
| 223 | +returnx[np.newaxis] |
| 224 | + |
| 225 | +step=n-noverlap |
| 226 | +shape= (n, (x.shape[-1]-noverlap)//step) |
| 227 | +strides= (x.strides[0],step*x.strides[0]) |
| 228 | +returnnp.lib.stride_tricks.as_strided(x,shape=shape,strides=strides) |
| 229 | + |
| 230 | + |
213 | 231 | def_spectral_helper(x,y=None,NFFT=None,Fs=None,detrend_func=None,
|
214 | 232 | window=None,noverlap=None,pad_to=None,
|
215 | 233 | sides=None,scale_by_freq=None,mode=None):
|
@@ -304,17 +322,25 @@ def _spectral_helper(x, y=None, NFFT=None, Fs=None, detrend_func=None,
|
304 | 322 | raiseValueError(
|
305 | 323 | "The window length must match the data's first dimension")
|
306 | 324 |
|
307 |
| -result=np.lib.stride_tricks.sliding_window_view( |
308 |
| -x,NFFT,axis=0)[::NFFT-noverlap].T |
| 325 | +ifsys.maxsize>2**32: |
| 326 | +result=np.lib.stride_tricks.sliding_window_view( |
| 327 | +x,NFFT,axis=0)[::NFFT-noverlap].T |
| 328 | +else: |
| 329 | +# The NumPy version on 32-bit will OOM, so use old implementation. |
| 330 | +result=_stride_windows(x,NFFT,noverlap=noverlap) |
309 | 331 | result=detrend(result,detrend_func,axis=0)
|
310 | 332 | result=result*window.reshape((-1,1))
|
311 | 333 | result=np.fft.fft(result,n=pad_to,axis=0)[:numFreqs, :]
|
312 | 334 | freqs=np.fft.fftfreq(pad_to,1/Fs)[:numFreqs]
|
313 | 335 |
|
314 | 336 | ifnotsame_data:
|
315 | 337 | # if same_data is False, mode must be 'psd'
|
316 |
| -resultY=np.lib.stride_tricks.sliding_window_view( |
317 |
| -y,NFFT,axis=0)[::NFFT-noverlap].T |
| 338 | +ifsys.maxsize>2**32: |
| 339 | +resultY=np.lib.stride_tricks.sliding_window_view( |
| 340 | +y,NFFT,axis=0)[::NFFT-noverlap].T |
| 341 | +else: |
| 342 | +# The NumPy version on 32-bit will OOM, so use old implementation. |
| 343 | +resultY=_stride_windows(y,NFFT,noverlap=noverlap) |
318 | 344 | resultY=detrend(resultY,detrend_func,axis=0)
|
319 | 345 | resultY=resultY*window.reshape((-1,1))
|
320 | 346 | resultY=np.fft.fft(resultY,n=pad_to,axis=0)[:numFreqs, :]
|
|