summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorPeter D'Hoye <peter.dhoye@gmail.com>2006-07-02 22:36:46 +0000
committerPeter D'Hoye <peter.dhoye@gmail.com>2006-07-02 22:36:46 +0000
commit96d269e059203b3a2a9b5bc2d083623e45091682 (patch)
treeb776dc87fa20ed66a72326d8cebec689ec62662f /apps
parentf64280ff00bbf131b82322cb2fe138b259ebc5c3 (diff)
downloadrockbox-96d269e059203b3a2a9b5bc2d083623e45091682.zip
rockbox-96d269e059203b3a2a9b5bc2d083623e45091682.tar.gz
rockbox-96d269e059203b3a2a9b5bc2d083623e45091682.tar.bz2
rockbox-96d269e059203b3a2a9b5bc2d083623e45091682.tar.xz
Increased peakmeter accuracy in the (for recording important) -12 to 0 dB range. Patch 5022 by Jvo Studer.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10177 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/recorder/peakmeter.c120
1 files changed, 55 insertions, 65 deletions
diff --git a/apps/recorder/peakmeter.c b/apps/recorder/peakmeter.c
index 49e74de..2b85513 100644
--- a/apps/recorder/peakmeter.c
+++ b/apps/recorder/peakmeter.c
@@ -139,17 +139,17 @@ static const long clip_time_out[] = {
/* precalculated peak values that represent magical
dBfs values. Used to draw the scale */
static const int db_scale_src_values[DB_SCALE_SRC_VALUES_SIZE] = {
- 32752, /* 0 db */
- 22784, /* - 3 db */
- 14256, /* - 6 db */
- 11752, /* - 9 db */
- 9256, /* -12 db */
- 4256, /* -18 db */
- 2186, /* -24 db */
- 1186, /* -30 db */
- 373, /* -40 db */
- 102, /* -50 db */
- 33, /* -60 db */
+ 32736, /* 0 db */
+ 22752, /* - 3 db */
+ 16640, /* - 6 db */
+ 11648, /* - 9 db */
+ 8320, /* -12 db */
+ 4364, /* -18 db */
+ 2064, /* -24 db */
+ 1194, /* -30 db */
+ 363, /* -40 db */
+ 101, /* -50 db */
+ 34, /* -60 db */
0, /* -inf */
};
@@ -160,17 +160,19 @@ static int db_scale_count = DB_SCALE_SRC_VALUES_SIZE;
* @param int sample - The input value
* Make sure that 0 <= value < SAMPLE_RANGE
*
- * @return int - The 2 digit fixed comma result of the euation
+ * @return int - The 2 digit fixed point result of the euation
* 20 * log (sample / SAMPLE_RANGE) + 90
- * Output range is 0-8961 (that is 0,0 - 89,6 dB).
+ * Output range is 0-9000 (that is 0.0 - 90.0 dB).
* Normally 0dB is full scale, here it is shifted +90dB.
* The calculation is based on the results of a linear
* approximation tool written specifically for this problem
- * by Andreas Zwirtes (radhard@gmx.de). The result hat an
+ * by Andreas Zwirtes (radhard@gmx.de). The result has an
* accurracy of better than 2%. It is highly runtime optimized,
* the cascading if-clauses do an successive approximation on
* the input value. This avoids big lookup-tables and
* for-loops.
+ * Improved by Jvo Studer for errors < 0.2dB for critical
+ * range of -12dB to 0dB (78.0 to 90.0dB).
*/
int calc_db (int isample)
@@ -180,81 +182,69 @@ int calc_db (int isample)
long m;
int istart;
- /* Range 1-4 */
- if (isample < 119) {
+ if (isample < 2308) { /* Range 1-5 */
- /* Range 1-2 */
- if (isample < 5) {
+ if (isample < 115) { /* Range 1-3 */
- /* Range 1 */
- if (isample < 1) {
- istart = 0;
- n = 0;
- m = 5900;
- }
+ if (isample < 24) {
- /* Range 2 */
- else {
- istart = 1;
- n = 59;
+ if (isample < 5) {
+ istart = 1; /* Range 1 */
+ n = 98;
m = 34950;
}
- }
-
- /* Range 3-4 */
else {
-
- /* Range 3 */
- if (isample < 24) {
- istart = 5;
- n = 1457;
+ istart = 5; /* Range 2 */
+ n = 1496;
m = 7168;
}
+ }
+ else {
+ istart = 24; /* Range 3 */
+ n = 2858;
+ m = 1498;
+ }
+ }
+ else { /* Range 4-5 */
- /* Range 4 */
+ if (isample < 534) {
+ istart = 114; /* Range 4 */
+ n = 4207;
+ m = 319;
+ }
else {
- istart = 24;
- n = 2819;
- m = 1464;
+ istart = 588; /* Range 5 */
+ n = 5583;
+ m = 69;
}
}
}
- /* Range 5-8 */
- else {
+ else { /* Range 6-9 */
- /* Range 5-6 */
- if (isample < 2918) {
+ if (isample < 12932) {
- /* Range 5 */
- if (isample < 592) {
- istart = 119;
- n = 4210;
- m = 295;
+ if (isample < 6394) {
+ istart = 2608; /* Range 6 */
+ n = 6832;
+ m = 21;
}
-
- /* Range 6 */
else {
- istart = 592;
- n = 5605;
- m = 60;
+ istart = 7000; /* Range 7 */
+ n = 7682;
+ m = 9;
}
}
-
- /* Range 7-8 */
else {
- /* Range 7 */
- if (isample < 15352) {
- istart = 2918;
- n = 7001;
- m = 12;
+ if (isample < 22450) {
+ istart = 13000; /* Range 8 */
+ n = 8219;
+ m = 5;
}
-
- /* Range 8 */
else {
- istart = 15352;
- n = 8439;
+ istart = 22636; /* Range 9 */
+ n = 8697;
m = 3;
}
}