1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00
2020-02-27 00:52:34 -06:00

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