e@1
|
1 /*
|
e@1
|
2 * Parameter.h
|
e@1
|
3 *
|
e@1
|
4 * Created on: Dec 14, 2016
|
e@1
|
5 * Author: Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk>
|
e@1
|
6 *
|
e@1
|
7 * For using that code in research please cite:
|
e@1
|
8 *
|
e@1
|
9 *
|
e@1
|
10 @Article{dlib09,
|
e@1
|
11 author = {Davis E. King},
|
e@1
|
12 title = {Dlib-ml: A Machine Learning Toolkit},
|
e@1
|
13 journal = {Journal of Machine Learning Research},
|
e@1
|
14 year = {2009},
|
e@1
|
15 volume = {10},
|
e@1
|
16 pages = {1755-1758},
|
e@1
|
17 }
|
e@1
|
18 *
|
e@1
|
19 *
|
e@1
|
20 */
|
e@1
|
21
|
e@1
|
22 #ifndef PARAMETER_H_
|
e@1
|
23 #define PARAMETER_H_
|
e@1
|
24
|
e@1
|
25 #include "limits.hpp"
|
e@1
|
26 #include <dlib/optimization.h>
|
e@1
|
27 #include <iostream>
|
e@1
|
28
|
e@1
|
29 /*
|
e@1
|
30 * Normalization function
|
e@1
|
31 */
|
e@1
|
32
|
e@1
|
33 #define _N(f, fmin, fmax) ((f-fmin) / (fmax-fmin))
|
e@1
|
34
|
e@1
|
35 using namespace dlib;
|
e@1
|
36 using namespace std;
|
e@1
|
37
|
e@1
|
38 typedef matrix<double,0,1> column_vector;
|
e@1
|
39
|
e@1
|
40 class Parameter {
|
e@1
|
41 private:
|
e@1
|
42
|
e@1
|
43 /*
|
e@1
|
44 * D1: First Comb Filter Delay
|
e@1
|
45 * G1: First Comb Filter Gain
|
e@1
|
46 * DA: All-pass Filter Delay
|
e@1
|
47 * GA (in limits.hpp): All-pass Filter gain
|
e@1
|
48 * GC: Low-pass Filter Gain
|
e@1
|
49 * G: Dry/Wet Mix
|
e@1
|
50 *
|
e@1
|
51 */
|
e@1
|
52
|
e@1
|
53 double D1, DA, G1, GC, G;
|
e@1
|
54
|
e@1
|
55 /*
|
e@1
|
56 * T60: Reverberation Time
|
e@1
|
57 * ED: Echo Density
|
e@1
|
58 * C: Clarity
|
e@1
|
59 * TC: Central Time
|
e@1
|
60 * SC: Spectral Centroid
|
e@1
|
61 * SC_MAX: Maximum Spectral Centroid (depends on sample rate)
|
e@1
|
62 *
|
e@1
|
63 */
|
e@1
|
64
|
e@1
|
65 double T60, ED, C, TC, SC, SC_MAX;
|
e@1
|
66
|
e@1
|
67 double SampleRate;
|
e@1
|
68
|
e@1
|
69 friend std::ostream& operator<<(std::ostream &s, const Parameter &p);
|
e@1
|
70
|
e@1
|
71 static double compute_T60(double _D1, double _G1, double _GC, double _G);
|
e@1
|
72 static double compute_ED(double _D1, double _DA);
|
e@1
|
73 static double compute_C(double _G1, double _GC, double _G);
|
e@1
|
74 static double compute_TC(double _D1, double _G1, double _DA);
|
e@1
|
75 static double compute_SC(double _GC, double _SR);
|
e@1
|
76
|
e@1
|
77 /*
|
e@1
|
78 * Functions used in computing the inverse mapping/
|
e@1
|
79 */
|
e@1
|
80
|
e@1
|
81 static double TC_G1_D1_ED(double _D1, double _G1, double _ED, double t=0.1);
|
e@1
|
82 static double T60_D1_G1_C(double _D1, double _G1, double _GC, double _C);
|
e@1
|
83 static double D1_G1_T60_C(double _G1, double _GC, double _T60, double _C);
|
e@1
|
84 static double G_G1_C(double _G1, double _GC, double _C);
|
e@1
|
85 static double DA_D1_ED(double _D1, double _ED, double t=0.1);
|
e@1
|
86
|
e@1
|
87 /*
|
e@1
|
88 * Function to minimize.
|
e@1
|
89 */
|
e@1
|
90
|
e@1
|
91 static double GC_SC(double _SC, double SR);
|
e@1
|
92 static double errorfunc(double _G1, double _GC, const matrix<double, 4, 1> &Target);
|
e@1
|
93 static matrix <double, 5, 1> inverse_mapping(double _T60, double _ED, double _C, double _TC, double _SC, double SampleRate, double _G1);
|
e@1
|
94
|
e@1
|
95
|
e@1
|
96 public:
|
e@1
|
97 Parameter(double SR=44100.0,
|
e@1
|
98 double _D1 = 0.05,
|
e@1
|
99 double _DA = 0.006,
|
e@1
|
100 double _G1 = 0.5,
|
e@1
|
101 double _GC = 0.5,
|
e@1
|
102 double _G = 0.5,
|
e@1
|
103 double _T60 = 0.423289,
|
e@1
|
104 double _ED = 6927.08,
|
e@1
|
105 double _C = -0.107798,
|
e@1
|
106 double _TC = 0.0490677,
|
e@1
|
107 double _SC = 6419.15
|
e@1
|
108 );
|
e@1
|
109 virtual ~Parameter();
|
e@1
|
110 double getC() const;
|
e@1
|
111 void setC(double c);
|
e@1
|
112 double getD1() const;
|
e@1
|
113 void setD1(double d1);
|
e@1
|
114 double getDa() const;
|
e@1
|
115 void setDa(double da);
|
e@1
|
116 double getEd() const;
|
e@1
|
117 void setEd(double ed);
|
e@1
|
118 double getG() const;
|
e@1
|
119 void setG(double g);
|
e@1
|
120 double getG1() const;
|
e@1
|
121 void setG1(double g1);
|
e@1
|
122 double getGc() const;
|
e@1
|
123 void setGc(double gc);
|
e@1
|
124 double getSampleRate() const;
|
e@1
|
125 void setSampleRate(double sampleRate);
|
e@1
|
126 double getSc() const;
|
e@1
|
127 void setSc(double sc);
|
e@1
|
128 double getT60() const;
|
e@1
|
129 void setT60(double t60);
|
e@1
|
130 double getTc() const;
|
e@1
|
131 void setTc(double tc);
|
e@1
|
132
|
e@1
|
133 /* compute functions */
|
e@1
|
134
|
e@1
|
135 /*
|
e@1
|
136 * Low level -> High level
|
e@1
|
137 */
|
e@1
|
138
|
e@1
|
139 int set_low_and_compute(double D1, double DA, double G1, double GC, double G);
|
e@1
|
140 int get_low_and_computer();
|
e@1
|
141
|
e@1
|
142 /*
|
e@1
|
143 * High level -> Low level
|
e@1
|
144 */
|
e@1
|
145
|
e@1
|
146 int set_high_and_compute(double T60, double ED, double C, double TC, double SC);
|
e@1
|
147 int get_high_and_compute();
|
e@1
|
148
|
e@1
|
149
|
e@1
|
150 };
|
e@1
|
151
|
e@1
|
152
|
e@1
|
153
|
e@1
|
154 #endif /* PARAMETER_H_ */
|