mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 16:10:06 +02:00
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
#ifndef _DB_H
|
|
#define _DB_H
|
|
|
|
#include "../ladspa-util.h"
|
|
|
|
void db_init();
|
|
static inline float f_lin2db_cube(float lin);
|
|
static inline float f_db2lin_cube(float db);
|
|
static inline float f_lin2db_lerp(float lin);
|
|
static inline float f_db2lin_lerp(float db);
|
|
|
|
extern float db_data[];
|
|
extern float lin_data[];
|
|
|
|
#define DB_TABLE_SIZE 1024
|
|
#define DB_MIN -60.0f
|
|
#define DB_MAX 24.0f
|
|
#define LIN_TABLE_SIZE 1024
|
|
#define LIN_MIN 0.0000000002f
|
|
#define LIN_MAX 9.0f
|
|
|
|
#ifdef DB_DEFAULT_CUBE
|
|
#define db2lin(a) f_db2lin_cube(a)
|
|
#define lin2db(a) f_lin2db_cube(a)
|
|
#else
|
|
#define db2lin(a) f_db2lin_lerp(a)
|
|
#define lin2db(a) f_lin2db_lerp(a)
|
|
#endif
|
|
|
|
static inline float f_db2lin_cube(float db)
|
|
{
|
|
float scale = (db - DB_MIN) * (float)LIN_TABLE_SIZE / (DB_MAX - DB_MIN);
|
|
int base = f_round(scale - 0.5f);
|
|
float ofs = scale - base;
|
|
|
|
if (base < 1) {
|
|
return 0.0f;
|
|
} else if (base > LIN_TABLE_SIZE - 3) {
|
|
return lin_data[LIN_TABLE_SIZE - 2];
|
|
}
|
|
return cube_interp(ofs, lin_data[base-1], lin_data[base], lin_data[base+1], lin_data[base+2]);
|
|
}
|
|
|
|
static inline float f_db2lin_lerp(float db)
|
|
{
|
|
float scale = (db - DB_MIN) * (float)LIN_TABLE_SIZE / (DB_MAX - DB_MIN);
|
|
int base = f_round(scale - 0.5f);
|
|
float ofs = scale - base;
|
|
|
|
if (base < 1) {
|
|
return 0.0f;
|
|
} else if (base > LIN_TABLE_SIZE - 3) {
|
|
return lin_data[LIN_TABLE_SIZE - 2];
|
|
}
|
|
return (1.0f - ofs) * lin_data[base] + ofs * lin_data[base+1];
|
|
}
|
|
|
|
static inline float f_lin2db_cube(float lin)
|
|
{
|
|
float scale = (lin - LIN_MIN) * (float)DB_TABLE_SIZE / (LIN_MAX - LIN_MIN);
|
|
int base = f_round(scale - 0.5f);
|
|
float ofs = scale - base;
|
|
|
|
if (base < 2) {
|
|
return db_data[2] * scale * 0.5f - 23 * (2.0f - scale);
|
|
} else if (base > DB_TABLE_SIZE - 3) {
|
|
return db_data[DB_TABLE_SIZE - 2];
|
|
}
|
|
return cube_interp(ofs, db_data[base-1], db_data[base], db_data[base+1], db_data[base+2]);
|
|
}
|
|
|
|
static inline float f_lin2db_lerp(float lin)
|
|
{
|
|
float scale = (lin - LIN_MIN) * (float)DB_TABLE_SIZE / (LIN_MAX - LIN_MIN);
|
|
int base = f_round(scale - 0.5f);
|
|
float ofs = scale - base;
|
|
|
|
if (base < 2) {
|
|
return db_data[2] * scale * 0.5f - 23.0f * (2.0f - scale);
|
|
} else if (base > DB_TABLE_SIZE - 2) {
|
|
return db_data[DB_TABLE_SIZE - 1];
|
|
}
|
|
return (1.0f - ofs) * db_data[base] + ofs * db_data[base+1];
|
|
}
|
|
|
|
#endif
|