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