23 #ifndef FILTERMODELCONFIG_H
24 #define FILTERMODELCONFIG_H
55 mutable int index = 0;
59 std::uniform_real_distribution<double> unif(0., 1.);
60 std::default_random_engine re;
61 for (
int i=0; i<1024; i++)
64 double getNoise()
const { index = (index + 1) & 0x3ff;
return buffer[index]; }
73 static constexpr
double Ut = 26.0e-3;
83 const double vmin, vmax;
84 const double denorm, norm;
89 const double voice_voltage_range;
97 unsigned short* summer[5];
98 unsigned short* volume[16];
99 unsigned short* resonance[16];
112 inline double getVoiceVoltage(
float value,
unsigned int env)
const
114 return value * voice_voltage_range + getVoiceDC(env);
133 const Spline::Point *opamp_voltage,
139 void setUCox(
double new_uCox);
141 virtual double getVoiceDC(
unsigned int env)
const = 0;
154 const double r_N16 = 1. /
N16;
156 for (
int i = 0; i < 5; i++)
158 const int idiv = 2 + i;
159 const int size = idiv << 16;
160 const double n = idiv;
161 const double r_idiv = 1. / idiv;
163 summer[i] =
new unsigned short[size];
165 for (
int vi = 0; vi < size; vi++)
167 const double vin = vmin + vi * r_N16 * r_idiv;
168 summer[i][vi] = getNormalizedValue(opampModel.
solve(n, vin));
183 const double r_N16 = 1. /
N16;
185 for (
int i = 0; i < 8; i++)
187 const int idiv = (i == 0) ? 1 : i;
188 const int size = (i == 0) ? 1 : i << 16;
189 const double n = i * nRatio;
190 const double r_idiv = 1. / idiv;
192 mixer[i] =
new unsigned short[size];
194 for (
int vi = 0; vi < size; vi++)
196 const double vin = vmin + vi * r_N16 * r_idiv;
197 mixer[i][vi] = getNormalizedValue(opampModel.
solve(n, vin));
211 const double r_N16 = 1. /
N16;
213 for (
int n8 = 0; n8 < 16; n8++)
215 const int size = 1 << 16;
216 const double n = n8 / nDivisor;
218 volume[n8] =
new unsigned short[size];
220 for (
int vi = 0; vi < size; vi++)
222 const double vin = vmin + vi * r_N16;
223 volume[n8][vi] = getNormalizedValue(opampModel.
solve(n, vin));
237 const double r_N16 = 1. /
N16;
239 for (
int n8 = 0; n8 < 16; n8++)
241 const int size = 1 << 16;
243 resonance[n8] =
new unsigned short[size];
245 for (
int vi = 0; vi < size; vi++)
247 const double vin = vmin + vi * r_N16;
248 resonance[n8][vi] = getNormalizedValue(opampModel.
solve(resonance_n[n8], vin));
254 unsigned short** getVolume() {
return volume; }
255 unsigned short** getResonance() {
return resonance; }
256 unsigned short** getSummer() {
return summer; }
257 unsigned short** getMixer() {
return mixer; }
259 inline unsigned short getOpampRev(
int i)
const {
return opamp_rev[i]; }
260 inline double getVddt()
const {
return Vddt; }
261 inline double getVth()
const {
return Vth; }
265 inline unsigned short getNormalizedValue(
double value)
const
267 const double tmp =
N16 * (value - vmin);
268 assert(tmp >= 0. && tmp <= 65535.);
269 return static_cast<unsigned short>(tmp + rnd.getNoise());
272 inline unsigned short getNormalizedCurrentFactor(
double wl)
const
275 assert(tmp > -0.5 && tmp < 65535.5);
276 return static_cast<unsigned short>(tmp + 0.5);
279 inline unsigned short getNVmin()
const
281 const double tmp =
N16 * vmin;
282 assert(tmp > -0.5 && tmp < 65535.5);
283 return static_cast<unsigned short>(tmp + 0.5);
286 inline int getNormalizedVoice(
float value,
unsigned int env)
const
288 return static_cast<int>(getNormalizedValue(getVoiceVoltage(value, env)));
Definition: FilterModelConfig.h:39
void buildVolumeTable(const OpAmp &opampModel, double nDivisor)
Definition: FilterModelConfig.h:209
const double Vdd
Positive supply voltage.
Definition: FilterModelConfig.h:76
unsigned short * mixer[8]
Lookup tables for gain and summer op-amps in output stage / filter.
Definition: FilterModelConfig.h:96
void buildResonanceTable(const OpAmp &opampModel, const double resonance_n[16])
Definition: FilterModelConfig.h:235
double uCox
Transconductance coefficient: u*Cox.
Definition: FilterModelConfig.h:79
const double Vddt
Vdd - Vth.
Definition: FilterModelConfig.h:78
double currFactorCoeff
Current factor coefficient for op-amp integrators.
Definition: FilterModelConfig.h:92
const double C
Capacitor value.
Definition: FilterModelConfig.h:69
unsigned short opamp_rev[1<< 16]
Reverse op-amp transfer function.
Definition: FilterModelConfig.h:103
static constexpr double Ut
Transistor parameters.
Definition: FilterModelConfig.h:74
const double Vth
Threshold voltage.
Definition: FilterModelConfig.h:77
void buildMixerTable(const OpAmp &opampModel, double nRatio)
Definition: FilterModelConfig.h:181
const double N16
Fixed point scaling for 16 bit op-amp output.
Definition: FilterModelConfig.h:87
void buildSummerTable(const OpAmp &opampModel)
Definition: FilterModelConfig.h:152
double solve(double n, double vi) const
Definition: OpAmp.cpp:33
void reset() const
Definition: OpAmp.h:102