In [1]:
    
from __future__ import division
import glob
import os
import librosa
import medleydb as mdb
import numpy as np
import scipy
import matplotlib.pyplot as plt
import IPython.display
import seaborn as sns
%matplotlib inline
import jams
import itertools
from onsetGroundTruth import *
    
    
In [2]:
    
def computeEnvelope(s):
    analytic_signal = scipy.signal.hilbert(s)
    amplitude_envelope = np.abs(analytic_signal)
    return amplitude_envelope
    
In [3]:
    
def generateSine(f = 440, sr = 22050 , duration = 1):
    '''a function to generate a sine wav
    inpupt
    f: frequency in hz
    sr: sampling rate (samples/second)
    duration: in seconds
    '''
    
    samples = (np.sin(2*np.pi*np.arange(sr*duration)*f/sr))
    
    return samples
def generateInstrument(A, F, sr = 22050 , duration = 1):
    def instrument(f0,sr = 22050 , duration = 1):
        y = 0
        for f,a in zip(F,A):
            y = y + a*generateSine(f*f0,sr, duration) 
            
        return y
            
    return instrument
    
In [4]:
    
# make signal, mixes, and compute envelopes
A1 = np.array([1,0.2,0.2,0.1,0.1])
F1 = np.array([1,2,3,4,5])
inst1 = generateInstrument(A1,F1)
A2 = np.array([1,0.5, 0.25])
F2 = np.array([1,2,4])
inst2 = generateInstrument(A2,F2)
stem1 = inst1(440,duration=3)
stem2 = inst2(500,duration=3)
stem = np.array([stem1, stem2]).T
stem1_envelope = computeEnvelope(stem1)
stem2_envelope = computeEnvelope(stem2)
stem_envelope = np.array([stem1_envelope, stem2_envelope]).T
gain1 = np.abs(generateSine(f = 0.5,  duration = 3))
gain2 = np.abs(generateSine(f = 0.9,  duration = 3))
gain1[gain1<0.1] = 0
gain2[gain2<0.7] = 0
gain = np.array([gain1,gain2]).T
mix = (stem*gain).sum(1)
mix_envelope = computeEnvelope(mix)
    
In [5]:
    
plt.figure(figsize=(15,3))
t = 300
pltEnvelope = False
# signal
plt.plot(stem1[:t], label = 'stem 1', c = 'r')
plt.plot(stem2[:t], label = 'stem 2', c = 'b')
#envelope
if pltEnvelope:
    plt.plot(stem1_envelope[:t],"--", label = 'stem 1 envelope', c = 'r')
    plt.plot(stem2_envelope[:t],"--", label = 'stem 2 envelope', c = 'b')
plt.legend(loc = 'best')
plt.ylim([-2,3])
plt.title('Stem Audio')
    
    Out[5]:
    
In [6]:
    
plt.figure(figsize=(15,3))
t_gain = 22050*5
plt.plot(gain1[:t_gain], label = 'gain 1', c = 'r')
plt.plot(gain2[:t_gain], label = 'gain 2', c = 'b')
plt.legend(loc = 'best')
plt.ylim([0,2])
plt.title('Gain')
    
    Out[6]:
    
In [7]:
    
plt.figure(figsize=(15,3))
t = 22050*5
# signal
plt.plot(mix[:t], label = 'mix', c = 'g')
plt.legend(loc = 'best')
plt.ylim([-5,5])
plt.title('Mixed')
    
    Out[7]:
    
In [8]:
    
plt.figure(figsize=(15,3))
t = 22050*.5
# signal
plt.plot(mix[:t], label = 'mix signal', c = 'g')
plt.plot(mix_envelope[:t], label = 'mix envelope', c = 'r')
plt.legend(loc = 'best')
plt.title('Mixed')
    
    
    Out[8]:
    
In [9]:
    
# estimation using signal
windowList = [200,100, 50, 25, 1]
f = plt.figure(figsize=(15,3*len(windowList)))
for i, window_ms in enumerate(windowList):
         
    window_frame = int(22050*(window_ms/1000))
        
    plt.subplot(len(windowList),1,i+1)
    
    estimatedGain_stem = estimateGain(mix, stem, window_frame, stride = None)
    
    plt.plot(estimatedGain_stem[:,0], "--", label = 'est. gain 1', c = 'r')
    plt.plot(estimatedGain_stem[:,1], "--", label = 'est. gain 2', c = 'b')
    
    plt.plot(gain[:,0], label = 'gain 1', c = 'r', alpha = 0.5)
    plt.plot(gain[:,1], label = 'gain 2', c = 'b', alpha = 0.5)
    
    plt.subplots_adjust(hspace = 0.5)
    
    titleStr = 'Estimating gain using signal, window = ' + str(window_ms) + 'ms, ' + str(window_frame) + ' frames'
    
    plt.title(titleStr)
    
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.2), fancybox=True, ncol=4)
    
    
    Out[9]:
    
In [10]:
    
# estimation using envelope
windowList = [200,100, 50, 25, 1]
f = plt.figure(figsize=(15,3*len(windowList)))
for i, window_ms in enumerate(windowList):
         
    window_frame = int(22050*(window_ms/1000))
        
    plt.subplot(5,1,i+1)
    
    estimatedGain_envelope = estimateGain(mix_envelope, stem_envelope, window_frame, stride = None)
    
    plt.plot(estimatedGain_envelope[:,0], "--", label = 'est. gain 1', c = 'r')
    plt.plot(estimatedGain_envelope[:,1], "--", label = 'est. gain 2', c = 'b')
    
    plt.plot(gain[:,0], label = 'gain 1', c = 'r', alpha = 0.5)
    plt.plot(gain[:,1], label = 'gain 2', c = 'b', alpha = 0.5)
    
    plt.subplots_adjust(hspace = 0.5)
    
    titleStr = 'Estimating gain using amplitude envelope, window = ' + str(window_ms) + 'ms, ' + str(window_frame) + ' frames'
    
    plt.title(titleStr)
    
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.2), fancybox=True, ncol=4)
    
    Out[10]:
    
In [11]:
    
# estimation using absolute value of signal
windowList = [200,100, 50, 25, 1]
f = plt.figure(figsize=(15,3*len(windowList)))
for i, window_ms in enumerate(windowList):
         
    window_frame = int(22050*(window_ms/1000))
        
    plt.subplot(5,1,i+1)
    
    estimatedGain_stem = estimateGain(np.abs(mix), np.abs(stem), window_frame, stride = None)
    
    plt.plot(estimatedGain_stem[:,0], "--", label = 'est. gain 1', c = 'r')
    plt.plot(estimatedGain_stem[:,1], "--", label = 'est. gain 2', c = 'b')
    
    plt.plot(gain[:,0], label = 'gain 1', c = 'r', alpha = 0.5)
    plt.plot(gain[:,1], label = 'gain 2', c = 'b', alpha = 0.5)
    
    plt.subplots_adjust(hspace = 0.5)
    
    titleStr = 'Estimating gain using |signal|, window = ' + str(window_ms) + 'ms, ' + str(window_frame) + ' frames'
    
    plt.title(titleStr)
    
    
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.2), fancybox=True, ncol=4)
    
    Out[11]: