LMMS
Loading...
Searching...
No Matches
juce_LinkwitzRileyFilter.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28namespace dsp
29{
30
31//==============================================================================
32template <typename SampleType>
37
38//==============================================================================
39template <typename SampleType>
41{
42 filterType = newType;
43}
44
45template <typename SampleType>
46void LinkwitzRileyFilter<SampleType>::setCutoffFrequency (SampleType newCutoffFrequencyHz)
47{
48 jassert (isPositiveAndBelow (newCutoffFrequencyHz, static_cast<SampleType> (sampleRate * 0.5)));
49
50 cutoffFrequency = newCutoffFrequencyHz;
51 update();
52}
53
54//==============================================================================
55template <typename SampleType>
57{
58 jassert (spec.sampleRate > 0);
59 jassert (spec.numChannels > 0);
60
62 update();
63
64 s1.resize (spec.numChannels);
65 s2.resize (spec.numChannels);
66 s3.resize (spec.numChannels);
67 s4.resize (spec.numChannels);
68
69 reset();
70}
71
72template <typename SampleType>
74{
75 for (auto s : { &s1, &s2, &s3, &s4 })
76 std::fill (s->begin(), s->end(), static_cast<SampleType> (0));
77}
78
79template <typename SampleType>
81{
82 for (auto s : { &s1, &s2, &s3, &s4 })
83 for (auto& element : *s)
84 util::snapToZero (element);
85}
86
87//==============================================================================
88template <typename SampleType>
89SampleType LinkwitzRileyFilter<SampleType>::processSample (int channel, SampleType inputValue)
90{
91 auto yH = (inputValue - (R2 + g) * s1[(size_t) channel] - s2[(size_t) channel]) * h;
92
93 auto yB = g * yH + s1[(size_t) channel];
94 s1[(size_t) channel] = g * yH + yB;
95
96 auto yL = g * yB + s2[(size_t) channel];
97 s2[(size_t) channel] = g * yB + yL;
98
99 if (filterType == Type::allpass)
100 return yL - R2 * yB + yH;
101
102 auto yH2 = ((filterType == Type::lowpass ? yL : yH) - (R2 + g) * s3[(size_t) channel] - s4[(size_t) channel]) * h;
103
104 auto yB2 = g * yH2 + s3[(size_t) channel];
105 s3[(size_t) channel] = g * yH2 + yB2;
106
107 auto yL2 = g * yB2 + s4[(size_t) channel];
108 s4[(size_t) channel] = g * yB2 + yL2;
109
110 return filterType == Type::lowpass ? yL2 : yH2;
111}
112
113template <typename SampleType>
114void LinkwitzRileyFilter<SampleType>::processSample (int channel, SampleType inputValue, SampleType &outputLow, SampleType &outputHigh)
115{
116 auto yH = (inputValue - (R2 + g) * s1[(size_t) channel] - s2[(size_t) channel]) * h;
117
118 auto yB = g * yH + s1[(size_t) channel];
119 s1[(size_t) channel] = g * yH + yB;
120
121 auto yL = g * yB + s2[(size_t) channel];
122 s2[(size_t) channel] = g * yB + yL;
123
124 auto yH2 = (yL - (R2 + g) * s3[(size_t) channel] - s4[(size_t) channel]) * h;
125
126 auto yB2 = g * yH2 + s3[(size_t) channel];
127 s3[(size_t) channel] = g * yH2 + yB2;
128
129 auto yL2 = g * yB2 + s4[(size_t) channel];
130 s4[(size_t) channel] = g * yB2 + yL2;
131
132 outputLow = yL2;
133 outputHigh = yL - R2 * yB + yH - yL2;
134}
135
136template <typename SampleType>
138{
139 g = (SampleType) std::tan (MathConstants<double>::pi * cutoffFrequency / sampleRate);
140 R2 = (SampleType) std::sqrt (2.0);
141 h = (SampleType) (1.0 / (1.0 + R2 * g + g * g));
142}
143
144//==============================================================================
145template class LinkwitzRileyFilter<float>;
146template class LinkwitzRileyFilter<double>;
147
148} // namespace dsp
149} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_LinkwitzRileyFilter.h:51
void prepare(const ProcessSpec &spec)
Definition juce_LinkwitzRileyFilter.cpp:56
void setType(Type newType)
Definition juce_LinkwitzRileyFilter.cpp:40
std::vector< SampleType > s2
Definition juce_LinkwitzRileyFilter.h:135
void update()
Definition juce_LinkwitzRileyFilter.cpp:137
void reset()
Definition juce_LinkwitzRileyFilter.cpp:73
SampleType h
Definition juce_LinkwitzRileyFilter.h:134
SampleType R2
Definition juce_LinkwitzRileyFilter.h:134
LinkwitzRileyFilter()
Definition juce_LinkwitzRileyFilter.cpp:33
SampleType processSample(int channel, SampleType inputValue)
Definition juce_LinkwitzRileyFilter.cpp:89
std::vector< SampleType > s3
Definition juce_LinkwitzRileyFilter.h:135
std::vector< SampleType > s1
Definition juce_LinkwitzRileyFilter.h:135
SampleType cutoffFrequency
Definition juce_LinkwitzRileyFilter.h:138
Type filterType
Definition juce_LinkwitzRileyFilter.h:139
std::vector< SampleType > s4
Definition juce_LinkwitzRileyFilter.h:135
void setCutoffFrequency(SampleType newCutoffFrequencyHz)
Definition juce_LinkwitzRileyFilter.cpp:46
SampleType g
Definition juce_LinkwitzRileyFilter.h:134
void snapToZero() noexcept
Definition juce_LinkwitzRileyFilter.cpp:80
double sampleRate
Definition juce_LinkwitzRileyFilter.h:137
LinkwitzRileyFilterType Type
Definition juce_LinkwitzRileyFilter.h:54
unsigned s
Definition inflate.c:1555
#define jassert(expression)
void snapToZero(SIMDRegister< Type > &) noexcept
Definition juce_SIMDRegister_Impl.h:167
Definition juce_AudioBlock.h:29
Definition carla_juce.cpp:31
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
static constexpr FloatType pi
Definition juce_MathsFunctions.h:382
Definition juce_ProcessContext.h:38
uint32 numChannels
Definition juce_ProcessContext.h:46
double sampleRate
Definition juce_ProcessContext.h:40