Зачем мне нужен особый случай для Ланцоша (0)? - PullRequest
2 голосов
/ 14 января 2011

Я реализовал простой преобразователь изображения в OpenCL, который использует функцию Ланцоша.

Ланцош определяется: Lanczos Resampling

Написано на C:

inline
float lanczos(float x, float a) {
  if( x > fabs(a) ) return 0.0f;
  if( x == 0.0f ) return 1.0f;
  float pix = pi * x;
  return sinc(pix)*sinc(pix/a);
}

Почему существует особый случай для 0?Когда я передаю 0 в формуляр, он возвращает 1. Но если я не включил проверку для x == 0, это не сработает.

Может ли кто-нибудь пролить свет на меня?Florian

Ответы [ 2 ]

4 голосов
/ 14 января 2011

Павел уже ответил, но в случае, если OP хочет знать, почему 0 это особый случай =>

1) x-> 0, sin (x) / x = 0/0, и это неопределенная форма .

2) Один из способов решения этой проблемы - разложить sin (x) / x в ряды Тейлора с нулевой точкой, выполнив следующее:

       x<sup>2</sup>        x<sup>4</sup>        x<sup>6</sup>         x<sup>8</sup>
1 -  -----  +  -----  - ------ + -----------  + ...
       6        120      5040      362880

3) Подставляя 0 в x, мы видим, что ряд сходится к 1.

3 голосов
/ 14 января 2011

О, боже ... я часами смотрел на функцию Ланцоша ... и не заметил, что на самом деле sinc:

sinc -> sin(x)/x

, поэтому особый случай для 0 - это предотвращениеделение на ноль ... просто и ясно ...

...