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