| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | #include "BiquadCombo.h"#include <stdio.h>  // for printf#include <cmath>    // for sinf, M_PI#include <utility>  // for moveusing namespace bell;BiquadCombo::BiquadCombo() {}void BiquadCombo::sampleRateChanged(uint32_t sampleRate) {  for (auto& biquad : biquads) {    biquad->sampleRateChanged(sampleRate);  }}std::vector<float> BiquadCombo::calculateBWQ(int order) {  std::vector<float> qValues;  for (int n = 0; n < order / 2; n++) {    float q = 1.0f / (2.0f * sinf(M_PI / order * (((float)n) + 0.5)));    qValues.push_back(q);  }  if (order % 2 > 0) {    qValues.push_back(-1.0);  }  printf("%d\n", qValues.size());  return qValues;}std::vector<float> BiquadCombo::calculateLRQ(int order) {  auto qValues = calculateBWQ(order / 2);  if (order % 4 > 0) {    qValues.pop_back();    qValues.insert(qValues.end(), qValues.begin(), qValues.end());    qValues.push_back(0.5);  } else {    qValues.insert(qValues.end(), qValues.begin(), qValues.end());  }  return qValues;}void BiquadCombo::butterworth(float freq, int order, FilterType type) {  std::vector<float> qValues = calculateBWQ(order);  for (auto& q : qValues) {}}void BiquadCombo::linkwitzRiley(float freq, int order, FilterType type) {  std::vector<float> qValues = calculateLRQ(order);  for (auto& q : qValues) {    auto filter = std::make_unique<Biquad>();    filter->channel = channel;    auto config = std::map<std::string, float>();    config["freq"] = freq;    config["q"] = q;    if (q >= 0.0) {      if (type == FilterType::Highpass) {        filter->configure(Biquad::Type::Highpass, config);      } else {        filter->configure(Biquad::Type::Lowpass, config);      }    } else {      if (type == FilterType::Highpass) {        filter->configure(Biquad::Type::HighpassFO, config);      } else {        filter->configure(Biquad::Type::LowpassFO, config);      }    }    this->biquads.push_back(std::move(filter));  }}std::unique_ptr<StreamInfo> BiquadCombo::process(    std::unique_ptr<StreamInfo> data) {  std::scoped_lock lock(this->accessMutex);  for (auto& transform : this->biquads) {    data = transform->process(std::move(data));  }  return data;}
 |