-double sinc(double x)
-{
- if (fabs(x) < 1e-6) {
- return 1.0f - fabs(x);
- } else {
- return sin(x) / x;
- }
-}
-
-#if 0
-double weight(double x)
-{
- if (fabs(x) > LANCZOS_RADIUS) {
- return 0.0f;
- }
- return sinc(M_PI * x) * sinc(M_PI * x / LANCZOS_RADIUS);
-}
-#else
-double weight(double x)
-{
- if (fabs(x) > 1.0f) {
- return 0.0f;
- }
- return 1.0f - fabs(x);
-}
-#endif
-
-double interpolate(const std::vector<short> &pcm, double i)
-{
- int lower = std::max<int>(ceil(i - LANCZOS_RADIUS), 0);
- int upper = std::min<int>(floor(i + LANCZOS_RADIUS), pcm.size() - 1);
- double sum = 0.0f;
-
- for (int x = lower; x <= upper; ++x) {
- sum += pcm[x] * weight(i - x);
- }
- return sum;
-}
-