def sprengel_binary_mask_from_wave_file(filepath): fs, x = utils.read_wave_file(filepath) Sxx = sp.wave_to_amplitude_spectrogram(x, fs) Sxx_log = sp.wave_to_log_amplitude_spectrogram(x, fs) # plot spectrogram fig = plt.figure(1) subplot_image(Sxx_log, 411, "Spectrogram") Sxx = pp.normalize(Sxx) binary_image = pp.median_clipping(Sxx, 3.0) subplot_image(binary_image + 0, 412, "Median Clipping") binary_image = morphology.binary_erosion(binary_image, selem=np.ones((4, 4))) subplot_image(binary_image + 0, 413, "Erosion") binary_image = morphology.binary_dilation(binary_image, selem=np.ones((4, 4))) subplot_image(binary_image + 0, 414, "Dilation") mask = np.array([np.max(col) for col in binary_image.T]) mask = morphology.binary_dilation(mask, np.ones(4)) mask = morphology.binary_dilation(mask, np.ones(4)) # plot_vector(mask, "Mask") fig.set_size_inches(10, 12) plt.tight_layout() fig.savefig(utils.get_basename_without_ext(filepath) + "_binary_mask.png", dpi=100)
def preprocess_wave(wave, fs): """ Preprocess a signal by computing the noise and signal mask of the signal, and extracting each part from the signal """ Sxx = sp.wave_to_amplitude_spectrogram(wave, fs) n_mask = compute_noise_mask(Sxx) s_mask = compute_signal_mask(Sxx) n_mask_scaled = reshape_binary_mask(n_mask, wave.shape[0]) s_mask_scaled = reshape_binary_mask(s_mask, wave.shape[0]) signal_wave = extract_masked_part_from_wave(s_mask_scaled, wave) noise_wave = extract_masked_part_from_wave(n_mask_scaled, wave) return signal_wave, noise_wave
def plot_spectrogram_from_wave_file(filename): fs, x = utils.read_gzip_wave_file(filename) Sxx = sp.wave_to_amplitude_spectrogram(x, fs, 512, 128)[:256] plot_matrix(Sxx, "Amplitude Spectrogram")
def img_log_spectrogram_from_wave_file(filepath): fs, x = utils.read_gzip_wave_file(filepath) Sxx = sp.wave_to_amplitude_spectrogram(x, fs, 512, 128)[:256] baseName = utils.get_basename_without_ext(filepath) save_matrix_to_file(Sxx, "Amplitude Spectrogram", baseName + "_LOG.png")
def signal_structure(wave, samplerate): spectrogram = sp.wave_to_amplitude_spectrogram(wave, samplerate) norm_spectrogram = pp.normalize(spectrogram) binary_image = pp.median_clipping(norm_spectrogram, 3) return np.sum(binary_image)
def signal_energy(wave, samplerate): spectrogram = sp.wave_to_amplitude_spectrogram(wave, samplerate) return np.sum(spectrogram)