def reconst_music(self): print("NOW!! RECONSTRUCTION!!") print("wsize, step =", stft_wsize, ", ", stft_step) print(self.clist) global Ymean print("Ym:", Ymean, " , Xmean:", np.mean(self.H.dot(self.U))) if len(self.fai) > 0: F = np.zeros((self.H.shape[0], self.U.shape[1])) for ks in range(self.K): if not self.clist[ks]: continue Hk = np.array([self.H[:, ks] for i in range(self.U.shape[1])]).T Uk = np.array([self.U[ks, :] for i in range(self.H.shape[0])]) F += Hk * Uk * self.fai[ks, :, :] # self.reconst = istft(F * np.exp(0 + 1j), stft_wsize, stft_step) self.reconst = istft(F * np.exp(0 + 1j) * self.phase, stft_wsize, stft_step) else: scale = 1 Vphase = self.phase Ht = np.zeros(self.H.shape) Ut = np.zeros(self.U.shape) for ks in range(self.K): if self.clist[ks]: Ht[:, ks] = self.H[:, ks] Ut[ks, :] = self.U[ks, :] self.reconst = istft(scale * Ht.dot(Ut) * np.exp((0 + 1j) * Vphase), stft_wsize, stft_step)
def lsee_mstftm(self, X): V = X * self.phase eps = np.finfo(float).eps for i in range(10): v_aud = istft(V * np.exp((0 + 1j)), stft_wsize, stft_step) V = stft(v_aud, stft_wsize, stft_step) while V.shape[1] < X.shape[1]: V = np.c_[V, [eps for i in range(V.shape[0])]] while X.shape[1] < V.shape[1]: X = np.c_[V, [eps for i in range(X.shape[0])]] V = X * V / np.abs(V) return V
def reconst(self): print("NOW!! RECONSTRUCTION!!") print("wsize, step =", self.stft_wsize, ", ", self.stft_step) print(self.clist) print("Ym:",self.Ymean," , Xmean:",np.mean(self.H.dot(self.U))) scale = 1 V = self.lsee_mstftm(self.H.dot(self.U)) self.phase = np.angle(V) Vphase = self.phase if FACTORIZE == "SimpleNMF" : # SimpleNMF Ht = np.zeros(self.H.shape) Ut = np.zeros(self.U.shape) for ks in range(self.K): if self.clist[ks]: Ht[:, ks] = self.H[:, ks] Ut[ks, :] = self.U[ks, :] self.recon_spectrogram = Ht.dot(Ut) self.recon_data = istft(scale * Ht.dot(Ut) * np.exp((0 + 1j) * Vphase), self.stft_wsize, self.stft_step)
wsize = 2048 step = 1024 input_fname = sys.argv[1] # input_fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file') wf = wave.open(input_fname, "rb") printWaveInfo(wf) paras = wf.getparams() buffer = wf.readframes(wf.getnframes()) mdata = np.frombuffer(buffer, dtype="int16") Org_spectr = stft(mdata, wsize, step) phase = np.angle(Org_spectr) print("median1") Ht = medianfilter(abs(Org_spectr),0,l) recon1 = istft( Ht * np.exp(0 + 1j) * phase, wsize, step) save_as_wave(filepath+"/"+fname+"median1.wav",paras,recon1) print("median2") Hf = medianfilter(abs(Org_spectr),1,l) recon2 = istft( Hf * np.exp(0 + 1j) * phase, wsize, step) save_as_wave(filepath+"/"+fname+"median2.wav",paras,recon2) print("wener") MH = (Ht*Ht)/((Ht*Ht)+(Hf*Hf)) MP = (Hf*Hf)/((Ht*Ht)+(Hf*Hf)) recon3 = istft( Org_spectr * MH, wsize, step)