LCOV - code coverage report
Current view: top level - EQ - TimeVaryingSecondOrderSVFFilter.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 149 149 100.0 %
Date: 2021-02-18 20:07:22 Functions: 57 65 87.7 %

          Line data    Source code
       1             : /**
       2             :  * \file TimeVaryingSecondOrderSVFFilter.cpp
       3             :  */
       4             : 
       5             : #include "TimeVaryingSecondOrderSVFFilter.h"
       6             : 
       7             : #include <boost/math/constants/constants.hpp>
       8             : 
       9             : #include <cassert>
      10             : 
      11             : namespace ATK
      12             : {
      13             :   template<typename SVFCoefficients>
      14             :   class TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::SVFState
      15             :   {
      16             :   public:
      17             :     typename SVFCoefficients::DataType iceq1{0};
      18             :     typename SVFCoefficients::DataType iceq2{0};
      19             :   };
      20             :   
      21             :   template<typename SVFCoefficients>
      22          35 :   TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::TimeVaryingSecondOrderSVFFilter(gsl::index nb_channels)
      23          35 :   :SVFCoefficients(nb_channels), state(std::make_unique<SVFState[]>(nb_channels))
      24             :   {
      25          35 :   }
      26             : 
      27             :   template<typename SVFCoefficients>
      28          35 :   TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::~TimeVaryingSecondOrderSVFFilter()
      29             :   {
      30          35 :   }
      31             : 
      32             :   template<typename SVFCoefficients>
      33          58 :   void TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::full_setup()
      34             :   {
      35          58 :     state = std::make_unique<SVFState[]>(nb_input_ports - 1);
      36          58 :   }
      37             : 
      38             :   template<typename DataType>
      39          58 :   void TimeVaryingSecondOrderSVFFilter<DataType>::process_impl(gsl::index size) const
      40             :   {
      41          58 :     assert(nb_input_ports - 1 == nb_output_ports);
      42             : 
      43     3801146 :     for(gsl::index i = 0; i < size; ++i)
      44             :     {
      45     3801088 :       update_coeffs(converted_inputs[0][i]);
      46             :       
      47     7602196 :       for(gsl::index j = 0; j < nb_input_ports - 1; ++j)
      48             :       {
      49     3801088 :         const DataType* ATK_RESTRICT input = converted_inputs[j+1];
      50     3801088 :         DataType* ATK_RESTRICT output = outputs[j];
      51             : 
      52     3801088 :         DataType v3 = input[i] - state[j].iceq2;
      53     3801088 :         DataType v1 = a1 * state[j].iceq1 + a2 * v3;
      54     3801088 :         DataType v2 = state[j].iceq2 + a2 * state[j].iceq1 + a3 * v3;
      55     3801088 :         state[j].iceq1 = 2 * v1 - state[j].iceq1;
      56     3801088 :         state[j].iceq2 = 2 * v2 - state[j].iceq2;
      57             :         
      58     3801088 :         output[i] = m0 * input[i] + m1 * v1 + m2 * v2;
      59             :       }
      60             :     }
      61          58 :   }
      62             :   
      63             :   template<typename DataType>
      64          35 :   TimeVaryingSecondOrderSVFBaseCoefficients<DataType>::TimeVaryingSecondOrderSVFBaseCoefficients(gsl::index nb_channels)
      65          35 :   :TypedBaseFilter<DataType>(1 + nb_channels, nb_channels)
      66             :   {
      67          35 :   }
      68             : 
      69             :   template<typename DataType_>
      70           5 :   void TimeVaryingSecondOrderSVFBaseCoefficients<DataType_>::set_Q(DataType_ Q)
      71             :   {
      72           5 :     if(Q <= 0)
      73             :     {
      74           1 :       throw std::out_of_range("Q must be strictly positive");
      75             :     }
      76           4 :     this->Q = Q;
      77           4 :     setup();
      78           4 :   }
      79             : 
      80             :   template<typename DataType>
      81           1 :   DataType TimeVaryingSecondOrderSVFBaseCoefficients<DataType>::get_Q() const
      82             :   {
      83           1 :     return Q;
      84             :   }
      85             : 
      86             :   template<typename DataType_>
      87           4 :   TimeVaryingSecondOrderSVFLowPassCoefficients<DataType_>::TimeVaryingSecondOrderSVFLowPassCoefficients(gsl::index nb_channels)
      88           4 :   :Parent(nb_channels)
      89             :   {
      90           4 :   }
      91             : 
      92             :   template<typename DataType>
      93      524288 :   void TimeVaryingSecondOrderSVFLowPassCoefficients<DataType>::update_coeffs(DataType g) const
      94             :   {
      95      524288 :     auto k = 1/Q;
      96      524288 :     a1 = 1 / (1 + g * (g + k));
      97      524288 :     a2 = g * a1;
      98      524288 :     a3 = g * a2;
      99      524288 :     m0 = 0;
     100      524288 :     m1 = 0;
     101      524288 :     m2 = 1;
     102      524288 :   }
     103             : 
     104             :   template<typename DataType_>
     105           5 :   TimeVaryingSecondOrderSVFBandPassCoefficients<DataType_>::TimeVaryingSecondOrderSVFBandPassCoefficients(gsl::index nb_channels)
     106           5 :   :Parent(nb_channels)
     107             :   {
     108           5 :   }
     109             : 
     110             :   template<typename DataType>
     111      393216 :   void TimeVaryingSecondOrderSVFBandPassCoefficients<DataType>::update_coeffs(DataType g) const
     112             :   {
     113      393216 :     auto k = 1 / Q;
     114      393216 :     a1 = 1 / (1 + g * (g + k));
     115      393216 :     a2 = g * a1;
     116      393216 :     a3 = g * a2;
     117      393216 :     m0 = 0;
     118      393216 :     m1 = 1;
     119      393216 :     m2 = 0;
     120      393216 :   }
     121             : 
     122             :   template<typename DataType_>
     123           4 :   TimeVaryingSecondOrderSVFHighPassCoefficients<DataType_>::TimeVaryingSecondOrderSVFHighPassCoefficients(gsl::index nb_channels)
     124           4 :   :Parent(nb_channels)
     125             :   {
     126           4 :   }
     127             : 
     128             :   template<typename DataType>
     129      524288 :   void TimeVaryingSecondOrderSVFHighPassCoefficients<DataType>::update_coeffs(DataType g) const
     130             :   {
     131      524288 :     auto k = 1 / Q;
     132      524288 :     a1 = 1 / (1 + g * (g + k));
     133      524288 :     a2 = g * a1;
     134      524288 :     a3 = g * a2;
     135      524288 :     m0 = 1;
     136      524288 :     m1 = -k;
     137      524288 :     m2 = -1;
     138      524288 :   }
     139             : 
     140             :   template<typename DataType_>
     141           4 :   TimeVaryingSecondOrderSVFNotchCoefficients<DataType_>::TimeVaryingSecondOrderSVFNotchCoefficients(gsl::index nb_channels)
     142           4 :   :Parent(nb_channels)
     143             :   {
     144           4 :   }
     145             : 
     146             :   template<typename DataType>
     147      524288 :   void TimeVaryingSecondOrderSVFNotchCoefficients<DataType>::update_coeffs(DataType g) const
     148             :   {
     149      524288 :     auto k = 1 / Q;
     150      524288 :     a1 = 1 / (1 + g * (g + k));
     151      524288 :     a2 = g * a1;
     152      524288 :     a3 = g * a2;
     153      524288 :     m0 = 1;
     154      524288 :     m1 = -k;
     155      524288 :     m2 = 0;
     156      524288 :   }
     157             : 
     158             :   template<typename DataType_>
     159           4 :   TimeVaryingSecondOrderSVFPeakCoefficients<DataType_>::TimeVaryingSecondOrderSVFPeakCoefficients(gsl::index nb_channels)
     160           4 :   :Parent(nb_channels)
     161             :   {
     162           4 :   }
     163             : 
     164             :   template<typename DataType>
     165      524288 :   void TimeVaryingSecondOrderSVFPeakCoefficients<DataType>::update_coeffs(DataType g) const
     166             :   {
     167      524288 :     auto k = 1 / Q;
     168      524288 :     a1 = 1 / (1 + g * (g + k));
     169      524288 :     a2 = g * a1;
     170      524288 :     a3 = g * a2;
     171      524288 :     m0 = 1;
     172      524288 :     m1 = -k;
     173      524288 :     m2 = 2;
     174      524288 :   }
     175             : 
     176             :   template<typename DataType_>
     177           6 :   TimeVaryingSecondOrderSVFBellCoefficients<DataType_>::TimeVaryingSecondOrderSVFBellCoefficients(gsl::index nb_channels)
     178           6 :   :Parent(nb_channels)
     179             :   {
     180             :     
     181           6 :   }
     182             :   
     183             :   template<typename DataType_>
     184           6 :   void TimeVaryingSecondOrderSVFBellCoefficients<DataType_>::set_gain(DataType_ gain)
     185             :   {
     186           6 :     if(gain <= 0)
     187             :     {
     188           1 :       throw std::out_of_range("Gain must be strictly positive");
     189             :     }
     190           5 :     this->gain = gain;
     191           5 :     setup();
     192           5 :   }
     193             : 
     194             :   template<typename DataType>
     195           1 :   DataType TimeVaryingSecondOrderSVFBellCoefficients<DataType>::get_gain() const
     196             :   {
     197           1 :     return gain;
     198             :   }
     199             : 
     200             :   template<typename DataType>
     201      524288 :   void TimeVaryingSecondOrderSVFBellCoefficients<DataType>::update_coeffs(DataType g) const
     202             :   {
     203      524288 :     auto k = 1 / (Q * gain);
     204      524288 :     a1 = 1 / (1 + g * (g + k));
     205      524288 :     a2 = g * a1;
     206      524288 :     a3 = g * a2;
     207      524288 :     m0 = 1;
     208      524288 :     m1 = k * (gain * gain - 1);
     209      524288 :     m2 = 0;
     210      524288 :   }
     211             : 
     212             :   template<typename DataType_>
     213           4 :   TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType_>::TimeVaryingSecondOrderSVFLowShelfCoefficients(gsl::index nb_channels)
     214           4 :   :Parent(nb_channels)
     215             :   {
     216             :     
     217           4 :   }
     218             : 
     219             :   template<typename DataType_>
     220           4 :   void TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType_>::set_gain(DataType_ gain)
     221             :   {
     222           4 :     this->gain = gain;
     223           4 :     setup();
     224           4 :   }
     225             : 
     226             :   template<typename DataType>
     227           1 :   DataType TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType>::get_gain() const
     228             :   {
     229           1 :     return gain;
     230             :   }
     231             : 
     232             :   template<typename DataType>
     233      393216 :   void TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType>::update_coeffs(DataType g) const
     234             :   {
     235      393216 :     auto k = 1 / Q;
     236      393216 :     a1 = 1 / (1 + g * (g + k));
     237      393216 :     a2 = g * a1;
     238      393216 :     a3 = g * a2;
     239      393216 :     m0 = 1;
     240      393216 :     m1 = k * (gain - 1);
     241      393216 :     m2 = gain * gain - 1;
     242      393216 :   }
     243             : 
     244             :   template<typename DataType_>
     245           4 :   TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType_>::TimeVaryingSecondOrderSVFHighShelfCoefficients(gsl::index nb_channels)
     246           4 :   :Parent(nb_channels)
     247             :   {
     248           4 :   }
     249             : 
     250             :   template<typename DataType_>
     251           4 :   void TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType_>::set_gain(DataType_ gain)
     252             :   {
     253           4 :     this->gain = gain;
     254           4 :     setup();
     255           4 :   }
     256             : 
     257             :   template<typename DataType>
     258           1 :   DataType TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType>::get_gain() const
     259             :   {
     260           1 :     return gain;
     261             :   }
     262             : 
     263             :   template<typename DataType>
     264      393216 :   void TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType>::update_coeffs(DataType g) const
     265             :   {
     266      393216 :     auto k = 1 / (Q* gain);
     267      393216 :     a1 = 1 / (1 + g * (g + k));
     268      393216 :     a2 = g * a1;
     269      393216 :     a3 = g * a2;
     270      393216 :     m0 = gain * gain;
     271      393216 :     m1 = k * (1 - gain) * gain;
     272      393216 :     m2 = 1 - gain * gain;
     273      393216 :   }
     274             : 
     275             : #if ATK_ENABLE_INSTANTIATION
     276             :   template class TimeVaryingSecondOrderSVFBaseCoefficients<float>;
     277             : 
     278             :   template class TimeVaryingSecondOrderSVFLowPassCoefficients<float>;
     279             :   template class TimeVaryingSecondOrderSVFBandPassCoefficients<float>;
     280             :   template class TimeVaryingSecondOrderSVFHighPassCoefficients<float>;
     281             :   template class TimeVaryingSecondOrderSVFNotchCoefficients<float>;
     282             :   template class TimeVaryingSecondOrderSVFPeakCoefficients<float>;
     283             :   template class TimeVaryingSecondOrderSVFBellCoefficients<float>;
     284             :   template class TimeVaryingSecondOrderSVFLowShelfCoefficients<float>;
     285             :   template class TimeVaryingSecondOrderSVFHighShelfCoefficients<float>;
     286             : 
     287             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowPassCoefficients<float> >;
     288             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBandPassCoefficients<float> >;
     289             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighPassCoefficients<float> >;
     290             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFNotchCoefficients<float> >;
     291             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFPeakCoefficients<float> >;
     292             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBellCoefficients<float> >;
     293             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowShelfCoefficients<float> >;
     294             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighShelfCoefficients<float> >;
     295             : #endif
     296             :   template class TimeVaryingSecondOrderSVFBaseCoefficients<double>;
     297             : 
     298             :   template class TimeVaryingSecondOrderSVFLowPassCoefficients<double>;
     299             :   template class TimeVaryingSecondOrderSVFBandPassCoefficients<double>;
     300             :   template class TimeVaryingSecondOrderSVFHighPassCoefficients<double>;
     301             :   template class TimeVaryingSecondOrderSVFNotchCoefficients<double>;
     302             :   template class TimeVaryingSecondOrderSVFPeakCoefficients<double>;
     303             :   template class TimeVaryingSecondOrderSVFBellCoefficients<double>;
     304             :   template class TimeVaryingSecondOrderSVFLowShelfCoefficients<double>;
     305             :   template class TimeVaryingSecondOrderSVFHighShelfCoefficients<double>;
     306             : 
     307             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowPassCoefficients<double> >;
     308             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBandPassCoefficients<double> >;
     309             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighPassCoefficients<double> >;
     310             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFNotchCoefficients<double> >;
     311             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFPeakCoefficients<double> >;
     312             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBellCoefficients<double> >;
     313             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowShelfCoefficients<double> >;
     314             :   template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighShelfCoefficients<double> >;
     315             : }

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