LCOV - code coverage report
Current view: top level - EQ - LinkwitzRileyFilter.hxx (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 78 78 100.0 %
Date: 2021-02-18 20:07:22 Functions: 8 8 100.0 %

          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             : }

Generated by: LCOV version TK-3.3.0-4-gdba42eea