Mercurial > hg > chourdakisreiss2016
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 |