Skip to content

Commit 63a1304

Browse files
authored
32x oversampling + enable high-quality oversampling (#90)
* Add 32x oversampling * Enable high-quality oversampling * Bump minor version and update docs
1 parent e78353b commit 63a1304

File tree

9 files changed

+77
-124
lines changed

9 files changed

+77
-124
lines changed

.vscode/tasks.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
"problemMatcher": [
1515
"$gcc"
1616
],
17-
"command": "just build"
17+
"command": "just build",
18+
"group": {
19+
"kind": "build",
20+
"isDefault": true
21+
}
1822
},
1923
{
2024
"label": "Run",
@@ -39,6 +43,6 @@
3943
"$gcc"
4044
],
4145
"command": "just test"
42-
},
46+
}
4347
]
4448
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ You can read more about the difference between Hard and Soft clipping [here](htt
118118

119119
<img src="assets/screenshots/screenshot-oversample.png" alt="oversample" height="100"/>
120120

121-
Choose between 2x, 4x, 8x, and 16x oversampling to avoid signal aliasing. You can also turn off oversampling.
121+
Choose between 2x, 4x, 8x, 16x and 32x oversampling to avoid signal aliasing. You can also turn off oversampling.
122122

123123
> **Note** High values of oversampling may hurt CPU performance.
124124
1.21 KB
Loading

conanfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class PeakEater(ConanFile):
77
name = "peakeater"
8-
version = "0.6.5"
8+
version = "0.7.0"
99
user = "vvvar"
1010
channel = "testing"
1111
company = "T-Audio"

config/.clang-format

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ BreakBeforeBraces: Allman
2424
BreakBeforeTernaryOperators: true
2525
BreakConstructorInitializersBeforeComma: false
2626
BreakStringLiterals: false
27-
ColumnLimit: 150
28-
ConstructorInitializerAllOnOneLineOrOnePerLine: true
27+
ColumnLimit: 120
28+
ConstructorInitializerAllOnOneLineOrOnePerLine: false
2929
ConstructorInitializerIndentWidth: 4
3030
ContinuationIndentWidth: 4
3131
Cpp11BracedListStyle: false
@@ -62,7 +62,7 @@ Language: ObjC
6262
BasedOnStyle: Chromium
6363
AlignTrailingComments: true
6464
BreakBeforeBraces: Allman
65-
ColumnLimit: 150
65+
ColumnLimit: 120
6666
IndentWidth: 4
6767
KeepEmptyLinesAtTheStartOfBlocks: false
6868
ObjCSpaceAfterProperty: true

source/Controller/WaveShaperController.h

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ namespace controller
3333
public:
3434
//==============================================================================
3535
WaveShaperController()
36-
: waveShaper(), previousLinkInOut (false), previousInputGain (0.0f), previousOutputGain (0.0f), previousCeiling (0.0f), previousClippingType (0), previousOversampleRate (0)
36+
: waveShaper(), previousLinkInOut (false), previousInputGain (0.0f), previousOutputGain (0.0f),
37+
previousCeiling (0.0f), previousClippingType (0), previousOversampleRate (0)
3738
{
3839
}
3940

@@ -53,10 +54,7 @@ namespace controller
5354
waveShaper.onPostOutputGain (handler);
5455
}
5556

56-
void unsubscribeFromAll()
57-
{
58-
waveShaper.unsubscribeFromAll();
59-
}
57+
void unsubscribeFromAll() { waveShaper.unsubscribeFromAll(); }
6058

6159
void handleParametersChange (WaveShaperPrameters parameters) noexcept
6260
{
@@ -104,25 +102,13 @@ namespace controller
104102
waveShaper.setOutputGain (previousOutputGain);
105103
}
106104

107-
void process (juce::AudioBuffer<T>& buffer)
108-
{
109-
waveShaper.process (buffer);
110-
}
105+
void process (juce::AudioBuffer<T>& buffer) { waveShaper.process (buffer); }
111106

112-
void reset()
113-
{
114-
waveShaper.reset();
115-
}
107+
void reset() { waveShaper.reset(); }
116108

117-
float getPreviousInputGain() const
118-
{
119-
return previousInputGain;
120-
}
109+
float getPreviousInputGain() const { return previousInputGain; }
121110

122-
float getPreviousOutputGain() const
123-
{
124-
return previousOutputGain;
125-
}
111+
float getPreviousOutputGain() const { return previousOutputGain; }
126112

127113
private:
128114
//==============================================================================
@@ -174,6 +160,8 @@ namespace controller
174160
return OversamplingRate::X8;
175161
case 4:
176162
return OversamplingRate::X16;
163+
case 5:
164+
return OversamplingRate::X32;
177165
default:
178166
return OversamplingRate::X1;
179167
}

source/DSP/OversampledClipper.h

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,11 @@ namespace dsp
3434

3535
//==============================================================================
3636
OversampledClipper (const unsigned int factor = 1) noexcept
37-
: oversampler (2, factor, Oversampling::filterHalfBandPolyphaseIIR, false)
37+
: oversampler (2, factor, Oversampling::filterHalfBandPolyphaseIIR, true)
3838
{
3939
}
4040

41-
~OversampledClipper() override
42-
{
43-
}
41+
~OversampledClipper() override {}
4442

4543
//==============================================================================
4644
/** Inheritet implemented methods */
@@ -53,7 +51,8 @@ namespace dsp
5351
const auto oversampledSpec = createOversampledSpec (spec);
5452

5553
/** Setup pre-filter*/
56-
*preFilter.state = *juce::dsp::IIR::Coefficients<T>::makeLowPass (oversampledSpec.sampleRate, calculateCutoff (oversampledSpec.sampleRate));
54+
*preFilter.state = *juce::dsp::IIR::Coefficients<T>::makeLowPass (
55+
oversampledSpec.sampleRate, calculateCutoff (oversampledSpec.sampleRate));
5756
preFilter.prepare (oversampledSpec);
5857

5958
/** Setup clipper*/
@@ -62,7 +61,8 @@ namespace dsp
6261
setClippingType (DEFAULT_CLIPPING_TYPE);
6362

6463
/** Setup post-filter*/
65-
*postFilter.state = *juce::dsp::IIR::Coefficients<T>::makeLowPass (oversampledSpec.sampleRate, calculateCutoff (oversampledSpec.sampleRate));
64+
*postFilter.state = *juce::dsp::IIR::Coefficients<T>::makeLowPass (
65+
oversampledSpec.sampleRate, calculateCutoff (oversampledSpec.sampleRate));
6666
postFilter.prepare (oversampledSpec);
6767
}
6868

@@ -88,15 +88,9 @@ namespace dsp
8888

8989
// ==============================================================================
9090
/** Public interface */
91-
void setCeiling (float ceilingDbValue) noexcept
92-
{
93-
clipper.setThreshold (ceilingDbValue);
94-
}
91+
void setCeiling (float ceilingDbValue) noexcept { clipper.setThreshold (ceilingDbValue); }
9592

96-
void setClippingType (ClippingType clippingType) noexcept
97-
{
98-
clipper.setClippingType (clippingType);
99-
}
93+
void setClippingType (ClippingType clippingType) noexcept { clipper.setClippingType (clippingType); }
10094

10195
private:
10296
//==============================================================================

source/DSP/OversampledWaveShaper.h

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace dsp
2626
X2 = 0,
2727
X4 = 1,
2828
X8 = 2,
29-
X16 = 3
29+
X16 = 3,
30+
X32 = 4
3031
};
3132

3233
using OversampledWaveShaperEventHandler = std::function<void (juce::AudioBuffer<float>&)>;
@@ -45,13 +46,11 @@ namespace dsp
4546

4647
//==============================================================================
4748
OversampledWaveShaper() noexcept
48-
: clipper2x (1), clipper4x (2), clipper8x (3), clipper16x (4), clipper (&clipper2x)
49+
: clipper2x (1), clipper4x (2), clipper8x (3), clipper16x (4), clipper32x (5), clipper (&clipper2x)
4950
{
5051
}
5152

52-
~OversampledWaveShaper() override
53-
{
54-
}
53+
~OversampledWaveShaper() override {}
5554

5655
//==============================================================================
5756
/** Inheritet implemented methods */
@@ -68,6 +67,7 @@ namespace dsp
6867
clipper4x.prepare (spec);
6968
clipper8x.prepare (spec);
7069
clipper16x.prepare (spec);
70+
clipper32x.prepare (spec);
7171

7272
/** Setup output gain */
7373
outputGain.prepare (spec);
@@ -83,6 +83,7 @@ namespace dsp
8383
clipper4x.reset();
8484
clipper8x.reset();
8585
clipper16x.reset();
86+
clipper32x.reset();
8687
outputGain.reset();
8788
}
8889

@@ -120,15 +121,9 @@ namespace dsp
120121

121122
// ==============================================================================
122123
/** Public interface */
123-
void onPostInputGain (OversampledWaveShaperEventHandler const& handler)
124-
{
125-
mPostInputGainHandler = handler;
126-
}
124+
void onPostInputGain (OversampledWaveShaperEventHandler const& handler) { mPostInputGainHandler = handler; }
127125

128-
void onPostCeiling (OversampledWaveShaperEventHandler const& handler)
129-
{
130-
mPostCeilingHandler = handler;
131-
}
126+
void onPostCeiling (OversampledWaveShaperEventHandler const& handler) { mPostCeilingHandler = handler; }
132127

133128
void onPostOutputGain (OversampledWaveShaperEventHandler const& handler)
134129
{
@@ -142,15 +137,9 @@ namespace dsp
142137
mPostOutputGainHandler = nullptr;
143138
}
144139

145-
void setInputGain (float gainDbValue) noexcept
146-
{
147-
inputGain.setGainDecibels (gainDbValue);
148-
}
140+
void setInputGain (float gainDbValue) noexcept { inputGain.setGainDecibels (gainDbValue); }
149141

150-
void setOutputGain (float gainDbValue) noexcept
151-
{
152-
outputGain.setGainDecibels (gainDbValue);
153-
}
142+
void setOutputGain (float gainDbValue) noexcept { outputGain.setGainDecibels (gainDbValue); }
154143

155144
void setCeiling (float ceilingDbValue) noexcept
156145
{
@@ -159,6 +148,7 @@ namespace dsp
159148
clipper4x.setCeiling (ceilingDbValue);
160149
clipper8x.setCeiling (ceilingDbValue);
161150
clipper16x.setCeiling (ceilingDbValue);
151+
clipper32x.setCeiling (ceilingDbValue);
162152
}
163153

164154
void setClippingType (ClippingType clippingType) noexcept
@@ -168,6 +158,7 @@ namespace dsp
168158
clipper4x.setClippingType (clippingType);
169159
clipper8x.setClippingType (clippingType);
170160
clipper16x.setClippingType (clippingType);
161+
clipper32x.setClippingType (clippingType);
171162
}
172163

173164
void setOversamplingRate (OversamplingRate oversamplingRate) noexcept
@@ -189,6 +180,9 @@ namespace dsp
189180
case X16:
190181
clipper = &clipper16x;
191182
break;
183+
case X32:
184+
clipper = &clipper32x;
185+
break;
192186
default:
193187
clipper = &clipper1x;
194188
break;
@@ -211,6 +205,7 @@ namespace dsp
211205
OversampledClipper<T> clipper4x;
212206
OversampledClipper<T> clipper8x;
213207
OversampledClipper<T> clipper16x;
208+
OversampledClipper<T> clipper32x;
214209
juce::dsp::ProcessorBase* clipper; // Current clipper
215210

216211
//==============================================================================

0 commit comments

Comments
 (0)