[FFmpeg-devel] [PATCH] eval: Add taylor series evaluation support.

Nicolas George nicolas.george at normalesup.org
Wed Feb 22 10:16:25 CET 2012


Le tridi 3 ventôse, an CCXX, Michael Niedermayer a écrit :
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
>  doc/eval.texi    |    7 +++++++
>  libavutil/eval.c |   20 +++++++++++++++++++-
>  2 files changed, 26 insertions(+), 1 deletions(-)
> 
> diff --git a/doc/eval.texi b/doc/eval.texi
> index 92fdc6d..b481bfe 100644
> --- a/doc/eval.texi
> +++ b/doc/eval.texi
> @@ -106,6 +106,13 @@ the evaluation of @var{y}, return 0 otherwise.
>  @item ifnot(x, y)
>  Evaluate @var{x}, and if the result is zero return the result of the
>  evaluation of @var{y}, return 0 otherwise.
> +
> + at item taylor(expr, x)
> +Evaluate a taylor series at x.
> +expr represents the LD(0)-th derivates of f(x) at 0.

Could the variable id be a parameter too? Maybe optional?

> +note, when you have the derivatives at y instead of 0
> +taylor(expr, x-y) can be used
> +When the series does not converge the results are undefined.

Do you have a practical use case in mind?

>  @end table
>  
>  The following constants are available:
> diff --git a/libavutil/eval.c b/libavutil/eval.c
> index 2ee3965..49079c5 100644
> --- a/libavutil/eval.c
> +++ b/libavutil/eval.c
> @@ -134,7 +134,7 @@ struct AVExpr {
>          e_squish, e_gauss, e_ld, e_isnan,
>          e_mod, e_max, e_min, e_eq, e_gt, e_gte,
>          e_pow, e_mul, e_div, e_add,
> -        e_last, e_st, e_while, e_floor, e_ceil, e_trunc,
> +        e_last, e_st, e_while, e_taylor, e_floor, e_ceil, e_trunc,
>          e_sqrt, e_not, e_random, e_hypot, e_gcd,
>          e_if, e_ifnot,
>      } type;
> @@ -181,6 +181,21 @@ static double eval_expr(Parser *p, AVExpr *e)
>                  d=eval_expr(p, e->param[1]);
>              return d;
>          }
> +        case e_taylor: {
> +            double t = 1, d = 0, ld, v;
> +            double x = eval_expr(p, e->param[1]);
> +            int i;
> +            for(i=0; i<1000; i++) {
> +                double ld = d;

ld is defined twice.

> +                p->var[0] = i;
> +                v = eval_expr(p, e->param[0]);
> +                d += t*v;
> +                if(ld==d && v)
> +                    break;

I am not sure if this test is correct: v could be very small but not zero,
and be much larger in a future evaluation.

> +                t *= x / (i+1);
> +            }
> +            return d;
> +        }
>          default: {
>              double d = eval_expr(p, e->param[0]);
>              double d2 = eval_expr(p, e->param[1]);
> @@ -318,6 +333,7 @@ static int parse_primary(AVExpr **e, Parser *p)
>      else if (strmatch(next, "isnan" )) d->type = e_isnan;
>      else if (strmatch(next, "st"    )) d->type = e_st;
>      else if (strmatch(next, "while" )) d->type = e_while;
> +    else if (strmatch(next, "taylor")) d->type = e_taylor;
>      else if (strmatch(next, "floor" )) d->type = e_floor;
>      else if (strmatch(next, "ceil"  )) d->type = e_ceil;
>      else if (strmatch(next, "trunc" )) d->type = e_trunc;
> @@ -698,6 +714,8 @@ int main(int argc, char **argv)
>          "if(1, 2)",
>          "ifnot(0, 23)",
>          "ifnot(1, NaN) + if(0, 1)",
> +        "taylor(1, 1)",
> +        "taylor(eq(mod(ld(0),4),1)-eq(mod(ld(0),4),3), PI/2)",
>          NULL
>      };

Regards,

-- 
  Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120222/f4f894e7/attachment.asc>


More information about the ffmpeg-devel mailing list