Commit 40c6d9ee authored by Stefan Westerfeld's avatar Stefan Westerfeld

Make Limiter parameters configurable: attack / release.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent b7e7edad
......@@ -7,17 +7,31 @@
using std::vector;
using std::max;
Limiter::Limiter (int sample_rate)
Limiter::Limiter (int sample_rate) :
sample_rate (sample_rate)
{
look_ahead = sample_rate * 0.005;
assert (look_ahead >= 1);
}
void
Limiter::set_attack (double attack_ms)
{
look_ahead = sample_rate / 1000.0 * attack_ms;
look_ahead = max (look_ahead, 1u);
}
decay_coeff = exp (log (0.5) / (sample_rate * 0.05));
void
Limiter::set_release (double release_ms)
{
release_factor = exp (log (0.5) / (sample_rate / 1000.0 * release_ms));
release_factor = max (release_factor, 0.5);
}
vector<float>
Limiter::process (const vector<float>& samples)
{
assert (look_ahead >= 1);
assert (release_factor > 0 && release_factor < 1);
for (size_t i = 0; i < samples.size(); i++)
{
buffer.push_back (samples[i]);
......@@ -44,7 +58,7 @@ Limiter::process (const vector<float>& samples)
size_t todo = buffer.size() - look_ahead;
for (size_t i = 0; i < todo; i++)
{
maximum = maximum * decay_coeff + max_buffer[i] * (1 - decay_coeff);
maximum = maximum * release_factor + max_buffer[i] * (1 - release_factor);
if (maximum < max_buffer[i])
maximum = max_buffer[i];
......
......@@ -6,15 +6,19 @@
class Limiter
{
float maximum = 1;
double decay_coeff = 1;
uint look_ahead = 0;
double maximum = 1;
double release_factor = 0;
uint look_ahead = 0;
uint sample_rate = 0;
std::vector<float> max_buffer;
std::vector<float> buffer;
public:
Limiter (int sample_rate);
void set_release (double value_ms);
void set_attack (double value_ms);
std::vector<float> process (const std::vector<float>& samples);
};
......
......@@ -34,6 +34,8 @@ main (int argc, char **argv)
return 1;
}
Limiter limiter (in.sample_rate());
limiter.set_attack (5);
limiter.set_release (50);
vector<float> samples;
do
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment