xref: /aosp_15_r20/external/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h (revision 05767d913155b055644481607e6fa1e35e2fe72c)
1*05767d91SRobert Wu /*
2*05767d91SRobert Wu  * Copyright 2019 The Android Open Source Project
3*05767d91SRobert Wu  *
4*05767d91SRobert Wu  * Licensed under the Apache License, Version 2.0 (the "License");
5*05767d91SRobert Wu  * you may not use this file except in compliance with the License.
6*05767d91SRobert Wu  * You may obtain a copy of the License at
7*05767d91SRobert Wu  *
8*05767d91SRobert Wu  *      http://www.apache.org/licenses/LICENSE-2.0
9*05767d91SRobert Wu  *
10*05767d91SRobert Wu  * Unless required by applicable law or agreed to in writing, software
11*05767d91SRobert Wu  * distributed under the License is distributed on an "AS IS" BASIS,
12*05767d91SRobert Wu  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*05767d91SRobert Wu  * See the License for the specific language governing permissions and
14*05767d91SRobert Wu  * limitations under the License.
15*05767d91SRobert Wu  */
16*05767d91SRobert Wu 
17*05767d91SRobert Wu #ifndef RESAMPLER_HYPERBOLIC_COSINE_WINDOW_H
18*05767d91SRobert Wu #define RESAMPLER_HYPERBOLIC_COSINE_WINDOW_H
19*05767d91SRobert Wu 
20*05767d91SRobert Wu #include <math.h>
21*05767d91SRobert Wu 
22*05767d91SRobert Wu #include "ResamplerDefinitions.h"
23*05767d91SRobert Wu 
24*05767d91SRobert Wu namespace RESAMPLER_OUTER_NAMESPACE::resampler {
25*05767d91SRobert Wu 
26*05767d91SRobert Wu /**
27*05767d91SRobert Wu  * Calculate a HyperbolicCosineWindow window centered at 0.
28*05767d91SRobert Wu  * This can be used in place of a Kaiser window.
29*05767d91SRobert Wu  *
30*05767d91SRobert Wu  * The code is based on an anonymous contribution by "a concerned citizen":
31*05767d91SRobert Wu  * https://dsp.stackexchange.com/questions/37714/kaiser-window-approximation
32*05767d91SRobert Wu  */
33*05767d91SRobert Wu class HyperbolicCosineWindow {
34*05767d91SRobert Wu public:
HyperbolicCosineWindow()35*05767d91SRobert Wu     HyperbolicCosineWindow() {
36*05767d91SRobert Wu         setStopBandAttenuation(60);
37*05767d91SRobert Wu     }
38*05767d91SRobert Wu 
39*05767d91SRobert Wu     /**
40*05767d91SRobert Wu      * @param attenuation typical values range from 30 to 90 dB
41*05767d91SRobert Wu      * @return beta
42*05767d91SRobert Wu      */
setStopBandAttenuation(double attenuation)43*05767d91SRobert Wu     double setStopBandAttenuation(double attenuation) {
44*05767d91SRobert Wu         double alpha = ((-325.1e-6 * attenuation + 0.1677) * attenuation) - 3.149;
45*05767d91SRobert Wu         setAlpha(alpha);
46*05767d91SRobert Wu         return alpha;
47*05767d91SRobert Wu     }
48*05767d91SRobert Wu 
setAlpha(double alpha)49*05767d91SRobert Wu     void setAlpha(double alpha) {
50*05767d91SRobert Wu         mAlpha = alpha;
51*05767d91SRobert Wu         mInverseCoshAlpha = 1.0 / cosh(alpha);
52*05767d91SRobert Wu     }
53*05767d91SRobert Wu 
54*05767d91SRobert Wu     /**
55*05767d91SRobert Wu      * @param x ranges from -1.0 to +1.0
56*05767d91SRobert Wu      */
operator()57*05767d91SRobert Wu     double operator()(double x) {
58*05767d91SRobert Wu         double x2 = x * x;
59*05767d91SRobert Wu         if (x2 >= 1.0) return 0.0;
60*05767d91SRobert Wu         double w = mAlpha * sqrt(1.0 - x2);
61*05767d91SRobert Wu         return cosh(w) * mInverseCoshAlpha;
62*05767d91SRobert Wu     }
63*05767d91SRobert Wu 
64*05767d91SRobert Wu private:
65*05767d91SRobert Wu     double mAlpha = 0.0;
66*05767d91SRobert Wu     double mInverseCoshAlpha = 1.0;
67*05767d91SRobert Wu };
68*05767d91SRobert Wu 
69*05767d91SRobert Wu } /* namespace RESAMPLER_OUTER_NAMESPACE::resampler */
70*05767d91SRobert Wu 
71*05767d91SRobert Wu #endif //RESAMPLER_HYPERBOLIC_COSINE_WINDOW_H
72