LCOV - code coverage report
Current view: top level - Tools - SinusGeneratorFilter.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 39 39 100.0 %
Date: 2021-02-18 20:07:22 Functions: 9 9 100.0 %

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

Generated by: LCOV version TK-3.3.0-4-gdba42eea