コード例 #1
0
def loop(W, Xpos, Xneg):
    n = W.size
    X = np.arange(n)

    #############
    Xpos, Xneg = se.get_frontiers(W)
    Xpos = hp.refine_frontier_iter(Xpos, W)
    Xneg = hp.refine_frontier_iter(Xneg, W)
    #############

    pcaverage = average_pc_waveform(Xpos, Xneg, W)

    # Ap = hp.approximate_pseudocycles_average(pcaverage)
    # Wp, dWp = hp.parametric_W_wtow(Xpos, Ap, n)

    pcx = interpolate.interp1d(np.linspace(0, 1, pcaverage.size), pcaverage,
                               "cubic")
    Wp = np.zeros(n)
    for i in range(Xpos.size - 1):
        x0 = Xpos[i]
        x1 = Xpos[i + 1]
        Wp[x0:x1] = pcx(np.linspace(0, 1, x1 - x0))
    dWp = np.zeros(n)
    dWp[:-1] = Wp[1:] - Wp[:-1]

    Xf = np.unique(np.hstack([Xpos, Xneg]))
    Ix = hp.split_raw_frontier(Xf, W, 10)

    A = hp.constrained_least_squares_arbitrary_intervals_wtow(
        Wp, dWp, W, Xf[Ix].tolist(), 2)
    We = hp.coefs_to_array_arbitrary_intervals_wtow(A, Wp, Xf[Ix].tolist(), n)
    residue = W - We

    env = hp.coefs_to_array_arbitrary_intervals(A, X, Xf[Ix].tolist(), n)
    # Ws = hp.parametric_W(hp.linearize_pc(Xpos), Ap, n, True)

    Xposl = hp.linearize_pc(Xpos)
    Ws = np.zeros(n)
    for i in range(1, Xposl.size - 1):
        # print(i)
        x0 = Xposl[i]
        x1 = Xposl[i + 1]
        Ws[x0:x1] = pcx(np.linspace(0, 1, x1 - x0))

    return We, Ws * env, residue
コード例 #2
0
    pos_avgpc = np.average(np.array(pos_norm_pcs), 0)
    return pos_avgpc, pos_orig_pcs, pos_norm_pcs


'''==============='''
''' Read wav file '''
'''==============='''

name = "alto"
W, fps = se.read_wav(f"Samples/{name}.wav")
W = W - np.average(W)
amp = np.max(np.abs(W))
n = W.size
X = np.arange(n)

Xpos_orig, Xneg_orig = se.get_frontiers(W)
Xpos = hp.refine_frontier_iter(Xpos_orig, W)
Xneg = hp.refine_frontier_iter(Xneg_orig, W)

siz = min(Xpos.size, Xneg.size)
Average_ref_X = (Xpos[:siz] + Xneg[:siz]) / 2
Average_ref_X_smooth = np.round(savgol_filter(Average_ref_X, 51,
                                              3)).astype(np.int)
Average_ref_X_smooth = np.unique(np.abs(Average_ref_X_smooth))

Average_ref_X_smooth_linear = hp.linearize_pc_approx(Average_ref_X_smooth)

pos_avgpc, pos_orig_pcs, pos_norm_pcs = average_pc_waveform(
    Average_ref_X_smooth, W)

pcx = interpolate.interp1d(np.linspace(0, 1, pos_avgpc.size), pos_avgpc,
コード例 #3
0
import numpy as np
import signal_envelope as se
import hp
from statistics import mode
'''==============='''
''' Read wav file '''
'''==============='''

name = "piano33"
W, fps = se.read_wav(f"Samples/{name}.wav")
W = W - np.average(W)
amp = np.max(np.abs(W))
n = W.size
X = np.arange(n)

Xpos, Xneg = se.get_frontiers(W)
Xpos = hp.refine_frontier_iter(Xpos, W)
Xneg = hp.refine_frontier_iter(Xneg, W)

T = []
for i in range(1, Xpos.size):
    T.append(Xpos[i] - Xpos[i - 1])
for i in range(1, Xneg.size):
    T.append(Xneg[i] - Xneg[i - 1])
T = np.array(T, dtype=np.int)
maxT = np.max(T)
modeT = mode(T)

Xf = np.sort(np.hstack([Xpos, Xneg]))

Ix = hp.split_raw_frontier(Xf, W, 2)
コード例 #4
0
import sys
# sys.path.append("signal_envelope/")
import numpy as np
import signal_envelope as se
from scipy import interpolate
import plotly.graph_objects as go

name = "alto"
# name="bend"
# name="spoken_voice"
W, _ = se.read_wav(f"test_samples/{name}.wav")
amp = np.max(np.abs(W))
W = 4 * W / amp
X = np.arange(W.size)

Xpos, Xneg = se.get_frontiers(W, 0)
E = se.get_frontiers(W, 1)

f = interpolate.interp1d(E, np.abs(W[E]), kind="linear", fill_value="extrapolate")
E = f(X)

for i in range(E.size):
  if E[i] < 0.1:
    E[i] = 0.1

C = W / E

'''============================================================================'''
'''                                    PLOT                                    '''
'''============================================================================'''
コード例 #5
0
    def plot_envelope(self,
                      TRAI,
                      COLOR,
                      features_path,
                      valid=False,
                      method='hl',
                      xlog=False):
        fig = plt.figure(figsize=[6, 3.9])
        fig.text(0.95,
                 0.17,
                 self.status,
                 fontdict={
                     'family': 'Arial',
                     'fontweight': 'bold',
                     'fontsize': 12
                 },
                 horizontalalignment="right")
        ax = plt.subplot()
        for idx, [trai, color] in enumerate(zip(TRAI, COLOR)):
            XX, YY = [], []
            for k in tqdm(trai):
                tmp = self.data_tra[k - 1]
                time, sig = self.cal_wave(tmp, valid=valid)
                if time[-1] < 50:
                    continue
                if method == 'se':
                    sig = (sig / max(sig))
                    X_pos_frontier, X_neg_frontier = se.get_frontiers(sig, 0)
                    XX.extend(np.linspace(0, time[-1],
                                          len(X_pos_frontier) - 2))
                    YY.extend(sig[X_pos_frontier[2:]]**2)
                    if not xlog:
                        ax.semilogy(np.linspace(0, time[-1],
                                                len(X_pos_frontier) - 2),
                                    sig[X_pos_frontier[2:]]**2,
                                    '.',
                                    Marker='.',
                                    color=color)
                    else:
                        ax.loglog(np.linspace(0, time[-1],
                                              len(X_pos_frontier) - 2),
                                  sig[X_pos_frontier[2:]]**2,
                                  '.',
                                  Marker='.',
                                  color=color)
                else:
                    sig = sig**2 / max(sig**2)
                    high_idx, low_idx = hl_envelopes_idx(sig, dmin=60, dmax=60)
                    XX.extend(time[low_idx])
                    YY.extend(sig[low_idx])
                    if not xlog:
                        ax.semilogy(time[low_idx],
                                    sig[low_idx],
                                    '.',
                                    Marker='.',
                                    color=color)
                    else:
                        ax.loglog(time[low_idx],
                                  sig[low_idx],
                                  '.',
                                  Marker='.',
                                  color=color)

            with open(
                    '%s_Decay Function_Pop %d.txt' %
                (features_path[:-4], idx + 1), 'w') as f:
                f.write('Time (μs), Normalized A$^2$\n')
                for j in range(len(XX)):
                    f.write('{}, {}\n'.format(XX[j], YY[j]))

        plot_norm(ax, 'Time (μs)', 'Normalized A$^2$', legend=False)
コード例 #6
0
# name = "soprano"
'''==============='''
''' Read wav file '''
'''==============='''
W, fps = se.read_wav(f"test_samples/{name}.wav")
W = W - np.average(W)
amplitude = np.max(np.abs(W))
W = W / amplitude
n = W.size
print(f"n={n}")
X = np.arange(n)
'''==============='''
'''  Present work '''
'''==============='''
start = timer()
Ex = se.get_frontiers(W, 1)
f = interp1d(Ex,
             np.abs(W[Ex]),
             kind="linear",
             fill_value="extrapolate",
             assume_sorted=False)
envY = f(X)
lms = np.average((np.abs(W) - envY * 0.5)**2)
print(f"Present work: lms ={lms}, time={timer() - start}")
'''==============='''
'''   Smoothing   '''
'''==============='''
start = timer()
envY_smooth = savgol_filter(np.abs(W), 3000 + 1, 3)
lms_smooth = np.average((np.abs(W) - envY_smooth * 0.5)**2)
print(f"Smoothing: lms ={lms_smooth}, time={timer() - start}")