2

我在 OpenCL 中实现了一个简单的图像重采样器,它使用了 Lanczos 函数。

Lanczos 定义为: Lanczos 重采样

用 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 的检查,它就不起作用。

有人可以为我解释一下吗?弗洛里安

4

2 回答 2

4

保罗已经回答了,但如果 OP 想知道为什么 0 是特殊情况 =>

1) x->0, sin(x)/x = 0/0 这是不确定的形式

2) 解决这个问题的一种方法是将 sin(x)/x 展开为关于零点的泰勒级数,通过这样做我们得到:

       x 2         x 4         x 6          x 8
1 - ----- + ----- - ------ + ------------ + ...
       6 120 5040 362880

3) 通过将 0 代入 x,我们看到级数收敛到 1。

于 2011-01-14T17:43:39.633 回答
3

哦,伙计……我已经看了好几个小时的 lanczos 函数……并没有注意到 sinc 实际上是:

sinc -> sin(x)/x

所以 0 的特殊情况是防止被零除...简单明了...

于 2011-01-14T16:04:30.203 回答