From 5fcef6230396ae04fce8e7ac918a45071ff91f78 Mon Sep 17 00:00:00 2001 From: aboombadev Date: Wed, 7 Aug 2024 11:38:10 -0700 Subject: [PATCH] implement lws --- model/test.wav | Bin 90156 -> 90156 bytes src/scaling testing.py | 2 +- src/utils/helpers.py | 50 ++++++++++++++++++++++++++++++----------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/model/test.wav b/model/test.wav index b57b34adf418b62763c1d22a7b33633da283c0e7..c10b6fdbadd53c04486b6bc575693751cb5e2776 100644 GIT binary patch literal 90156 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 literal 90156 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 BNO=GN diff --git a/src/scaling testing.py b/src/scaling testing.py index b96665c..355188b 100644 --- a/src/scaling testing.py +++ b/src/scaling testing.py @@ -5,7 +5,7 @@ scale_normalized_db_to_amplis, ) -sample = "/Users/abhayshukla/Documents/GitHub/deep-convolution-audio-generation/data/kick_samples/(OS) kick doorknocker.wav" +sample = "/Users/abhayshukla/Documents/GitHub/deep-convolution-audio-generation/data/kick_samples/Cymatics - Sanctuary Kick 4 - G.wav" loudness = encode_sample(sample) graph_spectrogram(loudness, "before istft") print(loudness.shape) diff --git a/src/utils/helpers.py b/src/utils/helpers.py index 73c1c09..23f794b 100644 --- a/src/utils/helpers.py +++ b/src/utils/helpers.py @@ -23,7 +23,7 @@ # Initialize STFT Object GLOBAL_WIN = 2**9 GLOBAL_HOP = 2**6 -win = scipy.signal.windows.hann(GLOBAL_WIN) +win = scipy.signal.windows.kaiser(GLOBAL_WIN, beta=14) STFT = scipy.signal.ShortTimeFFT( win=win, hop=GLOBAL_HOP, fs=GLOBAL_SR, scale_to="magnitude" ) @@ -195,25 +195,51 @@ def scale_normalized_db_to_amplis(normalized_loudness): return channel_amplis # Amplitudes -def istft_with_griffin_lim_reconstruction(amplitudes): - iterations = 100 +def lws(amplitudes): + iterations = 50 + lookback, lookahead = 1, 1 angles = np.exp(2j * np.pi * np.random.rand(*amplitudes.shape)) + for _ in range(iterations): + S = amplitudes * angles + for i in range(N_FREQ_BINS): + start = max(0, i - lookback) + end = min(N_FREQ_BINS - 1, i + lookahead + 1) + for j in range(N_FRAMES): + weights = amplitudes[j, start : end + 1] + E = np.sum(S[j, start : end + 1] * weights) + angles[j, i] = E / np.abs(E) + + complex_spec = amplitudes * angles + return complex_spec + + +def istft_with_griffin_lim_reconstruction(amplitudes, preserve_signal_angles=False): + iterations = 100 + + if preserve_signal_angles == True: + angles = np.exp(1j * np.angle(amplitudes)) + else: + angles = np.exp(2j * np.pi * np.random.rand(*amplitudes.shape)) + for i in range(iterations): full = amplitudes * angles - audio = STFT.istft(full.T) - stft = STFT.stft(audio) + istft = STFT.istft(full.T) + stft = STFT.stft(istft) - if stft.shape[1] != N_FRAMES: # perserve shape + if stft.shape[1] != N_FRAMES: # preserve shape stft = stft[:, :N_FRAMES] - angles = np.exp(1j * np.angle(stft.T)) + new_angles = np.exp(1j * np.angle(stft.T)) + angles = new_angles * (i / (i + 1)) + angles * (1 / (i + 1)) return STFT.istft((amplitudes * angles).T) -def istft_with_weiner_reconstruction(amplitudes): - complex_spec = scipy.signal.wiener(amplitudes, mysize=None, noise=0.01) - return STFT.istft(complex_spec.T) +def istft_hybrid(amplitudes): + complex_spec = lws(amplitudes) + return istft_with_griffin_lim_reconstruction( + complex_spec, preserve_signal_angles=True + ) def amplitudes_to_wav(amplitudes, name): @@ -221,9 +247,7 @@ def amplitudes_to_wav(amplitudes, name): for channel_loudness in amplitudes: channel_amplitudes = scale_normalized_db_to_amplis(channel_loudness) - # audio_signal = STFT.istft(channel_amplitudes.T) - # audio_signal = istft_with_griffin_lim_reconstruction(channel_amplitudes) - audio_signal = istft_with_weiner_reconstruction(channel_amplitudes) + audio_signal = istft_hybrid(channel_amplitudes) audio_channels.append(audio_signal) audio_stereo = np.vstack(audio_channels)