/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef RESAMPLER_HYPERBOLIC_COSINE_WINDOW_H
#define RESAMPLER_HYPERBOLIC_COSINE_WINDOW_H

#include <math.h>

namespace resampler {

/**
 * Calculate a HyperbolicCosineWindow window centered at 0.
 * This can be used in place of a Kaiser window.
 *
 * The code is based on an anonymous contribution by "a concerned citizen":
 * https://dsp.stackexchange.com/questions/37714/kaiser-window-approximation
 */
class HyperbolicCosineWindow {
public:
    HyperbolicCosineWindow() {
        setStopBandAttenuation(60);
    }

    /**
     * @param attenuation typical values range from 30 to 90 dB
     * @return beta
     */
    double setStopBandAttenuation(double attenuation) {
        double alpha = ((-325.1e-6 * attenuation + 0.1677) * attenuation) - 3.149;
        setAlpha(alpha);
        return alpha;
    }

    void setAlpha(double alpha) {
        mAlpha = alpha;
        mInverseCoshAlpha = 1.0 / cosh(alpha);
    }

    /**
     * @param x ranges from -1.0 to +1.0
     */
    double operator()(double x) {
        double x2 = x * x;
        if (x2 >= 1.0) return 0.0;
        double w = mAlpha * sqrt(1.0 - x2);
        return cosh(w) * mInverseCoshAlpha;
    }

private:
    double mAlpha = 0.0;
    double mInverseCoshAlpha = 1.0;
};

} // namespace resampler
#endif //RESAMPLER_HYPERBOLIC_COSINE_WINDOW_H
