comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:246d5546657c
1 # -*- coding: utf-8 -*-
2 """
3 Created on Tue Jun 16 15:23:28 2015
4
5 @author: mmxgn
6 """
7
8
9 from matplotlib.pyplot import *
10
11 from numpy.core._internal import _gcd as gcd
12
13 from numpy import *
14
15 def calculate_parameters(d1,g1):
16
17 d2 = int(round((1.5)**(-1)*d1))
18
19 while gcd(d2,d1) != 1:
20 d2 += 1
21
22 d3 = int(round((1.5)**(-2)*d1))
23
24 while gcd(d3, d2) != 1 or gcd(d3, d1) != 1:
25 d3 += 1
26
27 d4 = int(round((1.5)**(-3)*d1))
28
29 while gcd(d4, d3) != 1 or gcd(d4, d2) != 1 or gcd(d4, d1) != 1:
30 d4 += 1
31
32
33 d5 = int(round((1.5)**(-4)*d1))
34
35 while gcd(d5, d4) != 1 or gcd(d5, d3) != 1 or gcd(d5, d2) != 1 or gcd(d5, d1) != 1:
36 d5 += 1
37
38 d6 = int(round((1.5)**(-5)*d1))
39 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:
40 d6 += 1
41 g2 = g1**(1.5)**(-1)*g1
42 g3 = g1**(1.5)**(-2)*g1
43 g4 = g1**(1.5)**(-3)*g1
44 g5 = g1**(1.5)**(-4)*g1
45 g6 = g1**(1.5)**(-5)*g1
46
47 return (d1, d2, d3, d4, d5, d6, g1, g2, g3, g4, g5, g6)
48 def estimate_SC(d1, g1, da, G, gc, SR):
49 n = arange(0, SR/2+1)
50 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)))
51
52
53 def estimate_T60(d1, g1, da, G, gc, SR):
54 ga = 1/sqrt(2)
55 return d1/SR/log(g1)*log(10**-3/ga/(1-gc)/G)
56
57 def estimate_D(d1,g1, da, G, gc, SR):
58 Dm = zeros((6,10))
59 delays = zeros((6,))
60 gains = zeros((6,1))
61 (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)
62 for k in range(1, 7):
63 for m in range(1, 11):
64 Dm[k-1,m-1] = max(0.1-m*delays[k-1]/SR,0)
65
66 return sum(Dm)
67
68
69 def estimate_C(d1, g1, da, G, gc, SR):
70 g2 = g1**(1.5)**(-1)*g1
71 g3 = g1**(1.5)**(-2)*g1
72 g4 = g1**(1.5)**(-3)*g1
73 g5 = g1**(1.5)**(-4)*g1
74 g6 = g1**(1.5)**(-5)*g1
75 gains = zeros((6,1))
76 gains[0] = g1
77 gains[1] = g2
78 gains[2] = g3
79 gains[3] = g4
80 gains[4] = g5
81 gains[5] = g6
82
83 return -10*log10(G**2*(1-gc)/(1+gc)*sum(1/(1-gains**2)))
84
85
86 def estimate_Tc(d1, g1, da, G, gc, SR):
87 delays = zeros((6,))
88 gains = zeros((6,1))
89 (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)
90 return sum(delays/SR*gains**2/(1-gains**2)**2)/sum(gains**2/(1-gains**2)) + da/SR
91
92
93 GC = arange(0,1,0.01)
94
95 SR = 44100
96 SCy = array([estimate_SC(0,0,0,0,g,SR) for g in GC])
97
98 z = polyfit(GC,SCy,9)
99
100
101 #plot(GC,SCy)
102 estSC = poly1d(z)
103 #plot(GC, estSC(GC))
104
105
106
107 print mean((SCy-estSC(GC))**2)
108 #show()
109 from scipy.optimize import minimize_scalar
110 SCp = 8000
111 f = lambda x: abs(estSC(x) - SCp)
112 res = minimize_scalar(f, bounds=(0,1), method='bounded')
113
114 def utility_function(d1t,g1,dat,gc,G,SR,T60,T60min,T60max,D,Dmin,Dmax,C,Cmin,Cmax,Tc,Tcmin,Tcmax,SC,SCmin,SCmax):
115 d1 = int(d1t*SR)
116 da = int(dat*SR)
117 T60p = estimate_T60(d1,g1,da,G,gc,SR)
118 Dp = estimate_D(d1,g1,da,G,gc,SR)
119 Cp = estimate_C(d1,g1,da,G,gc,SR)
120
121
122 Tcp = estimate_Tc(d1,g1,da,G,gc,SR)
123 SCp = estimate_SC(d1,g1,da,G,gc,SR)
124
125 T60err = abs(T60p-T60)/(T60max-T60min)
126 Derr = abs(Dp-D)/(Dmax-Dmin)
127 Cerr = abs(Cp-C)/(Cmax-Cmin)
128 Tcerr = abs(Tcp-Tc)/(Tcmax-Tcmin)
129 Scerr = abs(SCp-SC)/(SCmax-SCmin)
130
131
132 return T60err + Derr + Cerr + Tcerr + Scerr
133
134 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)
135
136
137 g1x = arange(0.01,0.99,0.01)
138 #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)]
139
140 d1x = arange(0.01,0.1,0.001)*SR
141 #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]
142
143 dax = arange(0.006, 0.012, 0.001)*SR
144 #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]
145
146 gcx = arange(0.01, 0.99, 0.01)
147 #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]
148
149
150 flist = [estimate_T60, estimate_D, estimate_C, estimate_Tc, estimate_SC]
151 ix = 0
152 for func in flist:
153 p1 = d1x
154 p2 = g1x
155
156 image = zeros((len(p1), len(p2)))
157 for i in range(0, len(p1)):
158 for j in range(0, len(p2)):
159 image[i,j] = func(int(p1[i]), p2[j], int(0.012*SR), 0.5, 0.5, SR)
160 figure()
161 imshow(image)
162 ylabel('g1')
163 xlabel('d1')
164 imsave(arr=image, fname='%d-g1-d1.pgf' % ix)
165
166 show()
167
168
169
170
171
172
173
174