mirror of
https://github.com/libretro/RetroArch
synced 2025-03-31 10:20:41 +00:00
Read config in EQ.
This commit is contained in:
parent
95d1582f3c
commit
902c92acfc
@ -24,6 +24,10 @@
|
|||||||
#define M_PI 3.1415926535897932384626433832795
|
#define M_PI 3.1415926535897932384626433832795
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef min
|
||||||
|
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
struct eq_data
|
struct eq_data
|
||||||
{
|
{
|
||||||
rarch_fft_t *fft;
|
rarch_fft_t *fft;
|
||||||
@ -167,6 +171,7 @@ static void generate_response(rarch_fft_complex_t *response,
|
|||||||
}
|
}
|
||||||
|
|
||||||
float lerp = 0.5f;
|
float lerp = 0.5f;
|
||||||
|
// Edge case where i == samples.
|
||||||
if (end_freq > start_freq)
|
if (end_freq > start_freq)
|
||||||
lerp = (freq - start_freq) / (end_freq - start_freq);
|
lerp = (freq - start_freq) / (end_freq - start_freq);
|
||||||
float gain = (1.0f - lerp) * start_gain + lerp * end_gain;
|
float gain = (1.0f - lerp) * start_gain + lerp * end_gain;
|
||||||
@ -223,6 +228,7 @@ static void create_filter(struct eq_data *eq, unsigned size_log2,
|
|||||||
if (!fft || !time_filter)
|
if (!fft || !time_filter)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
|
// Make sure bands are in correct order.
|
||||||
qsort(gains, num_gains, sizeof(*gains), gains_cmp);
|
qsort(gains, num_gains, sizeof(*gains), gains_cmp);
|
||||||
|
|
||||||
// Compute desired filter response.
|
// Compute desired filter response.
|
||||||
@ -251,7 +257,7 @@ static void create_filter(struct eq_data *eq, unsigned size_log2,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Debugging.
|
// Debugging.
|
||||||
#if 1
|
#if 0
|
||||||
FILE *file = fopen("/tmp/test.txt", "w");
|
FILE *file = fopen("/tmp/test.txt", "w");
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
@ -272,13 +278,41 @@ end:
|
|||||||
static void *eq_init(const struct dspfilter_info *info,
|
static void *eq_init(const struct dspfilter_info *info,
|
||||||
const struct dspfilter_config *config, void *userdata)
|
const struct dspfilter_config *config, void *userdata)
|
||||||
{
|
{
|
||||||
|
unsigned i;
|
||||||
struct eq_data *eq = (struct eq_data*)calloc(1, sizeof(*eq));
|
struct eq_data *eq = (struct eq_data*)calloc(1, sizeof(*eq));
|
||||||
if (!eq)
|
if (!eq)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
unsigned size_log2 = 8;
|
const float default_freq[] = { 0.0f, info->input_rate };
|
||||||
|
const float default_gain[] = { 0.0f, 0.0f };
|
||||||
|
|
||||||
|
float beta;
|
||||||
|
config->get_float(userdata, "window_beta", &beta, 4.0f);
|
||||||
|
|
||||||
|
int size_log2;
|
||||||
|
config->get_int(userdata, "block_size_log2", &size_log2, 8);
|
||||||
unsigned size = 1 << size_log2;
|
unsigned size = 1 << size_log2;
|
||||||
|
|
||||||
|
struct eq_gain *gains = NULL;
|
||||||
|
float *frequencies, *gain;
|
||||||
|
unsigned num_freq, num_gain;
|
||||||
|
config->get_float_array(userdata, "frequencies", &frequencies, &num_freq, default_freq, 2);
|
||||||
|
config->get_float_array(userdata, "gains", &gain, &num_gain, default_gain, 2);
|
||||||
|
|
||||||
|
num_gain = num_freq = min(num_gain, num_freq);
|
||||||
|
|
||||||
|
gains = (struct eq_gain*)calloc(num_gain, sizeof(*gains));
|
||||||
|
if (!gains)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
for (i = 0; i < num_gain; i++)
|
||||||
|
{
|
||||||
|
gains[i].freq = 0.5f * frequencies[i] / info->input_rate;
|
||||||
|
gains[i].gain = pow(10.0, gain[i] / 20.0);
|
||||||
|
}
|
||||||
|
config->free(frequencies);
|
||||||
|
config->free(gain);
|
||||||
|
|
||||||
eq->block_size = size;
|
eq->block_size = size;
|
||||||
|
|
||||||
eq->save = (float*)calloc( size, 2 * sizeof(*eq->save));
|
eq->save = (float*)calloc( size, 2 * sizeof(*eq->save));
|
||||||
@ -293,27 +327,13 @@ static void *eq_init(const struct dspfilter_info *info,
|
|||||||
if (!eq->fft || !eq->fftblock || !eq->save || !eq->block || !eq->filter)
|
if (!eq->fft || !eq->fftblock || !eq->save || !eq->block || !eq->filter)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
//struct eq_gain *gains = NULL;
|
create_filter(eq, size_log2, gains, num_gain, beta);
|
||||||
//unsigned num_gains = 0;
|
|
||||||
struct eq_gain gains[] = {
|
|
||||||
{ 0.00f, 2.0f },
|
|
||||||
{ 0.04f, 1.0f },
|
|
||||||
{ 0.05f, 0.4f },
|
|
||||||
{ 0.06f, 1.0f },
|
|
||||||
{ 0.08f, 0.1f },
|
|
||||||
{ 0.15f, 0.1f },
|
|
||||||
{ 0.3f, 3.0f },
|
|
||||||
{ 0.5f, 0.25f },
|
|
||||||
{ 0.7f, 2.0f },
|
|
||||||
};
|
|
||||||
unsigned num_gains = sizeof(gains) / sizeof(gains[0]);
|
|
||||||
double beta = 5.0;
|
|
||||||
|
|
||||||
create_filter(eq, size_log2, gains, num_gains, beta);
|
|
||||||
|
|
||||||
|
free(gains);
|
||||||
return eq;
|
return eq;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
free(gains);
|
||||||
eq_free(eq);
|
eq_free(eq);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user