00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TWOPASSSINCRESAMPLER_H
00023 #define TWOPASSSINCRESAMPLER_H
00024
00025 #include <math.h>
00026
00027 #include "Resampler.h"
00028 #include "SincResampler.h"
00029
00030 namespace reSIDfp
00031 {
00032
00038 class TwoPassSincResampler : public Resampler
00039 {
00040 private:
00041 SincResampler* s1;
00042 SincResampler* s2;
00043
00044 public:
00045 TwoPassSincResampler(double clockFrequency, double samplingFrequency,
00046 double highestAccurateFrequency)
00047 {
00048
00049
00050 const double intermediateFrequency = 2. * highestAccurateFrequency
00051 + sqrt(2. * highestAccurateFrequency * clockFrequency
00052 * (samplingFrequency - 2. * highestAccurateFrequency) / samplingFrequency);
00053 s1 = new SincResampler(clockFrequency, intermediateFrequency, highestAccurateFrequency);
00054 s2 = new SincResampler(intermediateFrequency, samplingFrequency, highestAccurateFrequency);
00055 }
00056
00057 ~TwoPassSincResampler()
00058 {
00059 delete s1;
00060 delete s2;
00061 }
00062
00063 bool input(int sample)
00064 {
00065 return s1->input(sample) && s2->input(s1->output());
00066 }
00067
00068 int output() const
00069 {
00070 return s2->output();
00071 }
00072
00073 void reset()
00074 {
00075 s1->reset();
00076 s2->reset();
00077 }
00078 };
00079
00080 }
00081
00082 #endif