protected sealed override void Apply1DFilter(Range range, Signal1D <double> yExt, Signal1D <double> xExt)
        {
            range.GetBounds(out int i0, out int i1);

            // Parameters defined in Table F.4

            const double alpha = -1.586134342059924;
            const double beta  = -0.052980118572961;
            const double gamma = 0.882911075530934;
            const double delta = 0.443506852043971;
            const double kappa = 1.230174104914001;

            var n0 = FloorDiv(i0, 2);
            var n1 = FloorDiv(i1, 2);

            // Equation F.7 - Step 1

            for (var n = n0 - 1; n < n1 + 2; n++)
            {
                xExt[2 * n] = kappa * yExt[2 * n];
            }

            // Equation F.7 - Step 2

            for (var n = n0 - 2; n < n1 + 2; n++)
            {
                xExt[2 * n + 1] = (1 / kappa) * yExt[2 * n + 1];
            }

            // Equation F.7 - Step 3

            for (var n = n0 - 1; n < n1 + 2; n++)
            {
                xExt[2 * n] = xExt[2 * n] - delta * (xExt[2 * n - 1] + xExt[2 * n + 1]);
            }

            // Equation F.7 - Step 4

            for (var n = n0 - 1; n < n1 + 1; n++)
            {
                xExt[2 * n + 1] = xExt[2 * n + 1] - gamma * (xExt[2 * n] + xExt[2 * n + 2]);
            }

            // Equation F.7 - Step 5

            for (var n = n0; n < n1 + 1; n++)
            {
                xExt[2 * n] = xExt[2 * n] - beta * (xExt[2 * n - 1] + xExt[2 * n + 1]);
            }

            // Equation F.7 - Step 6

            for (var n = n0; n < n1; n++)
            {
                xExt[2 * n + 1] = xExt[2 * n + 1] - alpha * (xExt[2 * n] + xExt[2 * n + 2]);
            }
        }
        protected sealed override void Apply1DFilter(Range range, Signal1D <int> yExt, Signal1D <int> xExt)
        {
            range.GetBounds(out int i0, out int i1);

            var n0 = FloorDiv(i0, 2);
            var n1 = FloorDiv(i1, 2);

            // Equation F.5

            for (var n = n0; n < n1 + 1; n++)
            {
                xExt[2 * n] = yExt[2 * n] - FloorDiv(yExt[2 * n - 1] + yExt[2 * n + 1] + 2, 4);
            }

            // Equation F.6

            for (var n = n0; n < n1; n++)
            {
                xExt[2 * n + 1] = yExt[2 * n + 1] + FloorDiv(xExt[2 * n] + xExt[2 * n + 2], 2);
            }
        }
 public ThreadLocal1DSubbandReconstructionState(Range extendedRange)
 {
     YExt = new Signal1D <T>(extendedRange);
     XExt = new Signal1D <T>(extendedRange);
 }