📄 decibels.cpp
字号:
0x361A, // (-135/10)dB = 0.211349 * amplitude
0x36BB, // (-134/10)dB = 0.213796 * amplitude
0x375D, // (-133/10)dB = 0.216272 * amplitude
0x3801, // (-132/10)dB = 0.218776 * amplitude
0x38A7, // (-131/10)dB = 0.221309 * amplitude
0x394F, // (-130/10)dB = 0.223872 * amplitude
0x39F9, // (-129/10)dB = 0.226464 * amplitude
0x3AA5, // (-128/10)dB = 0.229087 * amplitude
0x3B53, // (-127/10)dB = 0.231739 * amplitude
0x3C03, // (-126/10)dB = 0.234423 * amplitude
0x3CB5, // (-125/10)dB = 0.237137 * amplitude
0x3D68, // (-124/10)dB = 0.239883 * amplitude
0x3E1F, // (-123/10)dB = 0.242661 * amplitude
0x3ED7, // (-122/10)dB = 0.245471 * amplitude
0x3F91, // (-121/10)dB = 0.248313 * amplitude
0x404D, // (-120/10)dB = 0.251189 * amplitude
0x410C, // (-119/10)dB = 0.254097 * amplitude
0x41CD, // (-118/10)dB = 0.257040 * amplitude
0x4290, // (-117/10)dB = 0.260016 * amplitude
0x4355, // (-116/10)dB = 0.263027 * amplitude
0x441D, // (-115/10)dB = 0.266073 * amplitude
0x44E7, // (-114/10)dB = 0.269153 * amplitude
0x45B3, // (-113/10)dB = 0.272270 * amplitude
0x4682, // (-112/10)dB = 0.275423 * amplitude
0x4753, // (-111/10)dB = 0.278612 * amplitude
0x4826, // (-110/10)dB = 0.281838 * amplitude
0x48FC, // (-109/10)dB = 0.285102 * amplitude
0x49D4, // (-108/10)dB = 0.288403 * amplitude
0x4AAF, // (-107/10)dB = 0.291743 * amplitude
0x4B8D, // (-106/10)dB = 0.295121 * amplitude
0x4C6D, // (-105/10)dB = 0.298538 * amplitude
0x4D4F, // (-104/10)dB = 0.301995 * amplitude
0x4E34, // (-103/10)dB = 0.305492 * amplitude
0x4F1C, // (-102/10)dB = 0.309030 * amplitude
0x5007, // (-101/10)dB = 0.312608 * amplitude
0x50F4, // (-100/10)dB = 0.316228 * amplitude
0x51E4, // (-99/10)dB = 0.319890 * amplitude
0x52D7, // (-98/10)dB = 0.323594 * amplitude
0x53CC, // (-97/10)dB = 0.327341 * amplitude
0x54C5, // (-96/10)dB = 0.331131 * amplitude
0x55C0, // (-95/10)dB = 0.334965 * amplitude
0x56BE, // (-94/10)dB = 0.338844 * amplitude
0x57BF, // (-93/10)dB = 0.342768 * amplitude
0x58C3, // (-92/10)dB = 0.346737 * amplitude
0x59CA, // (-91/10)dB = 0.350752 * amplitude
0x5AD5, // (-90/10)dB = 0.354813 * amplitude
0x5BE2, // (-89/10)dB = 0.358922 * amplitude
0x5CF2, // (-88/10)dB = 0.363078 * amplitude
0x5E06, // (-87/10)dB = 0.367282 * amplitude
0x5F1C, // (-86/10)dB = 0.371535 * amplitude
0x6036, // (-85/10)dB = 0.375837 * amplitude
0x6154, // (-84/10)dB = 0.380189 * amplitude
0x6274, // (-83/10)dB = 0.384592 * amplitude
0x6398, // (-82/10)dB = 0.389045 * amplitude
0x64BF, // (-81/10)dB = 0.393550 * amplitude
0x65EA, // (-80/10)dB = 0.398107 * amplitude
0x6718, // (-79/10)dB = 0.402717 * amplitude
0x684A, // (-78/10)dB = 0.407380 * amplitude
0x697F, // (-77/10)dB = 0.412098 * amplitude
0x6AB7, // (-76/10)dB = 0.416869 * amplitude
0x6BF4, // (-75/10)dB = 0.421697 * amplitude
0x6D34, // (-74/10)dB = 0.426580 * amplitude
0x6E78, // (-73/10)dB = 0.431519 * amplitude
0x6FBF, // (-72/10)dB = 0.436516 * amplitude
0x710A, // (-71/10)dB = 0.441570 * amplitude
0x7259, // (-70/10)dB = 0.446684 * amplitude
0x73AC, // (-69/10)dB = 0.451856 * amplitude
0x7503, // (-68/10)dB = 0.457088 * amplitude
0x765E, // (-67/10)dB = 0.462381 * amplitude
0x77BD, // (-66/10)dB = 0.467735 * amplitude
0x7920, // (-65/10)dB = 0.473151 * amplitude
0x7A87, // (-64/10)dB = 0.478630 * amplitude
0x7BF2, // (-63/10)dB = 0.484172 * amplitude
0x7D62, // (-62/10)dB = 0.489779 * amplitude
0x7ED5, // (-61/10)dB = 0.495450 * amplitude
0x804D, // (-60/10)dB = 0.501187 * amplitude
0x81CA, // (-59/10)dB = 0.506991 * amplitude
0x834A, // (-58/10)dB = 0.512861 * amplitude
0x84D0, // (-57/10)dB = 0.518800 * amplitude
0x8659, // (-56/10)dB = 0.524807 * amplitude
0x87E8, // (-55/10)dB = 0.530884 * amplitude
0x897A, // (-54/10)dB = 0.537032 * amplitude
0x8B12, // (-53/10)dB = 0.543250 * amplitude
0x8CAE, // (-52/10)dB = 0.549541 * amplitude
0x8E4F, // (-51/10)dB = 0.555904 * amplitude
0x8FF5, // (-50/10)dB = 0.562341 * amplitude
0x91A0, // (-49/10)dB = 0.568853 * amplitude
0x9350, // (-48/10)dB = 0.575440 * amplitude
0x9504, // (-47/10)dB = 0.582103 * amplitude
0x96BE, // (-46/10)dB = 0.588844 * amplitude
0x987D, // (-45/10)dB = 0.595662 * amplitude
0x9A41, // (-44/10)dB = 0.602560 * amplitude
0x9C0A, // (-43/10)dB = 0.609537 * amplitude
0x9DD9, // (-42/10)dB = 0.616595 * amplitude
0x9FAD, // (-41/10)dB = 0.623735 * amplitude
0xA186, // (-40/10)dB = 0.630957 * amplitude
0xA365, // (-39/10)dB = 0.638263 * amplitude
0xA549, // (-38/10)dB = 0.645654 * amplitude
0xA733, // (-37/10)dB = 0.653131 * amplitude
0xA923, // (-36/10)dB = 0.660693 * amplitude
0xAB18, // (-35/10)dB = 0.668344 * amplitude
0xAD13, // (-34/10)dB = 0.676083 * amplitude
0xAF14, // (-33/10)dB = 0.683912 * amplitude
0xB11B, // (-32/10)dB = 0.691831 * amplitude
0xB328, // (-31/10)dB = 0.699842 * amplitude
0xB53B, // (-30/10)dB = 0.707946 * amplitude
0xB755, // (-29/10)dB = 0.716143 * amplitude
0xB974, // (-28/10)dB = 0.724436 * amplitude
0xBB9A, // (-27/10)dB = 0.732825 * amplitude
0xBDC6, // (-26/10)dB = 0.741310 * amplitude
0xBFF9, // (-25/10)dB = 0.749894 * amplitude
0xC232, // (-24/10)dB = 0.758578 * amplitude
0xC471, // (-23/10)dB = 0.767361 * amplitude
0xC6B8, // (-22/10)dB = 0.776247 * amplitude
0xC905, // (-21/10)dB = 0.785236 * amplitude
0xCB59, // (-20/10)dB = 0.794328 * amplitude
0xCDB3, // (-19/10)dB = 0.803526 * amplitude
0xD015, // (-18/10)dB = 0.812831 * amplitude
0xD27E, // (-17/10)dB = 0.822243 * amplitude
0xD4EE, // (-16/10)dB = 0.831764 * amplitude
0xD765, // (-15/10)dB = 0.841395 * amplitude
0xD9E4, // (-14/10)dB = 0.851138 * amplitude
0xDC6A, // (-13/10)dB = 0.860994 * amplitude
0xDEF7, // (-12/10)dB = 0.870964 * amplitude
0xE18C, // (-11/10)dB = 0.881049 * amplitude
0xE429, // (-10/10)dB = 0.891251 * amplitude
0xE6CD, // (-9/10)dB = 0.901571 * amplitude
0xE979, // (-8/10)dB = 0.912011 * amplitude
0xEC2D, // (-7/10)dB = 0.922571 * amplitude
0xEEE9, // (-6/10)dB = 0.933254 * amplitude
0xF1AD, // (-5/10)dB = 0.944061 * amplitude
0xF47A, // (-4/10)dB = 0.954993 * amplitude
0xF74F, // (-3/10)dB = 0.966051 * amplitude
0xFA2C, // (-2/10)dB = 0.977237 * amplitude
0xFD11, // (-1/10)dB = 0.988553 * amplitude
0xFFFF // 0dB
};
#endif // USE_DB_CONV_LOOKUP
// The two routines that follow convert from a linear AmpFactor in the
// range 65535/65536 to 1/65536 to a decibel range of -100.00 to -0.01
// and vice versa.
//
// The amp factors are expressed in parts per 65536 as a 16 bit numerator,
// i.e. actual amplification is (ampfactor)/65536.
//
// The decibels are expressed as parts per 100. i.e. -100 means -1dB.
//
// Note that although a decibel is formally 10 * log10(x), the AmpFactor
// refers to voltages and the dB to powers, and power = v**2/r
// so the rule is dB = 20*log10(x)
//
// If you change one routine you will almost certainly have to change
// the other. In an ideal world the routines would be inverses
// meaning that the following is true
//
// AmpFactor == DBToAmpFactor(AmpFactorToDB(AmpFactor))
//
// HOWEVER many iterations are made through the routines. The
// secondary objective is to minimise the drift such that
// successive iterations do not stray too far from the starting
// point.
//
// This is clearly impossible because the quantisations are
// quite different. 10**-.005 = 1.0115 or 65536->64786, so if
// we start from (say) 65000 then something nasty must happen.
// likewise the difference between an amp factor of 1/65536 and
// 2/65536 is about 6dB - so much for the nearest hundredth!
//
// From here on we'll call them DB (even though that should be a
// dekabell (10 bells) to avoid confusion with hungarian.
//
//
// DBToAmpFactor
//
// Converts lDB, specified in 100ths decibels, into a
// linear amplification factor. For all lDB >= 0 this
// function returns 0xffff. This is because our current
// implementation of DirectSound doesn't allow amplification,
// and users of this function often require 16-bit results
//
DWORD DBToAmpFactor( LONG lDB )
{
#ifndef USE_DB_CONV_LOOKUP
double dAF;
// make mixer code work- it only handles 16-bit factors and cannot amplify
if (0 <= lDB) return 0x0000FFFF;
// input lDB is 100ths of decibels
dAF = pow(10.0, (0.5+((double)lDB))/2000.0);
// This gives me a number in the range 0-1
// normalise to 0-65535
return (DWORD)(dAF*65535);
#else // USE_DB_CONV_LOOKUP
DWORD dwFactor;
//
// bias and scale the input and check boundaries for indexing into table
//
lDB = (lDB-5)/10; // scaled to 1/10th dB units
if (lDB > 0) lDB = 0; // upper boundary
if (lDB < -964) return 0; // lower boundary
lDB = (lDB + 964); // bias
// lDB better be a good index
// ASSERT(lDB >= 0);
// ASSERT(lDB <= sizeof(tblDBTenthsToAmpFactor) / sizeof(tblDBTenthsToAmpFactor[0]));
dwFactor = (DWORD) tblDBTenthsToAmpFactor[lDB];
return dwFactor;
#endif // USE_DB_CONV_LOOKUP
}
LONG AmpFactorToDB( DWORD dwFactor )
{
#ifndef USE_DB_CONV_LOOKUP
if (1>=dwFactor) {
return -10000;
} else if (0xFFFF <= dwFactor) {
return 0; // This puts an upper bound - no amplification
} else {
return (LONG)(2000.0 * log10((-0.5+(double)dwFactor)/65536.0));
}
#else // USE_DB_CONV_LOOKUP
LONG lDB;
int iMin;
int iMax;
int iMiddle;
iMin = 0;
iMax = sizeof(tblDBTenthsToAmpFactor) / sizeof(tblDBTenthsToAmpFactor[0]) - 1;
#ifdef BINARY_CHOP
int i;
for (i = 0; i <= iMax - 1; i++) {
if (dwFactor <= (DWORD) tblDBTenthsToAmpFactor[i]) break;
}
lDB = (i - 964) * 10;
#else
//
// Binary search through the table of AmpFactors.
//
// iMin and iMax specify the range in which the result can be found this
// is initially the whole table.
//
// In each interation we reduce the range by half.
//
// Loop variant: iMax - iMin, which decreases in each iteration.
// Invariant: iMin <= iMax.
// Exit condition: iMin = iMax.
//
while (iMin != iMax) {
// ASSERT(iMin < iMax);
iMiddle = (iMin + iMax) / 2;
// Chose the half which includes dwFactor.
if (dwFactor <= tblDBTenthsToAmpFactor[iMiddle])
iMax = iMiddle; // iMin does not change
else
iMin = iMiddle + 1; // iMax does not change
}
lDB = (iMin - 964) * 10;
#endif
return lDB;
#endif // USE_DB_CONV_LOOKUP
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -