compress: Apply damping later.
authorAndre Noll <maan@tuebingen.mpg.de>
Mon, 23 Jul 2018 08:52:14 +0000 (10:52 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 2 Sep 2018 15:42:54 +0000 (17:42 +0200)
This changes the algorithm of the compress filter to apply the right
shift defined by the --damp argument *after* the peak value of the
current block has been computed. This makes damping orthogonal to
the dynamic volume adjustments.

However, we increase the downshift so that the initial value of the
gain multiplier results in a right shift by one. Hence the expected
peak value is 16384, so make this the default target gain.

compress_filter.c
m4/lls/filter_cmd.suite.m4

index f98fb41..0c76fd7 100644 (file)
@@ -48,8 +48,7 @@ static int compress_post_select(__a_unused struct sched *s, void *context)
        size_t length, i;
        int16_t *ip, *op;
        uint32_t inertia = U32_OPTVAL(INERTIA, fn->lpr);
-       unsigned gain_shift = inertia + U32_OPTVAL(DAMP, fn->lpr),
-               mask = (1U << U32_OPTVAL(BLOCKSIZE, fn->lpr)) - 1U;
+       unsigned mask = (1U << U32_OPTVAL(BLOCKSIZE, fn->lpr)) - 1U;
        //inplace = false;
 next_buffer:
        ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
@@ -78,7 +77,7 @@ next_buffer:
                        neg = true;
                }
                sample *= pcd->current_gain;
-               sample >>= gain_shift;
+               sample >>= inertia + 1;
                if (sample > 32767) { /* clip */
                        PARA_WARNING_LOG("clip: %d\n", sample);
                        sample = 32767;
@@ -87,11 +86,13 @@ next_buffer:
                        pcd->peak = 0;
                } else if (sample > pcd->peak)
                        pcd->peak = sample;
+               sample >>= U32_OPTVAL(DAMP, fn->lpr);
                op[i] = neg? -sample : sample;
                if (++pcd->num_samples & mask)
                        continue;
 //             PARA_DEBUG_LOG("gain: %u, peak: %u\n", pcd->current_gain,
 //                     pcd->peak);
+
                if (pcd->peak < U32_OPTVAL(TARGET_LEVEL, fn->lpr)) {
                        if (pcd->current_gain < pcd->max_gain)
                                pcd->current_gain++;
index 1399de6..dece6e6 100644 (file)
@@ -61,7 +61,7 @@ caption = filters
                typestr = level
                arg_info = required_arg
                arg_type = uint32
-               default_val = 20000
+               default_val = 16384
                [help]
                        If the peak of the previous block is less than the target level,
                        volume is increased slightly for the next block. Otherwise it is