Line data Source code
1 : /** 2 : * \file TriangleCheckerFilter.cpp 3 : */ 4 : 5 : #include "TriangleCheckerFilter.h" 6 : #include <ATK/Core/TypeTraits.h> 7 : 8 : #include <gtest/gtest.h> 9 : 10 : #include <cmath> 11 : #include <complex> 12 : #include <cstdint> 13 : #include <cstdlib> 14 : #include <type_traits> 15 : 16 : namespace 17 : { 18 : template<class DataType> 19 31641850 : void compare(DataType v1, DataType v2) 20 : { 21 : if constexpr(std::is_integral<DataType>::value) 22 : { 23 18874380 : ASSERT_EQ(v1, v2); 24 : } 25 : else 26 : { 27 12767470 : if(std::abs(v1) < 1e-5 || std::abs(v2) < 1e-5) 28 : { 29 6556912 : auto absv1 = std::abs(v1); 30 6556912 : auto absv2 = std::abs(v2); 31 6556912 : ASSERT_NEAR(absv1, 0, typename ATK::TypeTraits<DataType>::Scalar(1e-5)); 32 6556912 : ASSERT_NEAR(absv2, 0, typename ATK::TypeTraits<DataType>::Scalar(1e-5)); 33 : } 34 : else 35 : { 36 6210541 : auto diff = std::abs((v1 - v2) / (v1 + v2)); 37 6210541 : ASSERT_NEAR(diff, 0, typename ATK::TypeTraits<DataType>::Scalar(1e-5)); 38 : } 39 : } 40 : } 41 : } 42 : 43 : namespace ATK 44 : { 45 : template<class DataType_> 46 145 : TriangleCheckerFilter<DataType_>::TriangleCheckerFilter() 47 145 : :TypedBaseFilter<DataType_>(1, 0) 48 : { 49 145 : } 50 : 51 : template<class DataType_> 52 132 : void TriangleCheckerFilter<DataType_>::set_amplitude(DataType_ amplitude) 53 : { 54 132 : this->amplitude = amplitude; 55 132 : } 56 : 57 : template<class DataType_> 58 124 : void TriangleCheckerFilter<DataType_>::set_frequency(int frequency) 59 : { 60 124 : this->frequency = frequency; 61 124 : } 62 : 63 : template<class DataType_> 64 10568 : void TriangleCheckerFilter<DataType_>::process_impl(gsl::index size) const 65 : { 66 10568 : double real_increment = 2. / input_sampling_rate * frequency; 67 : 68 31652390 : for(gsl::index i = 0; i < size; ++i) 69 : { 70 31641850 : state += real_increment * (ascending ? 1 : -1); 71 31641850 : if(state >= 1) 72 : { 73 287748 : state -= 2 * real_increment; 74 287748 : ascending = !ascending; 75 : } 76 31354080 : else if(state <= -1) 77 : { 78 287635 : state += 2 * real_increment; 79 287635 : ascending = !ascending; 80 : } 81 31641850 : compare(converted_inputs[0][i], TypeTraits<DataType>::from_double(TypeTraits<DataType>::to_double(amplitude) * state)); 82 : } 83 10568 : } 84 : 85 : template class TriangleCheckerFilter<std::int16_t>; 86 : template class TriangleCheckerFilter<std::int32_t>; 87 : template class TriangleCheckerFilter<std::int64_t>; 88 : template class TriangleCheckerFilter<float>; 89 : template class TriangleCheckerFilter<double>; 90 : template class TriangleCheckerFilter<std::complex<float>>; 91 : template class TriangleCheckerFilter<std::complex<double>>; 92 : }