00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SINCRESAMPLER_H
00024 #define SINCRESAMPLER_H
00025
00026 #include "Resampler.h"
00027
00028 #include <string>
00029 #include <map>
00030
00031 #include "../array.h"
00032
00033 namespace reSIDfp
00034 {
00035
00070 class SincResampler : public Resampler
00071 {
00072 private:
00073 static const int RINGSIZE = 2048;
00074
00075 static const int BITS = 16;
00076
00077 array<short>* firTable;
00078
00079 int sampleIndex;
00080
00081 int firRES, firN;
00082
00083 const int cyclesPerSample;
00084
00085 int sampleOffset;
00086
00087 int outputValue;
00088
00089 short sample[RINGSIZE * 2];
00090
00094 static std::map<std::string, array<short> > FIR_CACHE;
00095
00097 static const double I0E;
00098
00107 static double I0(double x);
00108
00117 static int convolve(const short* a, const short* b, int bLength);
00118
00119 int fir(int subcycle);
00120
00121 public:
00142 SincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency);
00143
00144 bool input(int input);
00145
00146 int output() const { return outputValue; }
00147
00148 void reset();
00149 };
00150
00151 }
00152
00153 #endif