# HG changeset patch # User Maria Panteli # Date 1505403041 -3600 # Node ID 0e70021f251ef781e295e859c9e7b6f0ca9c5e2c # Parent e5e8e8a969488089eea9148b079e9051c12203e2 some tests on OPmellin diff -r e5e8e8a96948 -r 0e70021f251e scripts/OPMellin.py --- a/scripts/OPMellin.py Thu Sep 14 15:21:52 2017 +0100 +++ b/scripts/OPMellin.py Thu Sep 14 16:30:41 2017 +0100 @@ -5,10 +5,10 @@ @author: mariapanteli """ +import numpy as np +import scipy.signal import librosa -import scipy.signal -# import matplotlib.pyplot as plt -import numpy + class OPMellin: def __init__(self, win2sec=8): @@ -19,10 +19,11 @@ self.op = None self.opmellin = None self.win2sec = win2sec + self.hop2sec = 0.5 - def load_audiofile(self, filename='test.wav', sr=None, segment=True): + + def load_audiofile(self, filename, sr=None, segment=True): self.y, self.sr = librosa.load(filename, sr=sr) - #self.y, self.sr = librosa.load(filename) # default sr=22050 if segment: tracklength = self.y.shape[0]/float(self.sr) startSample = 0 @@ -34,7 +35,6 @@ self.y = self.y[startSample:endSample] - # def mel_spectrogram(self, y=None, sr=None, filename='1_21.wav'): def mel_spectrogram(self, y=None, sr=None): if self.y is None: self.y = y @@ -42,22 +42,16 @@ self.sr = sr win1 = int(round(0.04*self.sr)) hop1 = int(round(win1/8.)) - nfft1 = int(2**numpy.ceil(numpy.log2(win1))) + nfft1 = int(2**np.ceil(np.log2(win1))) nmels = 40 - # y, sr = librosa.load(filename, sr=fs) - # melspec = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=nfft, win_length=win1, window=scipy.signal.hamming, hop_length=hop1, n_mels=nmels) - # melspec = librosa.feature.melspectrogram(y=self.y, sr=self.sr, n_fft=nfft, hop_length=hop1, n_mels=nmels) - D = numpy.abs(librosa.stft(self.y, n_fft=nfft1, hop_length=hop1, win_length=win1, window=scipy.signal.hamming))**2 - #melspec = librosa.feature.melspectrogram(S=D, sr=self.sr, n_mels=nmels) + D = np.abs(librosa.stft(self.y, n_fft=nfft1, hop_length=hop1, win_length=win1, window=scipy.signal.hamming))**2 melspec = librosa.feature.melspectrogram(S=D, sr=self.sr, n_mels=nmels, fmax=8000) melsr = self.sr/float(hop1) - # librosa.display.specshow(melspec) - # return melspec, melsr self.melspec = melspec self.melsr = melsr - # post process spectrogram - def post_process_spec(self, melspec=None, log=True, medianfilt=False, sqrt=False, smooth=False, diff=True, subtractmean=True, halfwave=True, maxnormal=True): + + def post_process_spec(self, melspec=None, log=True, medianfilt=True, sqrt=True, diff=True, subtractmean=True, halfwave=True, maxnormal=True): if self.melspec is None: self.melspec = melspec if log: @@ -71,98 +65,66 @@ self.melspec[i,:] = scipy.signal.medfilt(self.melspec[i,:],kernel_size = ks) if sqrt: self.melspec = self.melspec**.5 - if smooth: - step = 50.0 - nmels = self.melspec.shape[0] - mm = self.melspec - for i in range(nmels): - mm[i,:] = numpy.convolve(mm[i,:], numpy.ones(step)/step, mode='same') - self.melspec = mm if diff: - self.melspec = numpy.concatenate((self.melspec,self.melspec[:,-1,None]),axis=1) # append one frame before diff to keep number of frames the same - self.melspec = numpy.diff(self.melspec, n=1, axis=1) + # append one frame before diff to keep number of frames the same + self.melspec = np.concatenate((self.melspec,self.melspec[:,-1,None]),axis=1) + self.melspec = np.diff(self.melspec, n=1, axis=1) if subtractmean: mean = self.melspec.mean(axis=1) mean.shape = (mean.shape[0], 1) self.melspec = self.melspec - mean if halfwave: - self.melspec[numpy.where(self.melspec < 0)] = 0 + self.melspec[np.where(self.melspec < 0)] = 0 if maxnormal: if self.melspec.max() != 0: # avoid division by 0 self.melspec = self.melspec/self.melspec.max() - # return melspec - def onset_patterns(self, melspec=None, melsr=None, fft=True, logfilter=False, center=True, bpmrange=True): + def onset_patterns(self, melspec=None, melsr=None, center=False, bpmrange=True): if self.melspec is None: self.melspec = melspec if self.melsr is None: self.melsr = melsr - win2 = int(round(self.win2sec*self.melsr)) - hop2 = int(round(0.5*self.melsr)) + win2 = int(round(self.win2sec * self.melsr)) + hop2 = int(round(self.hop2sec * self.melsr)) nmels, nmelframes = self.melspec.shape - if fft: # periodicity via fft - #nfft2 = int(2**numpy.ceil(numpy.log2(win2))) - nfft2 = 2048 # nfft2 does not depend on win2?? - melspectemp = self.melspec - if ((nfft2 > win2) and (center is False)): - # in librosa version < 6.0, window is padded to the size of nfft - # so if win2 win2) and (center is False)): + # in librosa version < 6.0, window is padded to the size of nfft + # so if win2