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

          Line data    Source code
       1             : /**
       2             :  * \file LowPassReverbFilter.cpp
       3             :  */
       4             : 
       5             : #include "LowPassReverbFilter.h"
       6             : #include <ATK/Core/Utilities.h>
       7             : 
       8             : #include <iostream>
       9             : #include <cmath>
      10             : 
      11             : namespace ATK
      12             : {
      13             :   template<typename DataType_>
      14          13 :   LowPassReverbFilter<DataType_>::LowPassReverbFilter(gsl::index max_delay)
      15          13 :     :Parent(1, 1)
      16             :   {
      17          13 :     output_delay = max_delay;
      18          13 :     input_delay = max_delay;
      19          13 :   }
      20             :   
      21             :   template<typename DataType_>
      22           6 :   void LowPassReverbFilter<DataType_>::set_delay(gsl::index delay)
      23             :   {
      24           6 :     if(delay == 0)
      25             :     {
      26           1 :       throw ATK::RuntimeError("Delay must be strictly positive");
      27             :     }
      28           5 :     if(delay + 1 >= output_delay)
      29             :     {
      30           1 :       throw ATK::RuntimeError("Delay must be less than delay line size - 1");
      31             :     }
      32             : 
      33           4 :     this->delay = delay;
      34           4 :   }
      35             : 
      36             :   template<typename DataType_>
      37           1 :   gsl::index LowPassReverbFilter<DataType_>::get_delay() const
      38             :   {
      39           1 :     return delay;
      40             :   }
      41             :   
      42             :   template<typename DataType_>
      43           6 :   void LowPassReverbFilter<DataType_>::set_feedback(DataType_ feedback)
      44             :   {
      45           6 :     if(std::abs(feedback + cutoff) >= 1)
      46             :     {
      47           3 :       throw ATK::RuntimeError("Sum of Feedback and Cutoff must be between -1 and 1 to avoid divergence");
      48             :     }
      49           3 :     this->feedback = feedback;
      50           3 :   }
      51             :   
      52             :   template<typename DataType_>
      53           1 :   DataType_ LowPassReverbFilter<DataType_>::get_feedback() const
      54             :   {
      55           1 :     return feedback;
      56             :   }
      57             :   
      58             :   template<typename DataType_>
      59           5 :   void LowPassReverbFilter<DataType_>::set_cutoff(DataType_ cutoff)
      60             :   {
      61           5 :     if(std::abs(feedback + cutoff) >= 1)
      62             :     {
      63           2 :       throw ATK::RuntimeError("Sum of Feedback and Cutoff must be between -1 and 1 to avoid divergence");
      64             :     }
      65           3 :     this->cutoff = cutoff;
      66           3 :   }
      67             :   
      68             :   template<typename DataType_>
      69           1 :   DataType_ LowPassReverbFilter<DataType_>::get_cutoff() const
      70             :   {
      71           1 :     return cutoff;
      72             :   }
      73             : 
      74             :   template<typename DataType_>
      75          12 :   void LowPassReverbFilter<DataType_>::process_impl(gsl::index size) const
      76             :   {
      77          12 :     const DataType* ATK_RESTRICT input = converted_inputs[0];
      78          12 :     DataType* ATK_RESTRICT output = outputs[0];
      79      196620 :     for(gsl::index i = 0; i < size; ++i)
      80             :     {
      81      196608 :       output[i] = feedback * output[i - delay] + input[i - delay] + cutoff * (output[i - 1] - input[i - delay - 1]);
      82             :     }
      83          12 :   }
      84             : 
      85             : #if ATK_ENABLE_INSTANTIATION
      86             :   template class LowPassReverbFilter<float>;
      87             : #endif
      88             :   template class LowPassReverbFilter<double>;
      89             : }

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