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

          Line data    Source code
       1             : /**
       2             :  * \file AllPassReverbFilter.cpp
       3             :  */
       4             : 
       5             : #include "AllPassReverbFilter.h"
       6             : #include <ATK/Core/Utilities.h>
       7             : 
       8             : #include <iostream>
       9             : #include <cmath>
      10             : 
      11             : namespace ATK
      12             : {
      13             :   template<typename DataType_>
      14           9 :   AllPassReverbFilter<DataType_>::AllPassReverbFilter(gsl::index max_delay)
      15           9 :     :Parent(1, 1)
      16             :   {
      17           9 :     output_delay = max_delay;
      18           9 :     input_delay = max_delay;
      19           9 :   }
      20             :   
      21             :   template<typename DataType_>
      22           6 :   void AllPassReverbFilter<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 >= output_delay)
      29             :     {
      30           1 :       throw ATK::RuntimeError("Delay must be less than delay line size");
      31             :     }
      32             : 
      33           4 :     this->delay = delay;
      34           4 :   }
      35             : 
      36             :   template<typename DataType_>
      37           1 :   gsl::index AllPassReverbFilter<DataType_>::get_delay() const
      38             :   {
      39           1 :     return delay;
      40             :   }
      41             : 
      42             :   template<typename DataType_>
      43           5 :   void AllPassReverbFilter<DataType_>::set_feedback(DataType_ feedback)
      44             :   {
      45           5 :     if(std::abs(feedback) >= 1)
      46             :     {
      47           2 :       throw ATK::RuntimeError("Feedback 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_ AllPassReverbFilter<DataType_>::get_feedback() const
      54             :   {
      55           1 :     return feedback;
      56             :   }
      57             : 
      58             :   template<typename DataType_>
      59          12 :   void AllPassReverbFilter<DataType_>::process_impl(gsl::index size) const
      60             :   {
      61          12 :     const DataType* ATK_RESTRICT input = converted_inputs[0];
      62          12 :     DataType* ATK_RESTRICT output = outputs[0];
      63      196620 :     for(gsl::index i = 0; i < size; ++i)
      64             :     {
      65      196608 :       output[i] = feedback * (output[i - delay] - input[i]) + input[i - delay];
      66             :     }
      67          12 :   }
      68             : 
      69             : #if ATK_ENABLE_INSTANTIATION
      70             :   template class AllPassReverbFilter<float>;
      71             : #endif
      72             :   template class AllPassReverbFilter<double>;
      73             : }

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