Source code for bmtk.simulator.filternet.auditory_processing

import numpy as np
from scipy.interpolate import interp1d
from scipy.signal import resample_poly


# Audio file in the format of *.wav

[docs] class AuditoryInput(object): def __init__(self, aud_fn, low_lim=50.0, hi_lim=8000.0, sample_factor=4, downsample=None): """Preprocesses wave files into cochleagrams - note these are based on human auditory filters :param aud_fn: string, Input audio filename in the format of *.wav :param low_lim: float, low end of frequency range (Hz) :param hi_lim: float, high end of frequency range (Hz) :param sample_factor: int, """ from pycochleagram import utils self.stim_array, self.sr = utils.wav_to_array(aud_fn) # Allow relative size of stimulus self.sample_factor = sample_factor # density of sampling, can be 1,2, or 4 self.low_lim = low_lim self.hi_lim = hi_lim self.downsample = downsample
[docs] def get_cochleagram(self, desired_sr=1000, interp_to_freq=False): import pycochleagram.erbfilter as erb import pycochleagram.cochleagram as cgram n = int(np.floor(erb.freq2erb(self.hi_lim) - erb.freq2erb(self.low_lim)) - 1) self.sample_factor = 4 human_coch = cgram.human_cochleagram(self.stim_array, self.sr, n=n, sample_factor=self.sample_factor, downsample=self.downsample, nonlinearity='power', strict=False) filts, center_freqs, freqs = erb.make_erb_cos_filters_nx(self.stim_array.shape[0], self.sr, n, self.low_lim, self.hi_lim, self.sample_factor, padding_size=None, full_filter=True, strict=False) if interp_to_freq: log_freqs = np.geomspace(self.low_lim, self.hi_lim, len(center_freqs)) n_t = human_coch.shape[1] Ytf = np.empty((len(log_freqs), n_t)) for i in range(n_t): f = interp1d(np.log2(center_freqs/self.low_lim), human_coch[:, i], kind='cubic') Ytf[:, i] = f(np.log2(log_freqs/self.low_lim)) human_coch = Ytf center_freqs = log_freqs inds_keep = np.argwhere((center_freqs >= self.low_lim) & (center_freqs <= self.hi_lim)) center_freqs = center_freqs[inds_keep] human_coch = human_coch[np.squeeze(inds_keep)] minval = np.min(human_coch) center_freqs_log = np.log2(center_freqs/self.low_lim) human_coch = resample_poly(human_coch, desired_sr, self.sr, axis=1) human_coch[human_coch<=minval] = minval # resampling sometimes produces very small negative values times = np.linspace(0, 1/desired_sr * (human_coch.shape[1]-1), human_coch.shape[1]) return human_coch, center_freqs_log, times