@@ -60,9 +60,9 @@ namespace yup
6060template <int FirSize, int Ratio, typename SampleType, typename CoeffType = double >
6161class FirUpsampler
6262{
63- static_assert (FirSize > 0 , " FirSize must be positive" );
64- static_assert (Ratio > 1 , " Ratio must be greater than 1" );
65- static_assert ((FirSize % 4 ) == 0 , " FirSize should be multiple of 4 for optimal performance" );
63+ static_assert (FirSize > 0 , " FirSize must be positive" );
64+ static_assert (Ratio > 1 , " Ratio must be greater than 1" );
65+ static_assert ((FirSize % 4 ) == 0 , " FirSize should be multiple of 4 for optimal performance" );
6666
6767public:
6868 // ==============================================================================
@@ -119,15 +119,15 @@ class FirUpsampler
119119 SampleType processSample (SampleType inputSample) noexcept
120120 {
121121 jassert (coefficients != nullptr );
122-
122+
123123 // Store input sample in circular buffer
124124 buffer[bufferIndex] = inputSample;
125-
125+
126126 // Calculate first upsampled output (at phase 0)
127127 auto output = static_cast <SampleType> (0.0 );
128128 int coeffIndex = 0 ;
129129 int bufferPos = bufferIndex;
130-
130+
131131 // Process in groups of 4 for better optimization
132132 for (int i = 0 ; i < FirSize; i += 4 * Ratio)
133133 {
@@ -137,7 +137,7 @@ class FirUpsampler
137137 output += static_cast <SampleType> (coefficients[coeffIndex + 1 * Ratio]) * buffer[(bufferPos + BufferSize - 1 ) & BufferMask];
138138 output += static_cast <SampleType> (coefficients[coeffIndex + 2 * Ratio]) * buffer[(bufferPos + BufferSize - 2 ) & BufferMask];
139139 output += static_cast <SampleType> (coefficients[coeffIndex + 3 * Ratio]) * buffer[(bufferPos + BufferSize - 3 ) & BufferMask];
140-
140+
141141 bufferPos -= 4 ;
142142 coeffIndex += 4 * Ratio;
143143 }
@@ -153,10 +153,10 @@ class FirUpsampler
153153 break ;
154154 }
155155 }
156-
156+
157157 // Advance buffer index
158158 bufferIndex = (bufferIndex + 1 ) & BufferMask;
159-
159+
160160 return output;
161161 }
162162
@@ -170,19 +170,19 @@ class FirUpsampler
170170 {
171171 jassert (phase >= 1 && phase < Ratio);
172172 jassert (coefficients != nullptr );
173-
173+
174174 auto output = static_cast <SampleType> (0.0 );
175175 int coeffIndex = phase;
176176 int bufferPos = (bufferIndex - 1 + BufferSize) & BufferMask; // Previous input position
177-
177+
178178 // Process coefficients at the specified phase
179179 for (int i = phase; i < FirSize; i += Ratio)
180180 {
181181 output += static_cast <SampleType> (coefficients[coeffIndex]) * buffer[(bufferPos + BufferSize) & BufferMask];
182182 --bufferPos;
183183 coeffIndex += Ratio;
184184 }
185-
185+
186186 return output;
187187 }
188188
@@ -199,7 +199,7 @@ class FirUpsampler
199199 {
200200 // First upsampled output
201201 outputBuffer[i * Ratio] = processSample (inputBuffer[i]);
202-
202+
203203 // Remaining interpolated outputs
204204 for (int phase = 1 ; phase < Ratio; ++phase)
205205 {
@@ -220,10 +220,10 @@ class FirUpsampler
220220 // Use power-of-2 buffer size for efficient wrapping
221221 static constexpr int BufferSize = nextPowerOfTwo (FirSize);
222222 static constexpr int BufferMask = BufferSize - 1 ;
223-
223+
224224 const CoeffType* coefficients;
225225 std::array<SampleType, BufferSize> buffer;
226- int bufferIndex;
226+ int bufferIndex;
227227};
228228
229229// ==============================================================================
@@ -257,8 +257,8 @@ class FirUpsampler
257257template <int FirSize, typename SampleType, typename CoeffType = double >
258258class FirDownsampler
259259{
260- static_assert (FirSize > 0 , " FirSize must be positive" );
261- static_assert ((FirSize % 4 ) == 0 , " FirSize should be multiple of 4 for optimal performance" );
260+ static_assert (FirSize > 0 , " FirSize must be positive" );
261+ static_assert ((FirSize % 4 ) == 0 , " FirSize should be multiple of 4 for optimal performance" );
262262
263263public:
264264 // ==============================================================================
@@ -333,22 +333,22 @@ class FirDownsampler
333333 SampleType processSample (SampleType inputSample, bool & hasOutput) noexcept
334334 {
335335 jassert (coefficients != nullptr );
336-
336+
337337 // Store input sample in circular buffer
338338 buffer[bufferIndex] = inputSample;
339339 bufferIndex = (bufferIndex + 1 ) & BufferMask;
340-
340+
341341 // Check if we should produce an output
342342 ++decimationPhase;
343343 if (decimationPhase >= decimationRate)
344344 {
345345 decimationPhase = 0 ;
346346 hasOutput = true ;
347-
347+
348348 // Calculate filtered output
349349 auto output = static_cast <SampleType> (0.0 );
350350 int bufferPos = (bufferIndex - 1 + BufferSize) & BufferMask;
351-
351+
352352 // Process in groups of 4 for optimization
353353 int i = 0 ;
354354 for (; i <= FirSize - 4 ; i += 4 )
@@ -359,14 +359,14 @@ class FirDownsampler
359359 output += static_cast <SampleType> (coefficients[i + 3 ]) * buffer[(bufferPos - 3 + BufferSize) & BufferMask];
360360 bufferPos -= 4 ;
361361 }
362-
362+
363363 // Handle remaining coefficients
364364 for (; i < FirSize; ++i)
365365 {
366366 output += static_cast <SampleType> (coefficients[i]) * buffer[bufferPos & BufferMask];
367367 bufferPos = (bufferPos - 1 + BufferSize) & BufferMask;
368368 }
369-
369+
370370 return output;
371371 }
372372 else
@@ -387,18 +387,18 @@ class FirDownsampler
387387 int processBlock (const SampleType* inputBuffer, SampleType* outputBuffer, int numSamples) noexcept
388388 {
389389 int outputCount = 0 ;
390-
390+
391391 for (int i = 0 ; i < numSamples; ++i)
392392 {
393393 bool hasOutput;
394394 const auto output = processSample (inputBuffer[i], hasOutput);
395-
395+
396396 if (hasOutput)
397397 {
398398 outputBuffer[outputCount++] = output;
399399 }
400400 }
401-
401+
402402 return outputCount;
403403 }
404404
@@ -415,13 +415,13 @@ class FirDownsampler
415415 // Use power-of-2 buffer size for efficient wrapping
416416 static constexpr int BufferSize = nextPowerOfTwo (FirSize);
417417 static constexpr int BufferMask = BufferSize - 1 ;
418-
418+
419419 const CoeffType* coefficients;
420420 std::array<SampleType, BufferSize> buffer;
421421 int bufferIndex;
422422 int decimationPhase;
423423 int decimationRate;
424-
424+
425425 // ==============================================================================
426426 static constexpr int nextPowerOfTwo (int value)
427427 {
@@ -458,10 +458,10 @@ class FirResampler : public FilterBase<SampleType, CoeffType>
458458 /* * Quality presets for automatic filter design */
459459 enum class Quality
460460 {
461- draft, /* * Fast processing, basic quality (32 taps) */
462- normal, /* * Balanced quality and performance (64 taps) */
463- high, /* * High quality, more computation (128 taps) */
464- perfect /* * Maximum quality, highest computation (256 taps) */
461+ draft, /* * Fast processing, basic quality (32 taps) */
462+ normal, /* * Balanced quality and performance (64 taps) */
463+ high, /* * High quality, more computation (128 taps) */
464+ perfect /* * Maximum quality, highest computation (256 taps) */
465465 };
466466
467467 // ==============================================================================
@@ -587,18 +587,21 @@ class FirResampler : public FilterBase<SampleType, CoeffType>
587587 cutoffFreq,
588588 this ->sampleRate * static_cast <double > (upsampleRatio),
589589 " kaiser" ,
590- stopbandAttenuation
591- );
590+ stopbandAttenuation);
592591 }
593592
594593 static int getFilterLengthForQuality (Quality qualityLevel) noexcept
595594 {
596595 switch (qualityLevel)
597596 {
598- case Quality::draft: return 32 ;
599- case Quality::normal: return 64 ;
600- case Quality::high: return 128 ;
601- case Quality::perfect: return 256 ;
597+ case Quality::draft:
598+ return 32 ;
599+ case Quality::normal:
600+ return 64 ;
601+ case Quality::high:
602+ return 128 ;
603+ case Quality::perfect:
604+ return 256 ;
602605 }
603606 return 64 ;
604607 }
@@ -607,10 +610,14 @@ class FirResampler : public FilterBase<SampleType, CoeffType>
607610 {
608611 switch (qualityLevel)
609612 {
610- case Quality::draft: return static_cast <CoeffType> (40.0 );
611- case Quality::normal: return static_cast <CoeffType> (60.0 );
612- case Quality::high: return static_cast <CoeffType> (80.0 );
613- case Quality::perfect: return static_cast <CoeffType> (100.0 );
613+ case Quality::draft:
614+ return static_cast <CoeffType> (40.0 );
615+ case Quality::normal:
616+ return static_cast <CoeffType> (60.0 );
617+ case Quality::high:
618+ return static_cast <CoeffType> (80.0 );
619+ case Quality::perfect:
620+ return static_cast <CoeffType> (100.0 );
614621 }
615622 return static_cast <CoeffType> (60.0 );
616623 }
@@ -628,19 +635,19 @@ class FirResampler : public FilterBase<SampleType, CoeffType>
628635
629636// ==============================================================================
630637/* * Type aliases for common upsampler configurations */
631- using FirUpsampler2x64 = FirUpsampler<64 , 2 , float >; // 2x upsampling, 64 taps
632- using FirUpsampler4x64 = FirUpsampler<64 , 4 , float >; // 4x upsampling, 64 taps
633- using FirUpsampler8x64 = FirUpsampler<64 , 8 , float >; // 8x upsampling, 64 taps
638+ using FirUpsampler2x64 = FirUpsampler<64 , 2 , float >; // 2x upsampling, 64 taps
639+ using FirUpsampler4x64 = FirUpsampler<64 , 4 , float >; // 4x upsampling, 64 taps
640+ using FirUpsampler8x64 = FirUpsampler<64 , 8 , float >; // 8x upsampling, 64 taps
634641
635- using FirUpsampler2x128 = FirUpsampler<128 , 2 , float >; // 2x upsampling, 128 taps (high quality)
636- using FirUpsampler4x128 = FirUpsampler<128 , 4 , float >; // 4x upsampling, 128 taps (high quality)
642+ using FirUpsampler2x128 = FirUpsampler<128 , 2 , float >; // 2x upsampling, 128 taps (high quality)
643+ using FirUpsampler4x128 = FirUpsampler<128 , 4 , float >; // 4x upsampling, 128 taps (high quality)
637644
638645/* * Type aliases for common downsampler configurations */
639- using FirDownsampler64 = FirDownsampler<64 , float >; // 64 taps downsampler
640- using FirDownsampler128 = FirDownsampler<128 , float >; // 128 taps downsampler (high quality)
646+ using FirDownsampler64 = FirDownsampler<64 , float >; // 64 taps downsampler
647+ using FirDownsampler128 = FirDownsampler<128 , float >; // 128 taps downsampler (high quality)
641648
642649/* * Type aliases for complete resampler */
643- using FirResamplerFloat = FirResampler<float >; // float samples, double coefficients (default)
644- using FirResamplerDouble = FirResampler<double >; // double samples, double coefficients (default)
650+ using FirResamplerFloat = FirResampler<float >; // float samples, double coefficients (default)
651+ using FirResamplerDouble = FirResampler<double >; // double samples, double coefficients (default)
645652
646653} // namespace yup
0 commit comments