diff options
Diffstat (limited to 'power_sequencer/operators/audiosync/mfcc/segment_axis.py')
-rw-r--r-- | power_sequencer/operators/audiosync/mfcc/segment_axis.py | 110 |
1 files changed, 0 insertions, 110 deletions
diff --git a/power_sequencer/operators/audiosync/mfcc/segment_axis.py b/power_sequencer/operators/audiosync/mfcc/segment_axis.py deleted file mode 100644 index b5b8740c..00000000 --- a/power_sequencer/operators/audiosync/mfcc/segment_axis.py +++ /dev/null @@ -1,110 +0,0 @@ -# -# Copyright (C) 2016-2020 by Nathan Lovato, Daniel Oakey, Razvan Radulescu, and contributors -# -# This file is part of Power Sequencer. -# -# Power Sequencer is free software: you can redistribute it and/or modify it under the terms of the -# GNU General Public License as published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# Power Sequencer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along with Power Sequencer. If -# not, see <https://www.gnu.org/licenses/>. -# -import numpy as np -import warnings - - -def segment_axis(a, length, overlap=0, axis=None, end="cut", endvalue=0): - """Generate a new array that chops the given array along the given axis - into overlapping frames. - - example: - >>> segment_axis(arange(10), 4, 2) - array([[0, 1, 2, 3], - [2, 3, 4, 5], - [4, 5, 6, 7], - [6, 7, 8, 9]]) - - arguments: - a The array to segment - length The length of each frame - overlap The number of array elements by which the frames should overlap - axis The axis to operate on; if None, act on the flattened array - end What to do with the last frame, if the array is not evenly - divisible into pieces. Options are: - - 'cut' Simply discard the extra values - 'wrap' Copy values from the beginning of the array - 'pad' Pad with a constant value - - endvalue The value to use for end='pad' - - The array is not copied unless necessary (either because it is unevenly - strided and being flattened or because end is set to 'pad' or 'wrap'). - """ - - if axis is None: - a = np.ravel(a) # may copy - axis = 0 - - l = a.shape[axis] - - if overlap >= length: - raise ValueError("frames cannot overlap by more than 100%") - if overlap < 0 or length <= 0: - raise ValueError("overlap must be nonnegative and length must " "be positive") - - if l < length or (l - length) % (length - overlap): - if l > length: - roundup = length + (1 + (l - length) // (length - overlap)) * (length - overlap) - rounddown = length + ((l - length) // (length - overlap)) * (length - overlap) - else: - roundup = length - rounddown = 0 - assert rounddown < l < roundup - assert roundup == rounddown + (length - overlap) or (roundup == length and rounddown == 0) - a = a.swapaxes(-1, axis) - - if end == "cut": - a = a[..., :rounddown] - elif end in ["pad", "wrap"]: # copying will be necessary - s = list(a.shape) - s[-1] = roundup - b = np.empty(s, dtype=a.dtype) - b[..., :l] = a - if end == "pad": - b[..., l:] = endvalue - elif end == "wrap": - b[..., l:] = a[..., : roundup - l] - a = b - - a = a.swapaxes(-1, axis) - - l = a.shape[axis] - if l == 0: - raise ValueError( - "Not enough data points to segment array in 'cut' mode; " "try 'pad' or 'wrap'" - ) - assert l >= length - assert (l - length) % (length - overlap) == 0 - n = 1 + (l - length) // (length - overlap) - s = a.strides[axis] - newshape = a.shape[:axis] + (n, length) + a.shape[axis + 1 :] - newstrides = a.strides[:axis] + ((length - overlap) * s, s) + a.strides[axis + 1 :] - - try: - return np.ndarray.__new__( - np.ndarray, strides=newstrides, shape=newshape, buffer=a, dtype=a.dtype - ) - except TypeError: - warnings.warn("Problem with ndarray creation forces copy.") - a = a.copy() - # Shape doesn't change but strides does - newstrides = a.strides[:axis] + ((length - overlap) * s, s) + a.strides[axis + 1 :] - return np.ndarray.__new__( - np.ndarray, strides=newstrides, shape=newshape, buffer=a, dtype=a.dtype - ) |