view experiment-reverb/code/optim.py @ 2:c87a9505f294 tip

Added LICENSE for code, removed .wav files
author Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk>
date Sat, 30 Sep 2017 13:25:50 +0100
parents 246d5546657c
children
line wrap: on
line source
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 16 15:23:28 2015

@author: mmxgn
"""


from matplotlib.pyplot import *

from numpy.core._internal import _gcd as gcd

from numpy import *

def calculate_parameters(d1,g1):
    
    d2 = int(round((1.5)**(-1)*d1))

    while gcd(d2,d1) != 1:
        d2 += 1
    
    d3 = int(round((1.5)**(-2)*d1))
    
    while gcd(d3, d2) != 1 or gcd(d3, d1) != 1:
        d3 += 1
        
    d4 = int(round((1.5)**(-3)*d1))
    
    while gcd(d4, d3) != 1 or gcd(d4, d2) != 1  or gcd(d4, d1) != 1:
        d4 += 1

        
    d5 = int(round((1.5)**(-4)*d1))

    while gcd(d5, d4) != 1 or gcd(d5, d3) != 1  or gcd(d5, d2) != 1 or gcd(d5, d1) != 1:
        d5 += 1        
    
    d6 = int(round((1.5)**(-5)*d1))
    while gcd(d6, d5) != 1 or gcd(d6, d4) != 1  or gcd(d6, d3) != 1 or gcd(d6, d2) != 1 or gcd(d6, d1) != 1:
        d6 += 1          
    g2 = g1**(1.5)**(-1)*g1
    g3 = g1**(1.5)**(-2)*g1
    g4 = g1**(1.5)**(-3)*g1     
    g5 = g1**(1.5)**(-4)*g1 
    g6 = g1**(1.5)**(-5)*g1        
    
    return (d1, d2, d3, d4, d5, d6, g1, g2, g3, g4, g5, g6)        
def estimate_SC(d1, g1, da, G, gc, SR):
    n = arange(0, SR/2+1)
    return sum(n/(1+gc**2-2*gc*cos(2*pi*n/SR)))/sum(1/(1+gc**2-2*gc*cos(2*pi*n/SR)))
    
    
def estimate_T60(d1, g1, da, G, gc, SR):
    ga = 1/sqrt(2)
    return d1/SR/log(g1)*log(10**-3/ga/(1-gc)/G)
        
def estimate_D(d1,g1, da, G, gc, SR):
    Dm = zeros((6,10))
    delays = zeros((6,))
    gains = zeros((6,1))        
    (delays[0],delays[1],delays[2],delays[3],delays[4],delays[5],gains[0],gains[1],gains[2],gains[3],gains[4],gains[5]) = calculate_parameters(d1,g1)    
    for k in range(1, 7):
        for m in range(1, 11):
            Dm[k-1,m-1] = max(0.1-m*delays[k-1]/SR,0)        
    
    return sum(Dm)

    
def estimate_C(d1, g1, da, G, gc, SR):
    g2 = g1**(1.5)**(-1)*g1
    g3 = g1**(1.5)**(-2)*g1
    g4 = g1**(1.5)**(-3)*g1     
    g5 = g1**(1.5)**(-4)*g1 
    g6 = g1**(1.5)**(-5)*g1         
    gains = zeros((6,1))
    gains[0] = g1
    gains[1] = g2
    gains[2] = g3
    gains[3] = g4
    gains[4] = g5
    gains[5] = g6
    
    return -10*log10(G**2*(1-gc)/(1+gc)*sum(1/(1-gains**2)))

    
def estimate_Tc(d1, g1, da, G, gc, SR):
    delays = zeros((6,))
    gains = zeros((6,1))        
    (delays[0],delays[1],delays[2],delays[3],delays[4],delays[5],gains[0],gains[1],gains[2],gains[3],gains[4],gains[5]) = calculate_parameters(d1,g1) 
    return sum(delays/SR*gains**2/(1-gains**2)**2)/sum(gains**2/(1-gains**2)) + da/SR        
        
    
GC = arange(0,1,0.01)

SR = 44100
SCy = array([estimate_SC(0,0,0,0,g,SR) for g in GC])

z = polyfit(GC,SCy,9)


#plot(GC,SCy)
estSC = poly1d(z)
#plot(GC, estSC(GC))



print mean((SCy-estSC(GC))**2)
#show()
from scipy.optimize import minimize_scalar
SCp = 8000
f = lambda x: abs(estSC(x) - SCp)
res = minimize_scalar(f, bounds=(0,1), method='bounded')

def utility_function(d1t,g1,dat,gc,G,SR,T60,T60min,T60max,D,Dmin,Dmax,C,Cmin,Cmax,Tc,Tcmin,Tcmax,SC,SCmin,SCmax):
    d1 = int(d1t*SR)
    da = int(dat*SR)
    T60p = estimate_T60(d1,g1,da,G,gc,SR)
    Dp = estimate_D(d1,g1,da,G,gc,SR)
    Cp = estimate_C(d1,g1,da,G,gc,SR)
    
    
    Tcp = estimate_Tc(d1,g1,da,G,gc,SR)
    SCp = estimate_SC(d1,g1,da,G,gc,SR)
    
    T60err = abs(T60p-T60)/(T60max-T60min)
    Derr = abs(Dp-D)/(Dmax-Dmin)
    Cerr = abs(Cp-C)/(Cmax-Cmin)
    Tcerr = abs(Tcp-Tc)/(Tcmax-Tcmin)
    Scerr = abs(SCp-SC)/(SCmax-SCmin)


    return T60err + Derr + Cerr + Tcerr + Scerr    
    
print utility_function(0.05, 0.5, 0.006, 0.5, 0.5, 44100, 0.373, 0.001, 120, 2841.75, 1, 8000, 2.181, -10, 20, 0.167, 0.02, 0.7, 3056.711, 10, SR/4)
    

g1x = arange(0.01,0.99,0.01)
#g1_utility = [utility_function(0.05, g1, 0.006, 0.5, 0.5, 44100, 0.373, 0.001, 120, 2841.75, 1, 8000, 2.181, -10, 20, 0.167, 0.02, 0.7, 3056.711, 10, SR/4) for g1 in arange(0.01,0.99,0.01)]

d1x = arange(0.01,0.1,0.001)*SR
#d1_utility = [utility_function(d1, 0.5, 0.006, 0.5, 0.5, 44100, 0.373, 0.001, 120, 2841.75, 1, 8000, 2.181, -10, 20, 0.167, 0.02, 0.7, 3056.711, 10, SR/4) for d1 in d1x]

dax = arange(0.006, 0.012, 0.001)*SR
#da_utility = [utility_function(0.05, 0.5, da, 0.5, 0.5, 44100, 0.373, 0.001, 120, 2841.75, 1, 8000, 2.181, -10, 20, 0.167, 0.02, 0.7, 3056.711, 10, SR/4) for da in dax]

gcx = arange(0.01, 0.99, 0.01)
#gc_utility = [utility_function(0.05, 0.5, 0.006, gc, 0.5, 44100, 0.373, 0.001, 120, 2841.75, 1, 8000, 2.181, -10, 20, 0.167, 0.02, 0.7, 3056.711, 10, SR/4) for gc in gcx]


flist = [estimate_T60, estimate_D, estimate_C, estimate_Tc, estimate_SC]
ix = 0
for func in flist:
    p1 = d1x
    p2 = g1x
    
    image = zeros((len(p1), len(p2)))
    for i in range(0, len(p1)):
        for j in range(0, len(p2)):
            image[i,j] = func(int(p1[i]), p2[j], int(0.012*SR), 0.5, 0.5, SR)
            figure()
            imshow(image)
            ylabel('g1')
            xlabel('d1')
            imsave(arr=image, fname='%d-g1-d1.pgf' % ix)
            
show()