diff --git a/resampler.hh b/resampler.hh index 52761de..f9850e5 100644 --- a/resampler.hh +++ b/resampler.hh @@ -49,5 +49,54 @@ public: } }; +template +class Resampler2 +{ + typedef DSP::UniformNaturalCubicSpline spline_type; + spline_type lpf; + TYPE rate; + TYPE dpos; + IO buf[TAPS]; +public: + Resampler2(TYPE rate, TYPE cutoff, TYPE alpha) : rate(rate), dpos(0) + { + TYPE tmp[TAPS * OVER]; + DSP::Kaiser window(alpha); + for (int n = 0; n < TAPS * OVER; ++n) { + TYPE x = TYPE(n) / TYPE(OVER) - TYPE(TAPS - 1) / TYPE(2); + TYPE y = TYPE(2) * cutoff / rate * sinc(TYPE(2) * cutoff / rate * x); + tmp[n] = y * window(n, TAPS * OVER); + } + lpf = spline_type(tmp, 0, 1.0 / OVER); + for (int i = 0; i < TAPS; ++i) + buf[i] = 0; + } + int operator ()(IO *output, IO input, TYPE diff) + { + for (int i = 0; i < TAPS-1; ++i) + buf[i] = buf[i+1]; + buf[TAPS-1] = input; + if (dpos < TYPE(-0.5)) { + dpos += TYPE(1); + return 0; + } + TYPE delta = diff / rate; + int samples = 0; + again: + IO sum = 0; + for (int s = 0; s < TAPS; ++s) { + TYPE k = s + dpos; + sum += lpf(k) * buf[s]; + } + output[samples++] = sum; + dpos += delta; + if (dpos > TYPE(0.5)) { + dpos -= TYPE(1); + goto again; + } + return samples; + } +}; + }