22 const double sonie::RAP[] = {45, 55, 65, 71, 80, 90, 100, 120};
25 {-32, -24, -16, -10, -5, 0, -7, -3, 0, -2, 0}, {-29, -22, -15, -10, -4, 0, -7, -2, 0, -2, 0},
26 {-27, -19, -14, -9, -4, 0, -6, -2, 0, -2, 0}, {-25, -17, -12, -9, -3, 0, -5, -2, 0, -2, 0},
27 {-23, -16, -11, -7, -3, 0, -4, -1, 0, -1, 0}, {-20, -14, -10, -6, -3, 0, -4, -1, 0, -1, 0},
28 {-18, -12, -9, -6, -2, 0, -3, -1, 0, -1, 0}, {-15, -10, -8, -4, -2, 0, -3, -1, 0, -1, 0}};
30 const double sonie::LTQ[] = {30, 18, 12, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
32 const double sonie::A0[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5, -1.6, -3.2, -5.4, -5.6, -4, -1.5, 2, 5, 12};
34 const double sonie::DDF[] = {0, 0, 0.5, 0.9, 1.2, 1.6, 2.3, 2.8, 3, 2,
35 0, -1.4, -2, -1.9, -1, 0.5, 3, 4, 4.3, 4};
37 const double sonie::DCB[] = {-0.25, -0.6, -0.8, -0.8, -0.5, 0, 0.5, 1.1, 1.5, 1.7,
38 1.8, 1.8, 1.7, 1.6, 1.4, 1.2, 0.8, 0.5, 0, -0.5};
40 const double sonie::ZUP[] = {0.9, 1.8, 2.8, 3.5, 4.4, 5.4, 6.6, 7.9, 9.2, 10.6, 12.3,
41 13.8, 15.2, 16.7, 18.1, 19.3, 20.6, 21.8, 22.7, 23.6, 24};
43 const double sonie::RNS[] = {21.5, 18, 15.1, 11.5, 9, 6.1, 4.4, 3.1, 2.13,
44 1.36, 0.82, 0.42, 0.30, 0.22, 0.15, 0.10, 0.035, 0};
47 {13, 8.2, 6.3, 5.5, 5.5, 5.5, 5.5, 5.5}, {9, 7.5, 6, 5.1, 4.5, 4.5, 4.5, 4.5},
48 {7.8, 6.7, 5.6, 4.9, 4.4, 3.9, 3.9, 3.9}, {6.2, 5.4, 4.6, 4.0, 3.5, 3.2, 3.2, 3.2},
49 {4.5, 3.8, 3.6, 3.2, 2.9, 2.7, 2.7, 2.7}, {3.7, 3.0, 2.8, 2.35, 2.2, 2.2, 2.2, 2.2},
50 {2.9, 2.3, 2.1, 1.9, 1.8, 1.7, 1.7, 1.7}, {2.4, 1.7, 1.5, 1.35, 1.3, 1.3, 1.3, 1.3},
51 {1.95, 1.45, 1.3, 1.15, 1.1, 1.1, 1.1, 1.1}, {1.5, 1.2, 0.94, 0.86, 0.82, 0.82, 0.82, 0.82},
52 {0.72, 0.67, 0.64, 0.63, 0.62, 0.62, 0.62, 0.62}, {0.59, 0.53, 0.51, 0.50, 0.42, 0.42, 0.42, 0.42},
53 {0.40, 0.33, 0.26, 0.24, 0.24, 0.22, 0.22, 0.22}, {0.27, 0.21, 0.20, 0.18, 0.17, 0.17, 0.17, 0.17},
54 {0.16, 0.15, 0.14, 0.12, 0.11, 0.11, 0.11, 0.11}, {0.12, 0.11, 0.10, 0.08, 0.08, 0.08, 0.08, 0.08},
55 {0.09, 0.08, 0.07, 0.06, 0.06, 0.06, 0.06, 0.05}, {0.06, 0.05, 0.03, 0.02, 0.02, 0.02, 0.02, 0.02}};
57 sonie::sonie(
double* vectToct,
const unsigned short& champ ) : VectNiv3Oct(vectToct), Champ(champ)
89 for (
unsigned short i = 0; i < 28; i++)
104 return 10 * ::log10(val) / ::log10(2.0) + 40;
108 double phone = 40 * ::pow((val + 0.0005), 0.35);
109 return phone < 3.0 ? 3.0 : phone;
119 double TI[11] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
120 double GI[3] = {0.0, 0.0, 0.0};
121 double FNGI[3] = {0.0, 0.0, 0.0};
122 double LCB[3] = {0.0, 0.0, 0.0};
123 double LE[21] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
124 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
125 double NM[21] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
126 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
128 for (
unsigned short i = 0; i < 240; i++)
137 for (
unsigned short i = 0, j = 0; i < 11; i++)
146 TI[i] = ::pow(10.0, XP / 10.0);
150 GI[0] = TI[0] + TI[1] + TI[2] + TI[3] + TI[4] + TI[5];
151 GI[1] = TI[6] + TI[7] + TI[8];
152 GI[2] = TI[9] + TI[10];
154 for (
unsigned short i = 0; i < 3; i++)
156 FNGI[i] = 10 * ::log10(GI[i]);
159 for (
unsigned short i = 0; i < 3; i++)
169 const unsigned short NbandesCritiques = 20;
170 const double S = 0.25;
171 const double BarkStep = 0.1;
173 for (
unsigned short i = 0; i < NbandesCritiques + 1; i++)
182 LE[i] = LE[i] -
A0[i];
187 LE[i] = LE[i] +
DDF[i];
192 LE[i] = LE[i] -
DCB[i];
193 double MP1 = 0.0635 * ::pow(10.0, 0.025 *
LTQ[i]);
194 double MP2_1 = ::pow(10.0, (LE[i] -
LTQ[i]) / 10);
195 double MP2 = ::pow((1.0 - S + (S * MP2_1)), 0.25) - 1.0;
208 double KORRY = 0.4 + (0.32 * ::pow(NM[0], 0.2));
214 NM[0] = NM[0] * KORRY;
217 unsigned short IZ = 0;
218 unsigned short IG = 0;
230 for (
unsigned short i = 0, j = 0; i < NbandesCritiques; i++)
232 ZUPI =
ZUP[i] + 0.0001;
251 while ((
RNS[j] > NM[i]) && (j < 17))
259 N = N + N2 * (Z2 - Z1);
280 DZ = (N1 - N2) /
USL[j][IG];
287 N2 = N1 - DZ *
USL[j][IG];
289 N = N + DZ * (N1 + N2) / 2;
294 NS[IZ] = N1 - (k - Z1) *
USL[j][IG];
302 while ((N2 <=
RNS[j]) && (j < 17))
307 if ((N2 <=
RNS[j]) && (j >= 17))
326 N =
static_cast<double>(
ROUND(N * 1000)) / 1000.0;
330 N =
static_cast<double>(
ROUND(N * 100)) / 100.0;
334 for (
unsigned short i = 0; i < 240; i++)
All base classes related to 3D manipulation.
int ROUND(double a)
Compute the rounded value of a number.
double * N_Specif
Sonie Sp�cifique.
bool _isOk
Indication de bonne ex�cution du calcul.
double * BarkAxis
Vecteur des de bark sur lequel est calcul� N_specif.
static const double DCB[]
double LN
Niveau d'isosonie en phone.
double calcIsoSonie(const double &val)
Renvoie le niveau d'isosonie en phone.
sonie(double *vectToct, const unsigned short &champ=0)
Constructor.
static const double DLL[8][11]
double N_Tot
Sonie totale.
static const double RAP[]
static const double LTQ[]
static const double RNS[]
static const double ZUP[]
static const double DDF[]
static const double USL[18][8]
unsigned short Champ
Type de champ (0 = champ libre, 1 = champ diffus)
static const unsigned short Nbandes3Oct
Dimension du vecteur des valaur en 1/3 d'octave.
bool validation()
V�rification des donn�es d'entr�e.
double * VectNiv3Oct
Tableau de 28 doubles repr�sentant les valeurs par 1/3 d'octave sur la bande 25-10000 Hz.