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
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,
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)
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 ''' '''============================================================================'''
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)
# 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}")