3 * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #ifndef AVCODEC_OPUSENC_UTILS_H
23 #define AVCODEC_OPUSENC_UTILS_H
27 typedef struct FFBesselFilter
{
34 /* Fills the coefficients, returns 1 if filter will be unstable */
35 static inline int bessel_reinit(FFBesselFilter
*s
, float n
, float f0
, float fs
,
39 float c
, cfreq
, w0
, k1
, k2
;
42 c
= (1.0f
/sqrtf(sqrtf(pow(2.0f
, 1.0f
/n
) - 3.0f
/4.0f
) - 0.5f
))/sqrtf(3.0f
);
44 unstable
= (cfreq
<= 0.0f
|| cfreq
>= 1.0f
/4.0f
);
46 c
= sqrtf(3.0f
)*sqrtf(sqrtf(pow(2.0f
, 1.0f
/n
) - 3.0f
/4.0f
) - 0.5f
);
47 cfreq
= 0.5f
- c
*f0
/fs
;
48 unstable
= (cfreq
<= 3.0f
/8.0f
|| cfreq
>= 1.0f
/2.0f
);
51 w0
= tanf(M_PI
*cfreq
);
55 s
->a
[0] = k2
/(1.0f
+ k1
+ k2
);
56 s
->a
[1] = 2.0f
* s
->a
[0];
58 s
->b
[0] = 2.0f
* s
->a
[0] * (1.0f
/k2
- 1.0f
);
59 s
->b
[1] = 1.0f
- (s
->a
[0] + s
->a
[1] + s
->a
[2] + s
->b
[0]);
69 static inline int bessel_init(FFBesselFilter
*s
, float n
, float f0
, float fs
,
72 memset(s
, 0, sizeof(FFBesselFilter
));
73 return bessel_reinit(s
, n
, f0
, fs
, highpass
);
76 static inline float bessel_filter(FFBesselFilter
*s
, float x
)
83 s
->y
[0] = s
->a
[0]*s
->x
[0] + s
->a
[1]*s
->x
[1] + s
->a
[2]*s
->x
[2] + s
->b
[0]*s
->y
[1] + s
->b
[1]*s
->y
[2];
87 #endif /* AVCODEC_OPUSENC_UTILS_H */