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
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, "cubic")
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) A = hp.constrained_least_squares_arbitrary_intervals(Xf, np.abs(W), Ix, 2)