Spaces:
Runtime error
Runtime error
File size: 2,366 Bytes
607ecc1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
from typing import Optional
import gin
import numpy as np
import scipy.interpolate
import scipy.signal.windows
def get_padded_length(frames: int, window_length: int, hop_length: int):
return frames * hop_length + window_length - hop_length
def get_source_target_axes(frames: int, window_length: int, hop_length: int):
padded_length = get_padded_length(frames, window_length, hop_length)
source_x = np.linspace(0, frames - 1, frames)
target_x = np.linspace(0, frames - 1, padded_length)
return source_x, target_x
@gin.configurable
def linear_interpolation(
signal: np.ndarray,
window_length: int,
hop_length: int,
original_length: Optional[int] = None,
):
source_x, target_x = get_source_target_axes(signal.size, window_length, hop_length)
interpolated = np.interp(target_x, source_x, signal)
if original_length:
interpolated = interpolated[window_length // 2 :]
interpolated = interpolated[:original_length]
return interpolated
@gin.configurable
def cubic_spline_interpolation(
signal: np.ndarray,
window_length: int,
hop_length: int,
original_length: Optional[int] = None,
):
source_x, target_x = get_source_target_axes(signal.size, window_length, hop_length)
interpolant = scipy.interpolate.interp1d(source_x, signal, kind="cubic")
interpolated = interpolant(target_x)
if original_length:
interpolated = interpolated[window_length // 2 :]
interpolated = interpolated[:original_length]
return interpolated
@gin.configurable
def overlap_add_upsample(
signal: np.ndarray,
window_length: int,
hop_length: int,
window_fn: str = "hann",
window_scale: int = 2,
original_length: Optional[int] = None,
):
window = scipy.signal.windows.get_window(window_fn, hop_length * window_scale)
padded_length = get_padded_length(signal.size, window_length, hop_length)
padded_output = np.zeros(padded_length)
for i, value in enumerate(signal):
window_start = i * hop_length
window_end = window_start + hop_length * window_scale
padded_output[window_start:window_end] += window * value
if original_length:
output = padded_output[(padded_length - original_length) // 2:]
output = output[:original_length]
else:
output = padded_output
return output
|