Advertisement
ErnstHot

Juce Oversampling

Mar 25th, 2020
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <JuceHeader.h>
  4.  
  5. namespace hot {
  6.  
  7.     template<typename SampleType>
  8.     class Oversampling
  9.         : public dsp::Oversampling<double>
  10.     {
  11.     public:
  12.         Oversampling(size_t newNumChannels, size_t newFactor)
  13.             : dsp::Oversampling(newNumChannels)
  14.         {
  15.             jassert(isPositiveAndBelow(newFactor, 5) && numChannels > 0);
  16.  
  17.             clearOversamplingStages();
  18.  
  19.             if (newFactor == 0)
  20.             {
  21.                 addDummyOversamplingStage();
  22.             }
  23.             else // newFactor >= 1: At least one stage
  24.             {
  25.                 bool isMaximumQuality;
  26.                 int n{0};
  27.                 float twUp, twDown, gaindBStartUp, gaindBStartDown, gaindBFactorUp, gaindBFactorDown;
  28.                
  29.                 // 1st stage (2x), HQ Half Band Polyphase
  30.                 isMaximumQuality = true;
  31.                 twUp = 0.05f;
  32.                 twDown = 0.06f;
  33.  
  34.                 gaindBStartUp = -90.0;
  35.                 gaindBStartDown = -75.0f;
  36.                 gaindBFactorUp = 10.0f;
  37.                 gaindBFactorDown = 10.0f;
  38.  
  39.                 addOversamplingStage(FilterType::filterHalfBandPolyphaseIIR,
  40.                     twUp, gaindBStartUp + gaindBFactorUp * n,
  41.                     twDown, gaindBStartDown + gaindBFactorDown * n);
  42.  
  43.                 if (newFactor >= 2)
  44.                 {
  45.                     // 2nd stage (4x), HQ Half Band Polyphase
  46.                     isMaximumQuality = true;
  47.                     n++;
  48.  
  49.                     twUp = (isMaximumQuality ? 0.10f : 0.12f);
  50.                     twDown = (isMaximumQuality ? 0.12f : 0.15f);
  51.  
  52.                     gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
  53.                     gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
  54.                     gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
  55.                     gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
  56.  
  57.                     addOversamplingStage(FilterType::filterHalfBandPolyphaseIIR,
  58.                         twUp, gaindBStartUp + gaindBFactorUp * n,
  59.                         twDown, gaindBStartDown + gaindBFactorDown * n);
  60.                 }
  61.                 if (newFactor >= 3)
  62.                 {
  63.                     // 3rd stage (8x), filterHalfBandFIREquiripple
  64.                     isMaximumQuality = false;
  65.                     n++;
  66.  
  67.                     twUp = (isMaximumQuality ? 0.10f : 0.12f);
  68.                     twDown = (isMaximumQuality ? 0.12f : 0.15f);
  69.  
  70.                     gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
  71.                     gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
  72.                     gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
  73.                     gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
  74.  
  75.                     addOversamplingStage(FilterType::filterHalfBandFIREquiripple,
  76.                         twUp, gaindBStartUp + gaindBFactorUp * n,
  77.                         twDown, gaindBStartDown + gaindBFactorDown * n);
  78.                 }
  79.                 if (newFactor >= 4)
  80.                 {
  81.                     // 4th stage (16x), filterHalfBandFIREquiripple
  82.                     isMaximumQuality = false;
  83.                     n++;
  84.  
  85.                     twUp = (isMaximumQuality ? 0.10f : 0.12f);
  86.                     twDown = (isMaximumQuality ? 0.12f : 0.15f);
  87.  
  88.                     gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
  89.                     gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
  90.                     gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
  91.                     gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
  92.  
  93.                     addOversamplingStage(FilterType::filterHalfBandFIREquiripple,
  94.                         twUp, gaindBStartUp + gaindBFactorUp * n,
  95.                         twDown, gaindBStartDown + gaindBFactorDown * n);
  96.                 }
  97.             }
  98.         }
  99.        
  100.         ~Oversampling()
  101.         {
  102.        
  103.         }
  104.  
  105.     };
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement