00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "sampling.h"
00026 #include "paramset.h"
00027
00028 class LanczosSincFilter : public Filter {
00029 public:
00030 LanczosSincFilter(float xw,
00031 float yw,
00032 float t) : Filter(xw, yw) {
00033 tau = t;
00034 }
00035 float Evaluate(float x, float y) const;
00036 float Sinc1D(float x) const;
00037 private:
00038 float tau;
00039 };
00040
00041 float LanczosSincFilter::Evaluate(float x, float y) const{
00042 return Sinc1D(x * invXWidth) * Sinc1D(y * invYWidth);
00043 }
00044 float LanczosSincFilter::Sinc1D(float x) const {
00045 x = fabsf(x);
00046 if (x < 1e-5) return 1.f;
00047 if (x > 1.) return 0.f;
00048 x *= M_PI;
00049 float sinc = sinf(x * tau) / (x * tau);
00050 float lanczos = sinf(x) / x;
00051 return sinc * lanczos;
00052 }
00053 extern "C" DLLEXPORT Filter *CreateFilter(const ParamSet &ps) {
00054 float xw = ps.FindOneFloat("xwidth", 4.);
00055 float yw = ps.FindOneFloat("ywidth", 4.);
00056 float tau = ps.FindOneFloat("tau", 3.f);
00057 return new LanczosSincFilter(xw, yw, tau);
00058 }