34template <
typename SampleType>
43 virtual void initProcessing (
size_t maximumNumberOfSamplesBeforeOversampling)
46 static_cast<int> (maximumNumberOfSamplesBeforeOversampling *
factor),
72template <
typename SampleType>
88 jassert (inputBlock.
getNumSamples() * ParentType::factor <=
static_cast<size_t> (ParentType::buffer.getNumSamples()));
90 for (
size_t channel = 0; channel < inputBlock.
getNumChannels(); ++channel)
91 ParentType::buffer.copyFrom (
static_cast<int> (channel), 0,
98 jassert (outputBlock.
getNumSamples() * ParentType::factor <=
static_cast<size_t> (ParentType::buffer.getNumSamples()));
112template <
typename SampleType>
118 SampleType normalisedTransitionWidthUp,
119 SampleType stopbandAmplitudedBUp,
120 SampleType normalisedTransitionWidthDown,
121 SampleType stopbandAmplitudedBDown)
132 auto Ndiv4 = Ndiv2 / 2;
160 jassert (inputBlock.
getNumSamples() * ParentType::factor <=
static_cast<size_t> (ParentType::buffer.getNumSamples()));
169 for (
size_t channel = 0; channel < inputBlock.
getNumChannels(); ++channel)
171 auto bufferSamples = ParentType::buffer.getWritePointer (
static_cast<int> (channel));
172 auto buf =
stateUp.getWritePointer (
static_cast<int> (channel));
175 for (
size_t i = 0;
i < numSamples; ++
i)
178 buf[
N - 1] = 2 * samples[
i];
181 auto out =
static_cast<SampleType
> (0.0);
183 for (
size_t k = 0;
k < Ndiv2;
k += 2)
184 out += (buf[
k] + buf[
N -
k - 1]) * fir[
k];
187 bufferSamples[
i << 1] =
out;
188 bufferSamples[(
i << 1) + 1] = buf[Ndiv2 + 1] * fir[Ndiv2];
191 for (
size_t k = 0;
k <
N - 2;
k += 2)
200 jassert (outputBlock.
getNumSamples() * ParentType::factor <=
static_cast<size_t> (ParentType::buffer.getNumSamples()));
206 auto Ndiv4 = Ndiv2 / 2;
210 for (
size_t channel = 0; channel < outputBlock.
getNumChannels(); ++channel)
212 auto bufferSamples = ParentType::buffer.getWritePointer (
static_cast<int> (channel));
213 auto buf =
stateDown.getWritePointer (
static_cast<int> (channel));
214 auto buf2 =
stateDown2.getWritePointer (
static_cast<int> (channel));
216 auto pos =
position.getUnchecked (
static_cast<int> (channel));
218 for (
size_t i = 0;
i < numSamples; ++
i)
221 buf[
N - 1] = bufferSamples[
i << 1];
224 auto out =
static_cast<SampleType
> (0.0);
226 for (
size_t k = 0;
k < Ndiv2;
k += 2)
227 out += (buf[
k] + buf[
N -
k - 1]) * fir[
k];
230 out += buf2[pos] * fir[Ndiv2];
231 buf2[pos] = bufferSamples[(
i << 1) + 1];
236 for (
size_t k = 0;
k <
N - 2; ++
k)
240 pos = (pos == 0 ? Ndiv4 : pos - 1);
243 position.setUnchecked (
static_cast<int> (channel), pos);
264template <
typename SampleType>
270 SampleType normalisedTransitionWidthUp,
271 SampleType stopbandAmplitudedBUp,
272 SampleType normalisedTransitionWidthDown,
273 SampleType stopbandAmplitudedBDown)
284 for (
auto i = 0;
i < structureUp.directPath.size(); ++
i)
285 coefficientsUp.add (structureUp.directPath.getObjectPointer (
i)->coefficients[0]);
287 for (
auto i = 1;
i < structureUp.delayedPath.size(); ++
i)
288 coefficientsUp.add (structureUp.delayedPath.getObjectPointer (
i)->coefficients[0]);
290 for (
auto i = 0;
i < structureDown.directPath.size(); ++
i)
291 coefficientsDown.add (structureDown.directPath.getObjectPointer (
i)->coefficients[0]);
293 for (
auto i = 1;
i < structureDown.delayedPath.size(); ++
i)
294 coefficientsDown.add (structureDown.delayedPath.getObjectPointer (
i)->coefficients[0]);
318 jassert (inputBlock.
getNumSamples() * ParentType::factor <=
static_cast<size_t> (ParentType::buffer.getNumSamples()));
323 auto delayedStages = numStages / 2;
324 auto directStages = numStages - delayedStages;
328 for (
size_t channel = 0; channel < inputBlock.
getNumChannels(); ++channel)
330 auto bufferSamples = ParentType::buffer.getWritePointer (
static_cast<int> (channel));
331 auto lv1 =
v1Up.getWritePointer (
static_cast<int> (channel));
334 for (
size_t i = 0;
i < numSamples; ++
i)
337 auto input = samples[
i];
339 for (
auto n = 0;
n < directStages; ++
n)
341 auto alpha = coeffs[
n];
342 auto output = alpha * input + lv1[
n];
343 lv1[
n] = input - alpha * output;
348 bufferSamples[
i << 1] = input;
353 for (
auto n = directStages;
n < numStages; ++
n)
355 auto alpha = coeffs[
n];
356 auto output = alpha * input + lv1[
n];
357 lv1[
n] = input - alpha * output;
362 bufferSamples[(
i << 1) + 1] = input;
366 #if JUCE_DSP_ENABLE_SNAP_TO_ZERO
374 jassert (outputBlock.
getNumSamples() * ParentType::factor <=
static_cast<size_t> (ParentType::buffer.getNumSamples()));
379 auto delayedStages = numStages / 2;
380 auto directStages = numStages - delayedStages;
384 for (
size_t channel = 0; channel < outputBlock.
getNumChannels(); ++channel)
386 auto bufferSamples = ParentType::buffer.getWritePointer (
static_cast<int> (channel));
387 auto lv1 =
v1Down.getWritePointer (
static_cast<int> (channel));
389 auto delay =
delayDown.getUnchecked (
static_cast<int> (channel));
391 for (
size_t i = 0;
i < numSamples; ++
i)
394 auto input = bufferSamples[
i << 1];
396 for (
auto n = 0;
n < directStages; ++
n)
398 auto alpha = coeffs[
n];
399 auto output = alpha * input + lv1[
n];
400 lv1[
n] = input - alpha * output;
404 auto directOut = input;
407 input = bufferSamples[(
i << 1) + 1];
409 for (
auto n = directStages;
n < numStages; ++
n)
411 auto alpha = coeffs[
n];
412 auto output = alpha * input + lv1[
n];
413 lv1[
n] = input - alpha * output;
418 samples[
i] = (delay + directOut) *
static_cast<SampleType
> (0.5);
422 delayDown.setUnchecked (
static_cast<int> (channel), delay);
425 #if JUCE_DSP_ENABLE_SNAP_TO_ZERO
432 if (snapUpProcessing)
434 for (
auto channel = 0; channel < ParentType::buffer.getNumChannels(); ++channel)
436 auto lv1 =
v1Up.getWritePointer (channel);
439 for (
auto n = 0;
n < numStages; ++
n)
445 for (
auto channel = 0; channel < ParentType::buffer.getNumChannels(); ++channel)
447 auto lv1 =
v1Down.getWritePointer (channel);
450 for (
auto n = 0;
n < numStages; ++
n)
463 constexpr auto one =
static_cast<SampleType
> (1.0);
466 numerator2 ({ one }), denominator2 ({ one });
470 auto coeffs =
i->getRawCoefficients();
472 if (
i->getFilterOrder() == 1)
486 auto coeffs =
i->getRawCoefficients();
488 if (
i->getFilterOrder() == 1)
501 auto numeratorf2 = numerator2.getProductWith (denominator1);
502 auto numerator = numeratorf1.getSumWith (numeratorf2);
503 auto denominator = denominator1.getProductWith (denominator2);
508 auto inversion = one / denominator[0];
510 for (
int i = 0;
i <= numerator.getOrder(); ++
i)
513 for (
int i = 1;
i <= denominator.getOrder(); ++
i)
532template <
typename SampleType>
541template <
typename SampleType>
544 bool useIntegerLatency)
555 for (
size_t n = 0;
n < newFactor; ++
n)
557 auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (
n == 0 ? 0.5f : 1.0f);
558 auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (
n == 0 ? 0.5f : 1.0f);
560 auto gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
561 auto gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
562 auto gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
563 auto gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
566 twUp, gaindBStartUp + gaindBFactorUp * (
float)
n,
567 twDown, gaindBStartDown + gaindBFactorDown * (
float)
n);
572 for (
size_t n = 0;
n < newFactor; ++
n)
574 auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (
n == 0 ? 0.5f : 1.0f);
575 auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (
n == 0 ? 0.5f : 1.0f);
577 auto gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);
578 auto gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);
579 auto gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);
580 auto gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);
583 twUp, gaindBStartUp + gaindBFactorUp * (
float)
n,
584 twDown, gaindBStartDown + gaindBFactorDown * (
float)
n);
589template <
typename SampleType>
596template <
typename SampleType>
602template <
typename SampleType>
604 float normalisedTransitionWidthUp,
605 float stopbandAmplitudedBUp,
606 float normalisedTransitionWidthDown,
607 float stopbandAmplitudedBDown)
612 normalisedTransitionWidthUp, stopbandAmplitudedBUp,
613 normalisedTransitionWidthDown, stopbandAmplitudedBDown));
618 normalisedTransitionWidthUp, stopbandAmplitudedBUp,
619 normalisedTransitionWidthDown, stopbandAmplitudedBDown));
625template <
typename SampleType>
633template <
typename SampleType>
639template <
typename SampleType>
646template <
typename SampleType>
649 auto latency =
static_cast<SampleType
> (0);
652 for (
auto* stage :
stages)
654 order *= stage->factor;
655 latency += stage->getLatencyInSamples() /
static_cast<SampleType
> (order);
661template <
typename SampleType>
668template <
typename SampleType>
672 auto currentNumSamples = maximumNumberOfSamplesBeforeOversampling;
674 for (
auto* stage :
stages)
676 stage->initProcessing (currentNumSamples);
677 currentNumSamples *= stage->factor;
681 delay.prepare (spec);
688template <
typename SampleType>
694 for (
auto* stage :
stages)
700template <
typename SampleType>
708 auto* firstStage =
stages.getUnchecked (0);
709 firstStage->processSamplesUp (inputBlock);
710 auto block = firstStage->getProcessedSamples (inputBlock.getNumSamples() * firstStage->factor);
714 stages[
i]->processSamplesUp (block);
715 block =
stages[
i]->getProcessedSamples (block.getNumSamples() *
stages[
i]->factor);
721template <
typename SampleType>
729 auto currentNumSamples = outputBlock.getNumSamples();
731 for (
int n = 0;
n <
stages.size() - 1; ++
n)
732 currentNumSamples *=
stages.getUnchecked(
n)->factor;
734 for (
int n =
stages.size() - 1;
n > 0; --
n)
736 auto& stage = *
stages.getUnchecked(
n);
737 auto audioBlock =
stages.getUnchecked (
n - 1)->getProcessedSamples (currentNumSamples);
738 stage.processSamplesDown (audioBlock);
740 currentNumSamples /= stage.factor;
743 stages.getFirst()->processSamplesDown (outputBlock);
748 delay.process (context);
752template <
typename SampleType>
756 fractionalDelay =
static_cast<SampleType
> (1.0) - (latency - std::floor (latency));
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition juce_Array.h:56
void add(const ElementType &newElement)
Definition juce_Array.h:418
void clear()
Definition juce_Array.h:188
Definition juce_AudioSampleBuffer.h:34
Definition juce_AudioBlock.h:70
AudioBlock getSubBlock(size_t newOffset, size_t newLength) const noexcept
Definition juce_AudioBlock.h:371
constexpr size_t getNumChannels() const noexcept
Definition juce_AudioBlock.h:235
SampleType * getChannelPointer(size_t channel) const noexcept
Definition juce_AudioBlock.h:241
AudioBlock & copyFrom(const AudioBlock< OtherSampleType > &src) noexcept
Definition juce_AudioBlock.h:314
constexpr size_t getNumSamples() const noexcept
Definition juce_AudioBlock.h:238
Definition juce_Oversampling.h:56
void setUsingIntegerLatency(bool shouldUseIntegerLatency) noexcept
Definition juce_Oversampling.cpp:634
void processSamplesDown(AudioBlock< SampleType > &outputBlock) noexcept
Definition juce_Oversampling.cpp:722
SampleType getUncompensatedLatency() const noexcept
Definition juce_Oversampling.cpp:647
FilterType
Definition juce_Oversampling.h:60
@ filterHalfBandFIREquiripple
Definition juce_Oversampling.h:61
@ filterHalfBandPolyphaseIIR
Definition juce_Oversampling.h:62
bool isReady
Definition juce_Oversampling.h:205
void clearOversamplingStages()
Definition juce_Oversampling.cpp:626
bool shouldUseIntegerLatency
Definition juce_Oversampling.h:205
void initProcessing(size_t maximumNumberOfSamplesBeforeOversampling)
Definition juce_Oversampling.cpp:669
void updateDelayLine()
Definition juce_Oversampling.cpp:753
SampleType getLatencyInSamples() const noexcept
Definition juce_Oversampling.cpp:640
DelayLine< SampleType, DelayLineInterpolationTypes::Thiran > delay
Definition juce_Oversampling.h:206
size_t factorOversampling
Definition juce_Oversampling.h:191
AudioBlock< SampleType > processSamplesUp(const AudioBlock< const SampleType > &inputBlock) noexcept
Definition juce_Oversampling.cpp:701
Oversampling(size_t numChannels=1)
Definition juce_Oversampling.cpp:533
void reset() noexcept
Definition juce_Oversampling.cpp:689
SampleType fractionalDelay
Definition juce_Oversampling.h:207
void addDummyOversamplingStage()
Definition juce_Oversampling.cpp:597
size_t numChannels
Definition juce_Oversampling.h:192
~Oversampling()
Definition juce_Oversampling.cpp:590
void addOversamplingStage(FilterType, float normalisedTransitionWidthUp, float stopbandAmplitudedBUp, float normalisedTransitionWidthDown, float stopbandAmplitudedBDown)
Definition juce_Oversampling.cpp:603
size_t getOversamplingFactor() const noexcept
Definition juce_Oversampling.cpp:662
OwnedArray< OversamplingStage > stages
Definition juce_Oversampling.h:204
Definition juce_Polynomial.h:38
Polynomial< FloatingType > getProductWith(const Polynomial< FloatingType > &other) const
Definition juce_Polynomial.h:135
register unsigned k
Definition inflate.c:946
register unsigned i
Definition inflate.c:1575
float out
Definition lilv_test.c:1461
void snapToZero(SIMDRegister< Type > &) noexcept
Definition juce_SIMDRegister_Impl.h:167
Definition juce_AudioBlock.h:29
Definition carla_juce.cpp:31
unsigned int uint32
Definition juce_MathsFunctions.h:45
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
#define N
Definition nseel-cfunc.c:36
static constexpr FloatType twoPi
Definition juce_MathsFunctions.h:385
Definition juce_FIRFilter.h:219
Definition juce_FilterDesign.h:259
ReferenceCountedArray< IIRCoefficients > directPath
Definition juce_FilterDesign.h:260
ReferenceCountedArray< IIRCoefficients > delayedPath
Definition juce_FilterDesign.h:260
static IIRPolyphaseAllpassStructure designIIRLowpassHalfBandPolyphaseAllpassMethod(FloatType normalisedTransitionWidth, FloatType stopbandAmplitudedB)
Definition juce_FilterDesign.cpp:615
static FIRCoefficientsPtr designFIRLowpassHalfBandEquirippleMethod(FloatType normalisedTransitionWidth, FloatType amplitudedB)
Definition juce_FilterDesign.cpp:238
Definition juce_IIRFilter.h:129
Array< NumericType > coefficients
Definition juce_IIRFilter.h:274
Definition juce_Oversampling.cpp:114
void processSamplesUp(const AudioBlock< const SampleType > &inputBlock) override
Definition juce_Oversampling.cpp:157
AudioBuffer< SampleType > stateDown2
Definition juce_Oversampling.cpp:251
typename Oversampling< SampleType >::OversamplingStage ParentType
Definition juce_Oversampling.cpp:115
Array< size_t > position
Definition juce_Oversampling.cpp:252
FIR::Coefficients< SampleType > coefficientsUp
Definition juce_Oversampling.cpp:250
SampleType getLatencyInSamples() const override
Definition juce_Oversampling.cpp:141
AudioBuffer< SampleType > stateUp
Definition juce_Oversampling.cpp:251
void reset() override
Definition juce_Oversampling.cpp:146
Oversampling2TimesEquirippleFIR(size_t numChans, SampleType normalisedTransitionWidthUp, SampleType stopbandAmplitudedBUp, SampleType normalisedTransitionWidthDown, SampleType stopbandAmplitudedBDown)
Definition juce_Oversampling.cpp:117
void processSamplesDown(AudioBlock< SampleType > &outputBlock) override
Definition juce_Oversampling.cpp:197
FIR::Coefficients< SampleType > coefficientsDown
Definition juce_Oversampling.cpp:250
AudioBuffer< SampleType > stateDown
Definition juce_Oversampling.cpp:251
Definition juce_Oversampling.cpp:266
void snapToZero(bool snapUpProcessing)
Definition juce_Oversampling.cpp:430
SampleType latency
Definition juce_Oversampling.cpp:521
void processSamplesUp(const AudioBlock< const SampleType > &inputBlock) override
Definition juce_Oversampling.cpp:315
typename Oversampling< SampleType >::OversamplingStage ParentType
Definition juce_Oversampling.cpp:267
void processSamplesDown(AudioBlock< SampleType > &outputBlock) override
Definition juce_Oversampling.cpp:371
SampleType getLatencyInSamples() const override
Definition juce_Oversampling.cpp:302
void reset() override
Definition juce_Oversampling.cpp:307
Oversampling2TimesPolyphaseIIR(size_t numChans, SampleType normalisedTransitionWidthUp, SampleType stopbandAmplitudedBUp, SampleType normalisedTransitionWidthDown, SampleType stopbandAmplitudedBDown)
Definition juce_Oversampling.cpp:269
AudioBuffer< SampleType > v1Down
Definition juce_Oversampling.cpp:523
IIR::Coefficients< SampleType > getCoefficients(typename FilterDesign< SampleType >::IIRPolyphaseAllpassStructure &structure) const
Definition juce_Oversampling.cpp:461
AudioBuffer< SampleType > v1Up
Definition juce_Oversampling.cpp:523
Array< SampleType > delayDown
Definition juce_Oversampling.cpp:524
Array< SampleType > coefficientsUp
Definition juce_Oversampling.cpp:520
Array< SampleType > coefficientsDown
Definition juce_Oversampling.cpp:520
Definition juce_Oversampling.cpp:36
size_t factor
Definition juce_Oversampling.cpp:64
size_t numChannels
Definition juce_Oversampling.cpp:64
virtual void initProcessing(size_t maximumNumberOfSamplesBeforeOversampling)
Definition juce_Oversampling.cpp:43
AudioBlock< SampleType > getProcessedSamples(size_t numSamples)
Definition juce_Oversampling.cpp:55
virtual void processSamplesUp(const AudioBlock< const SampleType > &)=0
virtual void reset()
Definition juce_Oversampling.cpp:50
AudioBuffer< SampleType > buffer
Definition juce_Oversampling.cpp:63
virtual void processSamplesDown(AudioBlock< SampleType > &)=0
virtual SampleType getLatencyInSamples() const =0
virtual ~OversamplingStage()
Definition juce_Oversampling.cpp:38
OversamplingStage(size_t numChans, size_t newFactor)
Definition juce_Oversampling.cpp:37
Definition juce_Oversampling.cpp:74
typename Oversampling< SampleType >::OversamplingStage ParentType
Definition juce_Oversampling.cpp:75
void processSamplesUp(const AudioBlock< const SampleType > &inputBlock) override
Definition juce_Oversampling.cpp:85
OversamplingDummy(size_t numChans)
Definition juce_Oversampling.cpp:77
SampleType getLatencyInSamples() const override
Definition juce_Oversampling.cpp:80
void processSamplesDown(AudioBlock< SampleType > &outputBlock) override
Definition juce_Oversampling.cpp:95
Definition juce_ProcessContext.h:88
Definition juce_ProcessContext.h:38
int n
Definition crypt.c:458
#define const
Definition zconf.h:137