Source code for mosqito.utils.load

# -*- coding: utf-8 -*-

# Standard library imports
from numpy import int16, int32
from scipy.io import wavfile, loadmat
from scipy.signal import resample
import pyuff


[docs] def load(file, wav_calib=None, mat_signal="", mat_fs=""): """ Signal loading This function extracts the signal and its time axis from .wav or .uff file, resamples the signal to 48 kHz, and affects its sampling frequency and time signal values. Parameters ---------- file : string String path to the signal file. wav_calib : float, optional Wav file calibration factor [Pa/FS]. Level of the signal in Pa_peak corresponding to the full scale of the .wav file. If None, a calibration factor of 1 is considered. Default to None mat_signal : string In case of a .mat file, name of the signal variable. Default to "" mat_fs : string In case of a .mat file, name of the sampling frequency variable. Default to "" Returns ------- signal : numpy.array time signal values fs : integer sampling frequency """ # load the .wav file content if file[-3:] == "wav" or file[-3:] == "WAV": fs, signal = wavfile.read(file) # manage multichannel files if signal.ndim > 1: signal = signal[:, 0] print("[Info] Multichannel signal loaded. Keeping only first channel") # calibration factor for the signal to be in Pa if wav_calib is None: wav_calib = 1 print("[Info] A calibration of 1 Pa/FS is considered") if isinstance(signal[0], int16): signal = wav_calib * signal / (2**15 - 1) elif isinstance(signal[0], int32): signal = wav_calib * signal / (2**31 - 1) elif isinstance(signal[0], float): signal = wav_calib * signal # load the .uff file content elif file[-3:].lower() == "uff" or file[-3:].lower() == "unv": uff_file = pyuff.UFF(file) data = uff_file.read_sets() # extract the signal values signal = data["data"] # calculate the sampling frequency fs = int(1 / data["abscissa_inc"]) # load the .mat file content elif file[-3:] == "mat": matfile = loadmat(file) # extract the signal values and sampling frequency signal = matfile[mat_signal][:, 0] fs = matfile[mat_fs] fs = fs[:, 0] else: raise ValueError("""ERROR: only .wav .mat or .uff files are supported""") # resample to 48kHz to allow calculation if fs != 48000: signal = resample(signal, int(48000 * len(signal) / fs)) fs = 48000 print("[Info] Signal resampled to 48 kHz to allow calculation.") return signal, fs