Line data Source code
1 : /** 2 : * \file ChamberlinFilter.cpp 3 : */ 4 : 5 : #include "ChamberlinFilter.h" 6 : 7 : #include <boost/math/constants/constants.hpp> 8 : 9 : namespace ATK 10 : { 11 : template<typename DataType> 12 12 : ChamberlinFilter<DataType>::ChamberlinFilter() 13 12 : :TypedBaseFilter<DataType>(1, 1) 14 : { 15 12 : } 16 : 17 : template<typename DataType_> 18 10 : void ChamberlinFilter<DataType_>::set_cut_frequency(CoeffDataType cutoff_frequency) 19 : { 20 10 : this->cutoff_frequency = cutoff_frequency; 21 10 : setup(); 22 10 : } 23 : 24 : template<typename DataType_> 25 1 : typename ChamberlinFilter<DataType_>::CoeffDataType ChamberlinFilter<DataType_>::get_cut_frequency() const 26 : { 27 1 : return cutoff_frequency; 28 : } 29 : 30 : template<typename DataType_> 31 1 : void ChamberlinFilter<DataType_>::set_attenuation(CoeffDataType attenuation) 32 : { 33 1 : this->attenuation = attenuation; 34 1 : setup(); 35 1 : } 36 : 37 : template<typename DataType_> 38 1 : typename ChamberlinFilter<DataType_>::CoeffDataType ChamberlinFilter<DataType_>::get_attenuation() const 39 : { 40 1 : return attenuation; 41 : } 42 : 43 : template<typename DataType> 44 10 : void ChamberlinFilter<DataType>::select(int selection) 45 : { 46 10 : this->selected = selection; 47 10 : } 48 : 49 : template<typename DataType> 50 1 : int ChamberlinFilter<DataType>::get_selected() const 51 : { 52 1 : return selected; 53 : } 54 : 55 : template<typename DataType> 56 29 : void ChamberlinFilter<DataType>::setup() 57 : { 58 29 : numerical_frequency = 2 * std::sin(boost::math::constants::pi<DataType>() * cutoff_frequency / input_sampling_rate); 59 29 : numerical_attenuation = 2 * attenuation; 60 29 : } 61 : 62 : template<typename DataType> 63 18 : void ChamberlinFilter<DataType>::process_impl(gsl::index size) const 64 : { 65 18 : const DataType* ATK_RESTRICT input = converted_inputs[0]; 66 18 : DataType* ATK_RESTRICT output = outputs[0]; 67 1179670 : for(gsl::index i = 0; i < size; ++i) 68 : { 69 1179650 : yh = input[i] - yl - numerical_attenuation * yb; 70 1179650 : yb = numerical_frequency * yh + yb; 71 1179650 : yl = numerical_frequency * yb + yl; 72 1179650 : if(selected == 0) 73 : { 74 393216 : output[i] = yl; 75 : } 76 786432 : else if(selected == 1) 77 : { 78 393216 : output[i] = yb; 79 : } 80 : else 81 : { 82 393216 : output[i] = yh; 83 : } 84 : } 85 18 : } 86 : 87 : #if ATK_ENABLE_INSTANTIATION 88 : template class ChamberlinFilter<float>; 89 : #endif 90 : template class ChamberlinFilter<double>; 91 : }