@ -30,110 +30,6 @@
# include "libavutil/cpu.h"
# include "resample.h"
static inline double eval_poly ( const double * coeff , int size , double x ) {
double sum = coeff [ size - 1 ] ;
int i ;
for ( i = size - 2 ; i > = 0 ; - - i ) {
sum * = x ;
sum + = coeff [ i ] ;
}
return sum ;
}
/**
* 0 th order modified bessel function of the first kind .
* Algorithm taken from the Boost project , source :
* https : //searchcode.com/codesearch/view/14918379/
* Use , modification and distribution are subject to the
* Boost Software License , Version 1.0 ( see notice below ) .
* Boost Software License - Version 1.0 - August 17 th , 2003
Permission is hereby granted , free of charge , to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license ( the " Software " ) to use , reproduce , display , distribute ,
execute , and transmit the Software , and to prepare derivative works of the
Software , and to permit third - parties to whom the Software is furnished to
do so , all subject to the following :
The copyright notices in the Software and this entire statement , including
the above license grant , this restriction and the following disclaimer ,
must be included in all copies of the Software , in whole or in part , and
all derivative works of the Software , unless such copies or derivative
works are solely in the form of machine - executable object code generated by
a source language processor .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE , TITLE AND NON - INFRINGEMENT . IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY , WHETHER IN CONTRACT , TORT OR OTHERWISE ,
ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE .
*/
static double bessel ( double x ) {
// Modified Bessel function of the first kind of order zero
// minimax rational approximations on intervals, see
// Blair and Edwards, Chalk River Report AECL-4928, 1974
static const double p1 [ ] = {
- 2.2335582639474375249e+15 ,
- 5.5050369673018427753e+14 ,
- 3.2940087627407749166e+13 ,
- 8.4925101247114157499e+11 ,
- 1.1912746104985237192e+10 ,
- 1.0313066708737980747e+08 ,
- 5.9545626019847898221e+05 ,
- 2.4125195876041896775e+03 ,
- 7.0935347449210549190e+00 ,
- 1.5453977791786851041e-02 ,
- 2.5172644670688975051e-05 ,
- 3.0517226450451067446e-08 ,
- 2.6843448573468483278e-11 ,
- 1.5982226675653184646e-14 ,
- 5.2487866627945699800e-18 ,
} ;
static const double q1 [ ] = {
- 2.2335582639474375245e+15 ,
7.8858692566751002988e+12 ,
- 1.2207067397808979846e+10 ,
1.0377081058062166144e+07 ,
- 4.8527560179962773045e+03 ,
1.0 ,
} ;
static const double p2 [ ] = {
- 2.2210262233306573296e-04 ,
1.3067392038106924055e-02 ,
- 4.4700805721174453923e-01 ,
5.5674518371240761397e+00 ,
- 2.3517945679239481621e+01 ,
3.1611322818701131207e+01 ,
- 9.6090021968656180000e+00 ,
} ;
static const double q2 [ ] = {
- 5.5194330231005480228e-04 ,
3.2547697594819615062e-02 ,
- 1.1151759188741312645e+00 ,
1.3982595353892851542e+01 ,
- 6.0228002066743340583e+01 ,
8.5539563258012929600e+01 ,
- 3.1446690275135491500e+01 ,
1.0 ,
} ;
double y , r , factor ;
if ( x = = 0 )
return 1.0 ;
x = fabs ( x ) ;
if ( x < = 15 ) {
y = x * x ;
return eval_poly ( p1 , FF_ARRAY_ELEMS ( p1 ) , y ) / eval_poly ( q1 , FF_ARRAY_ELEMS ( q1 ) , y ) ;
}
else {
y = 1 / x - 1.0 / 15 ;
r = eval_poly ( p2 , FF_ARRAY_ELEMS ( p2 ) , y ) / eval_poly ( q2 , FF_ARRAY_ELEMS ( q2 ) , y ) ;
factor = exp ( x ) / sqrt ( x ) ;
return factor * r ;
}
}
/**
* builds a polyphase filterbank .
* @ param factor resampling factor
@ -189,7 +85,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
break ;
case SWR_FILTER_TYPE_KAISER :
w = 2.0 * x / ( factor * tap_count * M_PI ) ;
y * = bessel ( kaiser_beta * sqrt ( FFMAX ( 1 - w * w , 0 ) ) ) ;
y * = av_ bessel_i0 ( kaiser_beta * sqrt ( FFMAX ( 1 - w * w , 0 ) ) ) ;
break ;
default :
av_assert0 ( 0 ) ;