9 m_sampleRate = sampleRate;
12 if (m_sampleRate / 2.0f > m_maxFreq)
14 m_freqs.push_back(m_sampleRate / 2.0f);
15 m_gains.push_back(m_gains.back());
19 m_a = getLowPassFilterCoefficients(m_fc / m_sampleRate, m_q);
22 m_b = convertToHighPass(m_a);
27 ReferenceCountedObjectPtr<CoefficientsIIR> filterCoeff =
29 m_filter.coefficients = filterCoeff;
32 calculateTransferFunction(m_b, m_a, 512);
35 std::transform(m_magResponse.begin(), m_magResponse.end(), m_magResponse.begin(),
36 [](
float value) { return value * value; });
40 m_gain = elementWiseDivision(gainsInterp, m_magResponse);
43 float conditionValue = m_freqs[1];
45 for (
size_t i = 0; i < m_gain.size(); ++i)
47 if (m_normalisedFreqs[i] < conditionValue)
53 m_freqResponse = linspace(0.0f, 1.0f,
static_cast<int>(m_gain.size()));
56 m_firCoeffb = fir2(N, m_freqResponse, m_gain);
62 jassert(m_sampleRate != -1.0f);
64 const int numSamples =
static_cast<int>(inputSignal.size());
67 std::vector<float> filteredSignal1;
68 std::vector<float> filteredSignal2;
69 applyIIRFilter(inputSignal, m_filter, filteredSignal1);
70 applyIIRFilter(filteredSignal1, m_filter, filteredSignal2);
73 std::vector<float> filteredSignal3;
74 applyFIRFilter(filteredSignal2, m_firCoeffb, filteredSignal3);
76 return filteredSignal3;
81 jassert(qualityFactor != 0.0f);
83 float rho = std::exp(-
float(
M_PI) * normalizedFrequency / qualityFactor);
85 2.0f * float(
M_PI) * normalizedFrequency * std::sqrt(1.0f - 1.0f / (4.0f * std::pow(qualityFactor, 2.0f)));
87 std::vector<float> coeff(
static_cast<int>(rho), 1.0f);
89 float a1 = -2.0f * rho * cos(theta);
90 float a2 = std::pow(rho, 2.0f);
92 coeff.push_back(1.0f);
102 for (
int i = 0; i < lowPassCoefficients.size(); i++)
104 sum += lowPassCoefficients[i];
107 float b0 = sum - 1.0f;
108 float b1 = -lowPassCoefficients[1];
109 float b2 = -lowPassCoefficients[2];
111 std::vector<float> coeff;
130 std::vector<float>& filteredSignal)
132 int numSamples =
static_cast<int>(inputSignal.size());
133 int numCoefficients =
static_cast<int>(coefficients.size());
135 for (
int sample = 0; sample < numSamples; ++sample)
137 float filteredSample = 0.0f;
139 for (
int i = 0; i < numCoefficients; ++i)
141 int index = sample - i;
143 filteredSample += coefficients[i] * inputSignal[index];
146 filteredSignal.push_back(filteredSample);
155 m_magResponse.resize(numPoints);
156 m_normalisedFreqs.resize(numPoints);
158 for (
int i = 0; i < numPoints; ++i)
160 float normalizedFrequency =
static_cast<float>(i) / numPoints;
161 float magnitude =
static_cast<float>(coeff.getMagnitudeForFrequency(
162 static_cast<double>(normalizedFrequency * 0.5f * m_sampleRate),
static_cast<double>(m_sampleRate)));
165 m_magResponse[i] = magnitude;
167 m_normalisedFreqs[i] = normalizedFrequency * m_sampleRate / 2.0f;
172 const std::vector<float>& vector2)
175 jassert(vector1.size() == vector2.size());
177 std::vector<float> result(vector1.size());
179 for (
int i = 0; i < vector1.size(); ++i)
182 result[i] = (vector2[i] != 0.0f) ? (vector1[i] / vector2[i] + std::numeric_limits<float>::epsilon()) : 0.0f;
191 jassert(freqResponse.size() == gain.size());
199 npt = std::pow(2.0f, std::ceilf(std::log2(
static_cast<float>(number))));
201 std::vector<float> wind(number);
203 for (
int n = 0; n < number; ++n)
205 wind[n] = 0.54f - 0.46f * std::cos((2.0f *
float(
M_PI) * n) /
float(number - 1.0f));
209 for (
int i = 0; i < number / 2; ++i)
211 wind[number - i - 1] = wind[i];
214 int lap =
static_cast<int>(std::floor(npt / 25.0f));
216 int nbrk =
static_cast<int>(gain.size());
218 const float eps = std::numeric_limits<float>::epsilon();
220 jassert(std::abs(freqResponse[0]) <= eps || std::abs(freqResponse[nbrk - 1] - 1) <= eps);
222 freqResponse[0] = 0.0f;
223 freqResponse[nbrk - 1] = 1.0f;
228 std::vector<double> df(freqResponse.size());
229 adjacent_difference(freqResponse.begin(), freqResponse.end(), df.begin());
230 df.erase(df.begin());
235 if (number > 2 *
static_cast<int>(npt))
242 std::vector<float> H;
246 for (
int i = 0; i < nint; ++i)
250 nb =
static_cast<int>(std::ceil(nb - lap / 2.0f));
255 ne =
static_cast<int>(std::floor(freqResponse[i + 1] * npt));
258 if (nb < 0 || ne > npt)
263 for (
int j = nb; j <= ne; ++j)
265 float inc = (j - nb) /
static_cast<float>(ne - nb);
270 H.push_back(inc * gain[i + 1] + (1.0f - inc) * gain[i]);
277 float dt = 0.5f * (number - 1);
279 std::vector<std::complex<float>> rad(
static_cast<int>(npt));
281 for (
int i = 0; i < npt; ++i)
283 float realPart = 0.0f;
284 float imagPart = -dt * float(
M_PI) *
static_cast<float>(i) /
static_cast<float>(npt - 1);
286 rad[i] = std::complex<float>(realPart, imagPart);
289 std::vector<std::complex<float>> Hexp(H.size());
291 for (
int i = 0; i < H.size(); ++i)
293 std::complex<float> expValue = std::exp(rad[i]);
294 Hexp[i] = H[i] * expValue;
298 Hexp.back().imag(0.0f);
302 std::vector<std::complex<float>> H_reversed(Hexp.rbegin() + 1, Hexp.rend());
303 std::vector<std::complex<float>> H_conj;
304 for (
const auto& h : H_reversed)
307 H_conj.push_back(std::conj(h));
311 Hexp.insert(Hexp.end(), H_conj.begin(), H_conj.end() - 1);
314 juce::dsp::FFT fft(
static_cast<int>(std::log2(
static_cast<float>(Hexp.size()))));
317 std::vector<std::complex<float>> Hexp1(Hexp.size());
318 fft.perform(Hexp.data(), Hexp1.data(),
true);
321 std::vector<float> ht(Hexp1.size());
323 for (
int i = 0; i < Hexp1.size(); ++i)
325 ht[i] = Hexp1[i].real();
329 std::vector<float> b(ht.begin(), ht.begin() + number);
332 for (
int i = 0; i < number; i++)
void applyIIRFilter(const std::vector< float > &inputSignal, dsp::IIR::Filter< float > &filter, std::vector< float > &filteredSignal)
Definition EarFilter.cpp:119
void applyFIRFilter(const std::vector< float > &inputSignal, const std::vector< float > &coefficients, std::vector< float > &filteredSignal)
Definition EarFilter.cpp:129
std::vector< float > fir2(int N, std::vector< float > &freqResponse, const std::vector< float > &gain)
Definition EarFilter.cpp:188
static std::vector< float > interpolate(const std::vector< float > &xValues, const std::vector< float > &yValues, const std::vector< float > &vals)
Definition KrotosIntrepolators.cpp:283