Line data Source code
1 : /** 2 : * \file LinkwitzRileyFilter.hxx 3 : */ 4 : 5 : #include "LinkwitzRileyFilter.h" 6 : 7 : #include <boost/math/tools/polynomial.hpp> 8 : 9 : namespace ATK 10 : { 11 : template<typename DataType> 12 5 : LinkwitzRileyLowPassCoefficients<DataType>::LinkwitzRileyLowPassCoefficients(gsl::index nb_channels) 13 5 : :Parent(nb_channels) 14 : { 15 5 : } 16 : 17 : template <typename DataType> 18 13 : void LinkwitzRileyLowPassCoefficients<DataType>::setup() 19 : { 20 13 : Parent::setup(); 21 : 22 13 : CoeffDataType omega = boost::math::constants::pi<CoeffDataType>() * cut_frequency; 23 13 : CoeffDataType kappa = omega / std::tan(omega / input_sampling_rate); 24 13 : CoeffDataType delta = kappa * kappa + omega * omega + 2 * kappa * omega; 25 : 26 13 : coefficients_in[2] = omega * omega / delta; 27 13 : coefficients_in[1] = 2 * omega * omega / delta; 28 13 : coefficients_in[0] = omega * omega / delta; 29 13 : coefficients_out[1] = 2 * (kappa * kappa - omega * omega) / delta; 30 13 : coefficients_out[0] = -(omega * omega + kappa * kappa - 2 * kappa * omega) / delta; 31 13 : } 32 : 33 : template<typename DataType> 34 4 : LinkwitzRileyHighPassCoefficients<DataType>::LinkwitzRileyHighPassCoefficients(gsl::index nb_channels) 35 4 : :Parent(nb_channels) 36 : { 37 4 : } 38 : 39 : template <typename DataType> 40 12 : void LinkwitzRileyHighPassCoefficients<DataType>::setup() 41 : { 42 12 : Parent::setup(); 43 : 44 12 : CoeffDataType omega = boost::math::constants::pi<CoeffDataType>() * cut_frequency; 45 12 : CoeffDataType kappa = omega / std::tan(omega / input_sampling_rate); 46 12 : CoeffDataType delta = kappa * kappa + omega * omega + 2 * kappa * omega; 47 : 48 12 : coefficients_in[2] = kappa * kappa / delta; 49 12 : coefficients_in[1] = - 2 * kappa * kappa / delta; 50 12 : coefficients_in[0] = kappa * kappa / delta; 51 12 : coefficients_out[1] = 2 * (kappa * kappa - omega * omega) / delta; 52 12 : coefficients_out[0] = -(omega * omega + kappa * kappa - 2 * kappa * omega) / delta; 53 12 : } 54 : 55 : template<typename DataType> 56 6 : LinkwitzRiley4LowPassCoefficients<DataType>::LinkwitzRiley4LowPassCoefficients(gsl::index nb_channels) 57 6 : :Parent(nb_channels) 58 : { 59 6 : } 60 : 61 : template <typename DataType> 62 13 : void LinkwitzRiley4LowPassCoefficients<DataType>::setup() 63 : { 64 13 : Parent::setup(); 65 : 66 13 : auto wc=2*boost::math::constants::pi<CoeffDataType>() * cut_frequency; 67 13 : auto wc2=wc*wc; 68 13 : auto wc3=wc2*wc; 69 13 : auto wc4=wc2*wc2; 70 13 : auto k=wc/std::tan(wc/2/input_sampling_rate); 71 13 : auto k2=k*k; 72 13 : auto k3=k2*k; 73 13 : auto k4=k2*k2; 74 13 : auto sqrt2=std::sqrt(CoeffDataType(2)); 75 13 : auto sq_tmp1=sqrt2*wc3*k; 76 13 : auto sq_tmp2=sqrt2*wc*k3; 77 13 : auto a_tmp=4*wc2*k2+2*sq_tmp1+k4+2*sq_tmp2+wc4; 78 : 79 13 : coefficients_out[3]=-(4*(wc4+sq_tmp1-k4-sq_tmp2))/a_tmp; 80 13 : coefficients_out[2]=-(6*wc4-8*wc2*k2+6*k4)/a_tmp; 81 13 : coefficients_out[1]=-(4*(wc4-sq_tmp1+sq_tmp2-k4))/a_tmp; 82 13 : coefficients_out[0]=-(k4-2*sq_tmp1+wc4-2*sq_tmp2+4*wc2*k2)/a_tmp; 83 : 84 13 : coefficients_in[0] = coefficients_in[4] = wc4/a_tmp; 85 13 : coefficients_in[1] = coefficients_in[3] = 4*wc4/a_tmp; 86 13 : coefficients_in[2] = 6*wc4/a_tmp; 87 13 : } 88 : 89 : template<typename DataType> 90 4 : LinkwitzRiley4HighPassCoefficients<DataType>::LinkwitzRiley4HighPassCoefficients(gsl::index nb_channels) 91 4 : :Parent(nb_channels) 92 : { 93 4 : } 94 : 95 : template <typename DataType> 96 12 : void LinkwitzRiley4HighPassCoefficients<DataType>::setup() 97 : { 98 12 : Parent::setup(); 99 : 100 12 : auto wc=2*boost::math::constants::pi<CoeffDataType>() * cut_frequency; 101 12 : auto wc2=wc*wc; 102 12 : auto wc3=wc2*wc; 103 12 : auto wc4=wc2*wc2; 104 12 : auto k=wc/std::tan(wc/2/input_sampling_rate); 105 12 : auto k2=k*k; 106 12 : auto k3=k2*k; 107 12 : auto k4=k2*k2; 108 12 : auto sqrt2=std::sqrt(CoeffDataType(2)); 109 12 : auto sq_tmp1=sqrt2*wc3*k; 110 12 : auto sq_tmp2=sqrt2*wc*k3; 111 12 : auto a_tmp=4*wc2*k2+2*sq_tmp1+k4+2*sq_tmp2+wc4; 112 : 113 12 : coefficients_out[3]=-(4*(wc4+sq_tmp1-k4-sq_tmp2))/a_tmp; 114 12 : coefficients_out[2]=-(6*wc4-8*wc2*k2+6*k4)/a_tmp; 115 12 : coefficients_out[1]=-(4*(wc4-sq_tmp1+sq_tmp2-k4))/a_tmp; 116 12 : coefficients_out[0]=-(k4-2*sq_tmp1+wc4-2*sq_tmp2+4*wc2*k2)/a_tmp; 117 : 118 12 : coefficients_in[0] = coefficients_in[4] = k4/a_tmp; 119 12 : coefficients_in[1] = coefficients_in[3] = -4*k4/a_tmp; 120 12 : coefficients_in[2] = 6*k4/a_tmp; 121 12 : } 122 : }