Line data Source code
1 : /** 2 : * \file SinusGeneratorFilter.cpp 3 : */ 4 : 5 : #include "SinusGeneratorFilter.h" 6 : 7 : #include <boost/math/constants/constants.hpp> 8 : 9 : #include <cmath> 10 : 11 : namespace ATK 12 : { 13 : template<typename DataType_> 14 5 : SinusGeneratorFilter<DataType_>::SinusGeneratorFilter() 15 5 : :Parent(0, 2) 16 : { 17 5 : } 18 : 19 : template<typename DataType_> 20 3 : void SinusGeneratorFilter<DataType_>::set_frequency(DataType_ frequency) 21 : { 22 3 : if(frequency <= 0) 23 : { 24 1 : throw std::out_of_range("Frequency must be strictly positive"); 25 : } 26 2 : this->frequency = frequency; 27 2 : this->frequ_cos = std::cos(2 * boost::math::constants::pi<DataType_>() * frequency / output_sampling_rate); 28 2 : this->frequ_sin = std::sin(2 * boost::math::constants::pi<DataType_>() * frequency / output_sampling_rate); 29 2 : } 30 : 31 : template<typename DataType_> 32 1 : DataType_ SinusGeneratorFilter<DataType_>::get_frequency() const 33 : { 34 1 : return frequency; 35 : } 36 : 37 : template<typename DataType_> 38 1 : void SinusGeneratorFilter<DataType_>::set_volume(DataType_ volume) 39 : { 40 1 : this->volume = volume; 41 1 : } 42 : 43 : template<typename DataType_> 44 1 : DataType_ SinusGeneratorFilter<DataType_>::get_volume() const 45 : { 46 1 : return volume; 47 : } 48 : 49 : template<typename DataType_> 50 1 : void SinusGeneratorFilter<DataType_>::set_offset(DataType_ offset) 51 : { 52 1 : this->offset = offset; 53 1 : } 54 : 55 : template<typename DataType_> 56 1 : DataType_ SinusGeneratorFilter<DataType_>::get_offset() const 57 : { 58 1 : return offset; 59 : } 60 : 61 : template<typename DataType_> 62 1 : void SinusGeneratorFilter<DataType_>::full_setup() 63 : { 64 1 : Parent::full_setup(); 65 1 : cos = 1; 66 1 : sin = 0; 67 1 : } 68 : 69 : template<typename DataType_> 70 1 : void SinusGeneratorFilter<DataType_>::process_impl(gsl::index size) const 71 : { 72 1 : DataType* ATK_RESTRICT output_cos = outputs[0]; 73 1 : DataType* ATK_RESTRICT output_sin = outputs[1]; 74 : 75 1025 : for(gsl::index i = 0; i < size; ++i) 76 : { 77 1024 : auto new_cos = cos * frequ_cos - sin * frequ_sin; 78 1024 : auto new_sin = cos * frequ_sin + sin * frequ_cos; 79 1024 : auto norm = (new_cos * new_cos + new_sin * new_sin); 80 : 81 1024 : cos = new_cos / norm; 82 1024 : sin = new_sin / norm; 83 : 84 1024 : output_cos[i] = volume * cos + offset; 85 1024 : output_sin[i] = volume * sin + offset; 86 : } 87 1 : } 88 : 89 : #if ATK_ENABLE_INSTANTIATION 90 : template class SinusGeneratorFilter<float>; 91 : #endif 92 : template class SinusGeneratorFilter<double>; 93 : }