Mercurial > hg > chourdakisreiss2016
diff experiment-reverb/code/optim.py @ 0:246d5546657c
initial commit, needs cleanup
author | Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk> |
---|---|
date | Wed, 14 Dec 2016 13:15:48 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/experiment-reverb/code/optim.py Wed Dec 14 13:15:48 2016 +0000 @@ -0,0 +1,174 @@ +# -*- 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() + + + + + + + +