File size: 1,388 Bytes
2d5fdd1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from math import floor
from scipy.signal import resample
from scipy.interpolate import interp1d
import numpy as np

def distribute_tasks(tasks, rank, size):
    num_tasks = len(tasks)
    num_tasks_per_job = num_tasks//size
    tasks = list(range(rank*num_tasks_per_job,(rank+1)*num_tasks_per_job))
    if rank < num_tasks%size:
        tasks.append(size*num_tasks_per_job+rank)
    return tasks

def ResampleLinear1D(original, targetLen):
    index_arr = np.linspace(0, len(original)-1, num=targetLen, dtype=np.float)
    index_floor = np.array(index_arr, dtype=np.int) #Round down
    index_ceil = index_floor + 1
    index_rem = index_arr - index_floor #Remain

    val1 = original[index_floor]
    val2 = original[index_ceil % len(original)]
    interp = val1 * np.expand_dims(1.0-index_rem,1) + val2 * np.expand_dims(index_rem,1)
    assert(len(interp) == targetLen)
    return interp


def downsample_signal(original,ratio):
    # ratio is the ratio between the time step in the original and in the new one (so it should be > 1 for downsampling)
    old_indices = np.arange(len(original), dtype=np.int32)
    new_indices = (old_indices // ratio).astype(np.int32)
    M = np.zeros((int(len(original)//ratio)+1,len(original)), dtype=np.float32)
    M[new_indices,old_indices] = 1
    w = np.sum(M,1)
    w = np.expand_dims(w,1)
    # print(M.shape)
    return np.matmul(M,original)/w