LCOV - code coverage report
Current view: top level - Dynamic - RelativePowerFilter.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 21 22 95.5 %
Date: 2021-02-18 20:07:22 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /**
       2             :  * \file RelativePowerFilter.cpp
       3             :  */
       4             : 
       5             : #include "RelativePowerFilter.h"
       6             : #include <ATK/Core/Utilities.h>
       7             : 
       8             : #include <cassert>
       9             : #include <cstdint>
      10             : #include <limits>
      11             : 
      12             : namespace ATK
      13             : {
      14             :   template<typename DataType_>
      15          12 :   RelativePowerFilter<DataType_>::RelativePowerFilter(gsl::index nb_channels)
      16          12 :   :Parent(nb_channels, nb_channels)
      17             :   {
      18          12 :     output_delay = 1;
      19          12 :   }
      20             :   
      21             :   template<typename DataType_>
      22          12 :   void RelativePowerFilter<DataType_>::set_memory(DataType_ memory_factor)
      23             :   {
      24          12 :     if(memory_factor < 0 || memory_factor >= 1)
      25             :     {
      26           2 :       throw ATK::RuntimeError("Memory factor must be a positive value less than 1 (so that it doesn't diverge)");
      27             :     }
      28          10 :     this->memory_factor = memory_factor;
      29          10 :   }
      30             :   
      31             :   template<typename DataType_>
      32           1 :   DataType_ RelativePowerFilter<DataType_>::get_memory() const
      33             :   {
      34           1 :     return memory_factor;
      35             :   }
      36             :   
      37             :   template<typename DataType_>
      38          18 :   void RelativePowerFilter<DataType_>::process_impl(gsl::index size) const
      39             :   {
      40          18 :     assert(nb_input_ports == nb_output_ports);
      41             : 
      42          36 :     for(gsl::index channel = 0; channel < nb_input_ports; ++channel)
      43             :     {
      44          18 :       const DataType* ATK_RESTRICT input = converted_inputs[channel];
      45          18 :       DataType* ATK_RESTRICT output = outputs[channel];
      46        1170 :       for(gsl::index i = 0; i < size; ++i)
      47             :       {
      48        1152 :         temp_output = (1 - memory_factor) * input[i] * input[i] + memory_factor * temp_output;
      49        1152 :         if(temp_output > std::numeric_limits<DataType_>::epsilon())
      50             :         {
      51        1152 :           output[i] = (input[i] * input[i]) / (temp_output + std::numeric_limits<DataType_>::epsilon());
      52             :         }
      53             :         else
      54             :         {
      55           0 :           output[i] = output[i-1];
      56             :         }
      57             :       }
      58             :     }
      59          18 :   }
      60             :   
      61             : #if ATK_ENABLE_INSTANTIATION
      62             :   template class RelativePowerFilter<float>;
      63             : #endif
      64             :   template class RelativePowerFilter<double>;
      65             : }

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