Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <JuceHeader.h>
- namespace hot {
- template<typename SampleType>
- class Oversampling
- : public dsp::Oversampling<double>
- {
- public:
- Oversampling(size_t newNumChannels, size_t newFactor)
- : dsp::Oversampling(newNumChannels)
- {
- jassert(isPositiveAndBelow(newFactor, 5) && numChannels > 0);
- clearOversamplingStages();
- if (newFactor == 0)
- {
- addDummyOversamplingStage();
- }
- else // newFactor >= 1: At least one stage
- {
- bool isMaximumQuality;
- int n{0};
- float twUp, twDown, gaindBStartUp, gaindBStartDown, gaindBFactorUp, gaindBFactorDown;
- // 1st stage (2x), HQ Half Band Polyphase
- isMaximumQuality = true;
- twUp = 0.05f;
- twDown = 0.06f;
- gaindBStartUp = -90.0;
- gaindBStartDown = -75.0f;
- gaindBFactorUp = 10.0f;
- gaindBFactorDown = 10.0f;
- addOversamplingStage(FilterType::filterHalfBandPolyphaseIIR,
- twUp, gaindBStartUp + gaindBFactorUp * n,
- twDown, gaindBStartDown + gaindBFactorDown * n);
- if (newFactor >= 2)
- {
- // 2nd stage (4x), HQ Half Band Polyphase
- isMaximumQuality = true;
- n++;
- twUp = (isMaximumQuality ? 0.10f : 0.12f);
- twDown = (isMaximumQuality ? 0.12f : 0.15f);
- gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
- gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
- gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
- gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
- addOversamplingStage(FilterType::filterHalfBandPolyphaseIIR,
- twUp, gaindBStartUp + gaindBFactorUp * n,
- twDown, gaindBStartDown + gaindBFactorDown * n);
- }
- if (newFactor >= 3)
- {
- // 3rd stage (8x), filterHalfBandFIREquiripple
- isMaximumQuality = false;
- n++;
- twUp = (isMaximumQuality ? 0.10f : 0.12f);
- twDown = (isMaximumQuality ? 0.12f : 0.15f);
- gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
- gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
- gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
- gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
- addOversamplingStage(FilterType::filterHalfBandFIREquiripple,
- twUp, gaindBStartUp + gaindBFactorUp * n,
- twDown, gaindBStartDown + gaindBFactorDown * n);
- }
- if (newFactor >= 4)
- {
- // 4th stage (16x), filterHalfBandFIREquiripple
- isMaximumQuality = false;
- n++;
- twUp = (isMaximumQuality ? 0.10f : 0.12f);
- twDown = (isMaximumQuality ? 0.12f : 0.15f);
- gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
- gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
- gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
- gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
- addOversamplingStage(FilterType::filterHalfBandFIREquiripple,
- twUp, gaindBStartUp + gaindBFactorUp * n,
- twDown, gaindBStartDown + gaindBFactorDown * n);
- }
- }
- }
- ~Oversampling()
- {
- }
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement