|
49 | 49 |
|
50 | 50 | importfunctools
|
51 | 51 | fromnumbersimportNumber
|
| 52 | +importsys |
52 | 53 |
|
53 | 54 | importnumpyasnp
|
54 | 55 |
|
@@ -210,6 +211,30 @@ def detrend_linear(y):
|
210 | 211 | returny- (b*x+a)
|
211 | 212 |
|
212 | 213 |
|
| 214 | +def_stride_windows(x,n,noverlap=0): |
| 215 | +ifnoverlap>=n: |
| 216 | +raiseValueError('noverlap must be less than n') |
| 217 | +ifn<1: |
| 218 | +raiseValueError('n cannot be less than 1') |
| 219 | + |
| 220 | +x=np.asarray(x) |
| 221 | + |
| 222 | +ifn==1andnoverlap==0: |
| 223 | +returnx[np.newaxis] |
| 224 | +ifn>x.size: |
| 225 | +raiseValueError('n cannot be greater than the length of x') |
| 226 | + |
| 227 | +# np.lib.stride_tricks.as_strided easily leads to memory corruption for |
| 228 | +# non integer shape and strides, i.e. noverlap or n. See #3845. |
| 229 | +noverlap=int(noverlap) |
| 230 | +n=int(n) |
| 231 | + |
| 232 | +step=n-noverlap |
| 233 | +shape= (n, (x.shape[-1]-noverlap)//step) |
| 234 | +strides= (x.strides[0],step*x.strides[0]) |
| 235 | +returnnp.lib.stride_tricks.as_strided(x,shape=shape,strides=strides) |
| 236 | + |
| 237 | + |
213 | 238 | def_spectral_helper(x,y=None,NFFT=None,Fs=None,detrend_func=None,
|
214 | 239 | window=None,noverlap=None,pad_to=None,
|
215 | 240 | sides=None,scale_by_freq=None,mode=None):
|
@@ -304,17 +329,25 @@ def _spectral_helper(x, y=None, NFFT=None, Fs=None, detrend_func=None,
|
304 | 329 | raiseValueError(
|
305 | 330 | "The window length must match the data's first dimension")
|
306 | 331 |
|
307 |
| -result=np.lib.stride_tricks.sliding_window_view( |
308 |
| -x,NFFT,axis=0)[::NFFT-noverlap].T |
| 332 | +ifsys.maxsize>2**32: |
| 333 | +result=np.lib.stride_tricks.sliding_window_view( |
| 334 | +x,NFFT,axis=0)[::NFFT-noverlap].T |
| 335 | +else: |
| 336 | +# The NumPy version on 32-bit will OOM, so use old implementation. |
| 337 | +result=_stride_windows(x,NFFT,noverlap=noverlap) |
309 | 338 | result=detrend(result,detrend_func,axis=0)
|
310 | 339 | result=result*window.reshape((-1,1))
|
311 | 340 | result=np.fft.fft(result,n=pad_to,axis=0)[:numFreqs, :]
|
312 | 341 | freqs=np.fft.fftfreq(pad_to,1/Fs)[:numFreqs]
|
313 | 342 |
|
314 | 343 | ifnotsame_data:
|
315 | 344 | # 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 |
| 345 | +ifsys.maxsize>2**32: |
| 346 | +resultY=np.lib.stride_tricks.sliding_window_view( |
| 347 | +y,NFFT,axis=0)[::NFFT-noverlap].T |
| 348 | +else: |
| 349 | +# The NumPy version on 32-bit will OOM, so use old implementation. |
| 350 | +resultY=_stride_windows(y,NFFT,noverlap=noverlap) |
318 | 351 | resultY=detrend(resultY,detrend_func,axis=0)
|
319 | 352 | resultY=resultY*window.reshape((-1,1))
|
320 | 353 | resultY=np.fft.fft(resultY,n=pad_to,axis=0)[:numFreqs, :]
|
|