| | import os |
| |
|
| | import librosa |
| | import librosa.display |
| | import matplotlib.pyplot as plt |
| | import numpy as np |
| | from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas |
| |
|
| | from config import CONFIG |
| |
|
| |
|
| | def mkdir_p(mypath): |
| | """Creates a directory. equivalent to using mkdir -p on the command line""" |
| |
|
| | from errno import EEXIST |
| | from os import makedirs, path |
| |
|
| | try: |
| | makedirs(mypath) |
| | except OSError as exc: |
| | if exc.errno == EEXIST and path.isdir(mypath): |
| | pass |
| | else: |
| | raise |
| |
|
| |
|
| | def visualize(target, input, recon, path): |
| | sr = CONFIG.DATA.sr |
| | window_size = 1024 |
| | window = np.hanning(window_size) |
| |
|
| | stft_hr = librosa.core.spectrum.stft(target, n_fft=window_size, hop_length=512, window=window) |
| | stft_hr = 2 * np.abs(stft_hr) / np.sum(window) |
| |
|
| | stft_lr = librosa.core.spectrum.stft(input, n_fft=window_size, hop_length=512, window=window) |
| | stft_lr = 2 * np.abs(stft_lr) / np.sum(window) |
| |
|
| | stft_recon = librosa.core.spectrum.stft(recon, n_fft=window_size, hop_length=512, window=window) |
| | stft_recon = 2 * np.abs(stft_recon) / np.sum(window) |
| |
|
| | fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharey=True, sharex=True, figsize=(16, 10)) |
| | ax1.title.set_text('Target signal') |
| | ax2.title.set_text('Lossy signal') |
| | ax3.title.set_text('Reconstructed signal') |
| |
|
| | canvas = FigureCanvas(fig) |
| | p = librosa.display.specshow(librosa.amplitude_to_db(stft_hr), ax=ax1, y_axis='linear', x_axis='time', sr=sr) |
| | p = librosa.display.specshow(librosa.amplitude_to_db(stft_lr), ax=ax2, y_axis='linear', x_axis='time', sr=sr) |
| | p = librosa.display.specshow(librosa.amplitude_to_db(stft_recon), ax=ax3, y_axis='linear', x_axis='time', sr=sr) |
| | mkdir_p(path) |
| | fig.savefig(os.path.join(path, 'spec.png')) |
| |
|
| |
|
| | def get_power(x, nfft): |
| | S = librosa.stft(x, n_fft=nfft) |
| | S = np.log(np.abs(S) ** 2 + 1e-8) |
| | return S |
| |
|
| |
|
| | def LSD(x_hr, x_pr): |
| | S1 = get_power(x_hr, nfft=2048) |
| | S2 = get_power(x_pr, nfft=2048) |
| | lsd = np.mean(np.sqrt(np.mean((S1 - S2) ** 2 + 1e-8, axis=-1)), axis=0) |
| | S1 = S1[-(len(S1) - 1) // 2:, :] |
| | S2 = S2[-(len(S2) - 1) // 2:, :] |
| | lsd_high = np.mean(np.sqrt(np.mean((S1 - S2) ** 2 + 1e-8, axis=-1)), axis=0) |
| | return lsd, lsd_high |
| |
|