我在OpenCL中实现了一个使用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的检查,则它不起作用。
有人能为我揭开光明吗? 弗洛里安
答案 0 :(得分:4)
保罗已经回答了,但是如果OP想知道为什么0是特殊情况=>
1)x-> 0,sin(x)/ x = 0/0,这是indeterminate form。
2)解决这个问题的一种方法是将sin(x)/ x扩展为关于零点的泰勒级数,通过这样做我们得到:
x2 x4 x6 x8 1 - ----- + ----- - ------ + ----------- + ... 6 120 5040 362880
3)通过将0代入x,我们看到该系列收敛到1。
答案 1 :(得分:3)
哦,伙计......我一直在看lanczos功能几个小时......并没有注意到sinc实际上是:
sinc -> sin(x)/x
因此0的特殊情况是防止除零...简单明了......