polyphase_resampler.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #ifndef POLYPHASE_RESAMPLER_H
  2. #define POLYPHASE_RESAMPLER_H
  3. #include <vector>
  4. #include "alspan.h"
  5. using uint = unsigned int;
  6. /* This is a polyphase sinc-filtered resampler. It is built for very high
  7. * quality results, rather than real-time performance.
  8. *
  9. * Upsample Downsample
  10. *
  11. * p/q = 3/2 p/q = 3/5
  12. *
  13. * M-+-+-+-> M-+-+-+->
  14. * -------------------+ ---------------------+
  15. * p s * f f f f|f| | p s * f f f f f |
  16. * | 0 * 0 0 0|0|0 | | 0 * 0 0 0 0|0| |
  17. * v 0 * 0 0|0|0 0 | v 0 * 0 0 0|0|0 |
  18. * s * f|f|f f f | s * f f|f|f f |
  19. * 0 * |0|0 0 0 0 | 0 * 0|0|0 0 0 |
  20. * --------+=+--------+ 0 * |0|0 0 0 0 |
  21. * d . d .|d|. d . d ----------+=+--------+
  22. * d . . . .|d|. . . .
  23. * q->
  24. * q-+-+-+->
  25. *
  26. * P_f(i,j) = q i mod p + pj
  27. * P_s(i,j) = floor(q i / p) - j
  28. * d[i=0..N-1] = sum_{j=0}^{floor((M - 1) / p)} {
  29. * { f[P_f(i,j)] s[P_s(i,j)], P_f(i,j) < M
  30. * { 0, P_f(i,j) >= M. }
  31. */
  32. struct PPhaseResampler {
  33. void init(const uint srcRate, const uint dstRate);
  34. void process(const al::span<const double> in, const al::span<double> out);
  35. explicit operator bool() const noexcept { return !mF.empty(); }
  36. private:
  37. uint mP{}, mQ{}, mM{}, mL{};
  38. std::vector<double> mF;
  39. };
  40. #endif /* POLYPHASE_RESAMPLER_H */