00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef ZEROORDER_RESAMPLER_H
00023 #define ZEROORDER_RESAMPLER_H
00024
00025 #include "Resampler.h"
00026
00027 namespace reSIDfp
00028 {
00029
00035 class ZeroOrderResampler : public Resampler
00036 {
00037
00038 private:
00039 int cachedSample;
00040
00041 const int cyclesPerSample;
00042 int sampleOffset;
00043 int outputValue;
00044
00045 public:
00046 ZeroOrderResampler(double clockFrequency, double samplingFrequency) :
00047 cachedSample(0),
00048 cyclesPerSample((int)(clockFrequency / samplingFrequency * 1024.)),
00049 sampleOffset(0),
00050 outputValue(0) {}
00051
00052 bool input(int sample)
00053 {
00054 bool ready = false;
00055
00056 if (sampleOffset < 1024)
00057 {
00058 outputValue = cachedSample + (sampleOffset * (sample - cachedSample) >> 10);
00059 ready = true;
00060 sampleOffset += cyclesPerSample;
00061 }
00062
00063 sampleOffset -= 1024;
00064
00065 cachedSample = sample;
00066
00067 return ready;
00068 }
00069
00070 int output() const { return outputValue; }
00071
00072 void reset()
00073 {
00074 sampleOffset = 0;
00075 cachedSample = 0;
00076 }
00077 };
00078
00079 }
00080
00081 #endif