def inverse(self, magnitude, phase): recombine_magnitude_phase = torch.cat( [magnitude * torch.cos(phase), magnitude * torch.sin(phase)], dim=1) inverse_transform = F.conv_transpose1d(recombine_magnitude_phase, Variable(self.inverse_basis, requires_grad=False), stride=self.hop_length, padding=0) if self.window is not None: window_sum = window_sumsquare(self.window, magnitude.size(-1), hop_length=self.hop_length, win_length=self.win_length, n_fft=self.filter_length, dtype=np.float32) # remove modulation effects approx_nonzero_indices = torch.from_numpy( np.where(window_sum > tiny(window_sum))[0]) window_sum = torch.autograd.Variable(torch.from_numpy(window_sum), requires_grad=False).cuda() inverse_transform[:, :, approx_nonzero_indices] /= window_sum[ approx_nonzero_indices] # scale by hop ratio inverse_transform *= float(self.filter_length) / self.hop_length inverse_transform = inverse_transform[:, :, int(self.filter_length / 2):] inverse_transform = inverse_transform[:, :, :-int(self.filter_length / 2):] return inverse_transform
def inverse(self, magnitude, phase): recombine_magnitude_phase = torch.cat( [magnitude * torch.cos(phase), magnitude * torch.sin(phase)], dim=1) if magnitude.device.type == "cuda": inverse_transform = F.conv_transpose1d(recombine_magnitude_phase, self.inverse_basis, stride=self.hop_length, padding=0) if self.window is not None: window_sum = window_sumsquare(self.window, magnitude.size(-1), hop_length=self.hop_length, win_length=self.win_length, n_fft=self.filter_length, dtype=np.float32) # remove modulation effects approx_nonzero_indices = torch.from_numpy( np.where(window_sum > tiny(window_sum))[0]) window_sum = torch.from_numpy(window_sum).to( inverse_transform.device) inverse_transform[:, :, approx_nonzero_indices] /= window_sum[ approx_nonzero_indices] # scale by hop ratio inverse_transform *= float( self.filter_length) / self.hop_length inverse_transform = inverse_transform[:, :, int(self.filter_length / 2):] inverse_transform = inverse_transform[:, :, :-int( self.filter_length / 2):] inverse_transform = inverse_transform.squeeze(1) else: x_org = recombine_magnitude_phase.detach().numpy() n_b, n_f, n_t = x_org.shape x = np.empty([n_b, n_f // 2, n_t], dtype=np.complex64) x.real = x_org[:, :n_f // 2] x.imag = x_org[:, n_f // 2:] inverse_transform = [] for y in x: y_ = istft(y, self.hop_length, self.win_length, self.window) inverse_transform.append(y_[None, :]) inverse_transform = np.concatenate(inverse_transform, 0) inverse_transform = torch.from_numpy(inverse_transform).to( recombine_magnitude_phase.dtype) return inverse_transform